【Redis系列】RedisTemplate的使用与留意事项

打印 上一主题 下一主题

主题 523|帖子 523|积分 1569



目录
一.什么是RedisTemplate
二.怎样使用RedisTemplate
RedisTemplate的API
序列化
三.StringRedisTemplate


一.什么是RedisTemplate

RedisTemplate 是一个工具类,由 Spring 官方提供的方便操作 Redis 数据库的一个工具类,泉源于 org.springframework.data.redis.core 包下。其本质属于 Spring-Data 模块下的 Spring-Data-Redis 部分,它提供了从 Spring 应用步伐轻松配置和访问 Redis的功能。

Spring-Data-Redis 是通过整合Lettuce和Jedis这俩种Redis客户端产生的,对外则提供了RedisTemplate这样统一的API来供调用者访问。它既支持Luttuce的相应式编程也支持JDK中集合的实现。
二.怎样使用RedisTemplate

首先要导入相关依赖
  1.         <!--Redis依赖-->
  2.         <dependency>
  3.             <groupId>org.springframework.boot</groupId>
  4.             <artifactId>spring-boot-starter-data-redis</artifactId>
  5.         </dependency>
复制代码
  1.         <!--连接池依赖-->
  2.         <dependency>
  3.             <groupId>org.apache.commons</groupId>
  4.             <artifactId>commons-pool2</artifactId>
  5.             <version>2.11.1</version>
  6.         </dependency>
复制代码
导入相关依赖之后,通过配置文件 application.yml 进行配置,由于 RedisTemplate 是整合的Lettuce和Jedis,因此在配置连接池的时间需要进行选择是使用Lettuce还是Jedis(默认是Lettuce)
  1. spring:
  2.   data:
  3.     redis:
  4.       host: Redis所在主机地址
  5.       port: Redis对应端口号默认6379
  6.       password: 密码
  7.       lettuce:
  8.         pool:
  9.           max-active: 最大连接数
  10.           max-wait: 等待时长
  11.           max-idle: 最大空闲连接
  12.           min-idle: 最小空闲连接
复制代码
在配置完成后,通过依赖注入就可以直接使用
  1.     @Autowired
  2.     private RedisTemplate redisTemplate;
  3.    
  4.     @Test
  5.     void testCode() {
  6.         String checheCode = "cheche_code";
  7.         String code = "168901";
  8.         //写入Redis
  9.         redisTemplate.opsForValue().set(checheCode, code);
  10.         //读出Redis
  11.         Object o = redisTemplate.opsForValue().get(checheCode);
  12.         System.out.println("验证码为" + o);
  13.     }
复制代码
运行结果:

RedisTemplate的API

RedisTemplate 提供了丰富的方法来实现对 Redis 的各种操作,包括但不限于字符串、哈希、列表、集合和有序集合等数据布局的操作。以下是一些常用的 RedisTemplate API:
字符串操作


  • opsForValue().set(key, value): 设置字符串值。
  • opsForValue().get(key): 获取字符串值。
  • opsForValue().incr(key): 字符串值自增。
  • opsForValue().decr(key): 字符串值自减。
哈希操作


  • opsForHash().getOperations().put(key, hashKey, value): 向哈希中添加键值对。
  • opsForHash().getOperations().get(key, hashKey): 获取哈希中的值。
  • opsForHash().getOperations().entries(key): 获取哈希中的全部键值对。
列表操作


  • opsForList().leftPush(key, value): 从列表左侧添加元素。
  • opsForList().rightPush(key, value): 从列表右侧添加元素。
  • opsForList().leftPop(key): 从列表左侧弹出元素。
  • opsForList().rightPop(key): 从列表右侧弹出元素。
集合操作


  • opsForSet().add(key, value): 向集合中添加元素。
  • opsForSet().members(key): 获取集合中的全部元素。
  • opsForSet().remove(key, value): 从集合中移除元素。
有序集合操作


  • opsForZSet().add(key, value, score): 向有序集合中添加元素,并指定分数。
  • opsForZSet().range(key, start, end): 获取有序集合中指定分数范围内的元素。
  • opsForZSet().removeRangeByScore(key, minScore, maxScore): 按分数范围移除有序集合中的元素。
键操作


  • delete(key): 删除键。
  • hasKey(key): 检查键是否存在。
  • keys(pattern): 根据模式匹配获取全部键。
事务


  • multi(): 开启事务。
  • exec(): 提交事务。
发布/订阅


  • convertAndSend(channel, message): 发布消息。
  • subscribe(RedisMessageListenerContainer, MessageListener): 订阅消息。
连接受理


  • getConnectionFactory(): 获取连接工厂。
  • getExecutor(): 获取执行器。
序列化


  • setKeySerializer(Serializer): 设置键的序列化器。
  • setValueSerializer(Serializer): 设置值的序列化器。
更多操作可以查看官方提供的API文档:RedisTemplate (Spring Data Redis 3.3.2 API)
序列化

我们打开Redis图形化工具查看一下刚才的验证码会发现刚才存入的验证码酿成了一堆乱码

这是由于Redis的序列化并没有按照我们预期的进行转化,我们需要本身去重写一个序列化,如下将key设置为String类型、value设置为json类型,最后将这个对象交给Spring管理,之后在调用该对象的时间就会主动选择我们配置的这个
  1. @Configuration
  2. public class RedisConfig {
  3.    
  4.     @Bean
  5.     public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
  6.         //创建RedisTemplate对象
  7.         RedisTemplate<String, Object> template = new RedisTemplate<>();
  8.         //设置连接工厂
  9.         template.setConnectionFactory(connectionFactory);
  10.         //创建JSON序列化工具
  11.         GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer();
  12.         //设置key的序列化
  13.         template.setKeySerializer(RedisSerializer.string());
  14.         template.setHashValueSerializer(RedisSerializer.string());
  15.         //设置value的序列化
  16.         template.setValueSerializer(jsonSerializer);
  17.         template.setHashValueSerializer(jsonSerializer);
  18.         return template;
  19.     }
  20. }
复制代码
对于JSON序列化工具,我们也需要引入依赖:
  1.         <!--jackson依赖-->
  2.         <dependency>
  3.             <groupId>com.fasterxml.jackson.core</groupId>
  4.             <artifactId>jackson-databind</artifactId>
  5.             <version>2.17.1</version>
  6.         </dependency>
复制代码
我们再次打开测试观察结果:
  1. @SpringBootTest
  2. class RedisDemoApplicationTests {
  3.    
  4.     @Autowired
  5.     private RedisTemplate<String, Object> redisTemplate;
  6.    
  7.     @Test
  8.     void testCode() {
  9.         String checheCode = "cheche_code";
  10.         String code = "168901";
  11.         //写入Redis
  12.         redisTemplate.opsForValue().set(checheCode, code);
  13.         //读出Redis
  14.         Object o = redisTemplate.opsForValue().get(checheCode);
  15.         System.out.println("验证码为" + o);
  16.     }
  17. }
复制代码
我们可以发现数据已经正常显示出来了

三.StringRedisTemplate

由于存储在 Redis 中的 key 和 value 通常是很常见的 String 类型,Redis模块提供了 RedisConnection 和 RedisTemplate 的扩展,分是 StringRedisConnection 和 StringRedisTemplate,作为字符串操作的办理方案。
打开源码我们可以瞥见对于Key、Value、HashKey、HashValue都是进行String类型的序列化。

因此对于一些复杂类型,如对象在StringRedisTemplate的时间往往需要本身手动序列化将对象转为JSON再存入Redis。



 本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎各人三连支持,你们的点赞就是博主更新最大的动力!
如有差别意见,欢迎评论区积极讨论交换,让我们一起学习进步!
有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

九天猎人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表