🧸欢迎来到dream_ready的博客,📜相信您对博主首页也很感兴趣o (ˉ▽ˉ;)
📜redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿
目录
1、引入依赖
2、对 Redis 的配置文件进行书写
3、Spring中使用 StringRedisTemplate 这个类操作数据库
4、对set 和 get 相关命令举例
5、Spring 中没有封装的命令
6、对 List 相关命令举例
7、对 Set 相关命令举例
8、对 Hash 相关命令操作
9、对 ZSet 进行操作
10、注:学习此篇博客方法
1、引入依赖
创建 Spring 项目时,一定要引入这个依赖
这是操作 redis 的依赖
2、对 Redis 的配置文件进行书写
这里以演示本地连接为例,若想本地操作远程服务器的redis,则要进行更为麻烦的配置,此处就不再展示了,毕竟本文主题是教大家spring如何操作redis
注:若redis配置的有密码,或者想要使用某个固定的数据源,也可以增加下面两个配置
当然,还可以增加其他的连接配置,大家可以自行搜索,这里讲的这几个绝对够大家基础使用了!!!
3、Spring中使用 StringRedisTemplate 这个类操作数据库
需要注意的是,操作redis的方法很多,除了 StringRedisTemplate 外,还有 Jedis 等等都可以操作redis,此处主要讲解以 StringRedisTemplate 的方式操作redis,读者若想了解其他操作redis的方式,也可以查询相关资料自行学习
首先,使用 @Autowired 注解将这个类注入该类
- 使用Jedis,是通过 Jedis 对象里的各种方法来操作 redis 的
- 此处 Spring 中是通过 StringRedisTemplate 来操作redis的
- 最原始提供的类是 RedisTemplate
- StringRedisTemplate 是 RedisTemplate 的子类,专门用来处理 文本数据的
- 这个类提供的方法,相比于之前的 Jedis 中的各种方法,还是存在较大的差异的!!!
可以看到,此处就与 Jedis 不同了,又多了一层,主要是选择对应数据类型的类,然后再选操作方法
此处以 对value操作的相关方法举例:
可以看到,有get、set等多种不同方法的操作方法以满足我们的需求
4、对set 和 get 相关命令举例
@GetMapping("/testString")
@ResponseBody
public String testString() {
// 先清除之前的数据
redisTemplate.execute((RedisConnection connection) -> {
// execute 要求回调方法中必须写 return 语句,返回个东西
// 这个回调返回的对象,就会作为 execute 本身的返回值
connection.flushAll();
return null;
});
redisTemplate.opsForValue().set("key", "111");
redisTemplate.opsForValue().set("key2", "222");
redisTemplate.opsForValue().set("key3", "333");
String value = redisTemplate.opsForValue().get("key");
System.out.println("value: " + value);
return "OK";
}
5、Spring 中没有封装的命令
有些命令 Spring 没有封装,这时咱就要用 Redis 原生的命令进行操作了,通过 excute 方法就可以使用 Redis 原生的命令了
这里的 RedisConnection 就代表了 Redis 连接,对标 Jedis 对象
以 flushall 举例:
6、对 List 相关命令举例
@GetMapping("/testList")
@ResponseBody
public String testList() {
// 先清除之前的数据
redisTemplate.execute((RedisConnection connection) -> {
// execute 要求回调方法中必须写 return 语句,返回个东西
// 这个回调返回的对象,就会作为 execute 本身的返回值
connection.flushAll();
return null;
});
redisTemplate.opsForList().leftPush("key", "111");
redisTemplate.opsForList().leftPush("key", "222");
redisTemplate.opsForList().leftPush("key", "333");
String value = redisTemplate.opsForList().rightPop("key");
System.out.println("value:" + value);
value = redisTemplate.opsForList().rightPop("key");
System.out.println("value:" + value);
value = redisTemplate.opsForList().rightPop("key");
System.out.println("value:" + value);
return "OKList";
}
7、对 Set 相关命令举例
@GetMapping("/testSet")
@ResponseBody
public String testSet() {
// 先清除之前的数据
redisTemplate.execute((RedisConnection connection) -> {
// execute 要求回调方法中必须写 return 语句,返回个东西
// 这个回调返回的对象,就会作为 execute 本身的返回值
connection.flushAll();
return null;
});
redisTemplate.opsForSet().add("key", "111", "222", "333");
Set<String> result = redisTemplate.opsForSet().members("key");
System.out.println("result:" + result);
Boolean exists = redisTemplate.opsForSet().isMember("key", "111");
System.out.println("exists:" + exists);
Long count = redisTemplate.opsForSet().size("key");
System.out.println("count:" + count);
redisTemplate.opsForSet().remove("key", "111", "222");
result = redisTemplate.opsForSet().members("key");
System.out.println("result:" + result);
return "OKSet";
}
8、对 Hash 相关命令操作
@GetMapping("/testHash")
@ResponseBody
public String testHash() {
// 先清除之前的数据
redisTemplate.execute((RedisConnection connection) -> {
// execute 要求回调方法中必须写 return 语句,返回个东西
// 这个回调返回的对象,就会作为 execute 本身的返回值
connection.flushAll();
return null;
});
redisTemplate.opsForHash().put("key", "f1", "111");
redisTemplate.opsForHash().put("key", "f2", "222");
redisTemplate.opsForHash().put("key", "f3", "333");
String value = (String) redisTemplate.opsForHash().get("key", "f1");
System.out.println("value:" + value);
Boolean exists = redisTemplate.opsForHash().hasKey("key", "f1");
System.out.println("exist:" + exists);
redisTemplate.opsForHash().delete("key", "f1", "f2");
Long size = redisTemplate.opsForHash().size("key");
System.out.println("size:" + size);
return "OKHash";
}
9、对 ZSet 进行操作
@GetMapping("/testZSet")
@ResponseBody
public String testZSet() {
redisTemplate.execute((RedisConnection connection) -> {
connection.flushAll();
return null;
});
redisTemplate.opsForZSet().add("key", "zhangsan", 10);
redisTemplate.opsForZSet().add("key", "lisi", 20);
redisTemplate.opsForZSet().add("key", "wangwu", 30);
Set<String> members = redisTemplate.opsForZSet().range("key", 0, -1);
System.out.println("members:" + members);
Set<ZSetOperations.TypedTuple<String>> membersWithScore = redisTemplate.opsForZSet().rangeWithScores("key", 0 ,-1);
System.out.println("membersWithScore:" + membersWithScore);
Double score = redisTemplate.opsForZSet().score("key", "zhangsan");
System.out.println("score:" + score);
redisTemplate.opsForZSet().remove("key", "zhangsan");
Long size = redisTemplate.opsForZSet().size("key");
System.out.println("size:" + size);
Long rank = redisTemplate.opsForZSet().rank("key", "lisi");
System.out.println("rank:" + rank);
return "OKZSet";
}
10、注:学习此篇博客方法
此篇博客上的代码为对某种数据类型整体操作的方法,是一连串的,并没有再拆开来细讲每一行代码的作用
大家可以使用gpt将每段我的代码发过去,让gpt生成更加详细的注释,这样学习事半功倍!!!
🧸前路漫漫,愿星光与您相伴!