文件路径:/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 = “悟空” 的缓存的值:
另外也可以通过客户端工具来查看,如下图所示:
我下载的是这个软件: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 工具进行测试:
通过多次测试,第一次请求会稍微慢点,后面几次速度非常快。说明使用缓存后性能有提升。
另外我们用 Redis 客户端看下结果:
Redis key = typeEntityList,Redis value 是一个 JSON 字符串,里面的内容是题目分类列表。
三、缓存穿透、雪崩、击穿高并发下使用缓存会带来的几个问题:缓存穿透、雪崩、击穿。
3.1 缓存穿透 3.1.1 缓存穿透的概念