# 20 图 |6000 字 |实战缓存(上篇) (2)

文件路径:/passjava-question/pom.xml

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2.3 测试 Redis

我们可以写一个测试方法来测试引入的 redis 是否能存数据,以及能否查出存的数据。

我们都是使用 StringRedisTemplate 库来操作 Redis,所以可以自动装载下 StringRedisTemplate。

@Autowired StringRedisTemplate stringRedisTemplate;

然后在测试方法中,测试存储方法:ops.set(),以及 查询方法:ops.get()

@Test public void TestStringRedisTemplate() { // 初始化 redis 组件 ValueOperations<String, String> ops = stringRedisTemplate.opsForValue(); // 存储数据 ops.set("悟空", "悟空聊架构_" + UUID.randomUUID().toString()); // 查询数据 String wukong = ops.get("悟空"); System.out.println(wukong); }

set 方法的第一个参数是 key,比如示例中的 “悟空”。

get 方法的参数也是 key。

最后打印出了 redis 中 key = “悟空” 的缓存的值:

# 20 图 |6000 字 |实战缓存(上篇)

另外也可以通过客户端工具来查看,如下图所示:

# 20 图 |6000 字 |实战缓存(上篇)

我下载的是这个软件:Redis Desktop Manager windows下载地址:

2.4 用 Redis 改造业务逻辑

用 redis 替换 hashmap 也不难,把用到hashmap 到都用 redis 改下。另外需要注意的是:

从数据库中查询到的数据先要序列化成 JSON 字符串后再存入到 Redis 中,从 Redis 中查询数据时,也需要将 JSON 字符串反序列化为对象实例。

public List<TypeEntity> getTypeEntityList() { // 1.初始化 redis 组件 ValueOperations<String, String> ops = stringRedisTemplate.opsForValue(); // 2.从缓存中查询数据 String typeEntityListCache = ops.get("typeEntityList"); // 3.如果缓存中没有数据 if (StringUtils.isEmpty(typeEntityListCache)) { System.out.println("The cache is empty"); // 4.从数据库中查询数据 List<TypeEntity> typeEntityListFromDb = this.list(); // 5.将从数据库中查询出的数据序列化 JSON 字符串 typeEntityListCache = JSON.toJSONString(typeEntityListFromDb); // 6.将序列化后的数据存入缓存中 ops.set("typeEntityList", typeEntityListCache); return typeEntityListFromDb; } // 7.如果缓存中有数据,则从缓存中拿出来,并反序列化为实例对象 List<TypeEntity> typeEntityList = JSON.parseObject(typeEntityListCache, new TypeReference<List<TypeEntity>>(){}); return typeEntityList; }

整个流程如下:

1.初始化 redis 组件。

2.从缓存中查询数据。

3.如果缓存中没有数据,执行步骤 4、5、6。

4.从数据库中查询数据

5.将从数据库中查询出的数据转化为 JSON 字符串

6.将序列化后的数据存入缓存中,并返回数据库中查询到的数据。

7.如果缓存中有数据,则从缓存中拿出来,并反序列化为实例对象

2.5 测试业务逻辑

我们还是用 postman 工具进行测试:

# 20 图 |6000 字 |实战缓存(上篇)

通过多次测试,第一次请求会稍微慢点,后面几次速度非常快。说明使用缓存后性能有提升。

另外我们用 Redis 客户端看下结果:

Redis key = typeEntityList,Redis value 是一个 JSON 字符串,里面的内容是题目分类列表。

# 20 图 |6000 字 |实战缓存(上篇)

三、缓存穿透、雪崩、击穿

高并发下使用缓存会带来的几个问题:缓存穿透、雪崩、击穿。

3.1 缓存穿透 3.1.1 缓存穿透的概念

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwpzf.html