RedisTemplate的使用与注意事项小结
作者:luming.02
一.什么是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
首先要导入相关依赖
<!--Redis依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
<!--连接池依赖--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.11.1</version> </dependency>
导入相关依赖之后,通过配置文件 application.yml 进行配置,由于 RedisTemplate 是整合的Lettuce和Jedis,因此在配置连接池的时候需要进行选择是使用Lettuce还是Jedis(默认是Lettuce)
spring: data: redis: host: Redis所在主机地址 port: Redis对应端口号默认6379 password: 密码 lettuce: pool: max-active: 最大连接数 max-wait: 等待时长 max-idle: 最大空闲连接 min-idle: 最小空闲连接
在配置完成后,通过依赖注入就可以直接使用
@Autowired private RedisTemplate redisTemplate; @Test void testCode() { String checheCode = "cheche_code"; String code = "168901"; //写入Redis redisTemplate.opsForValue().set(checheCode, code); //读出Redis Object o = redisTemplate.opsForValue().get(checheCode); System.out.println("验证码为" + o); }
运行结果:
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管理,之后在调用该对象的时候就会自动选择我们配置的这个
@Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { //创建RedisTemplate对象 RedisTemplate<String, Object> template = new RedisTemplate<>(); //设置连接工厂 template.setConnectionFactory(connectionFactory); //创建JSON序列化工具 GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer(); //设置key的序列化 template.setKeySerializer(RedisSerializer.string()); template.setHashValueSerializer(RedisSerializer.string()); //设置value的序列化 template.setValueSerializer(jsonSerializer); template.setHashValueSerializer(jsonSerializer); return template; } }
对于JSON序列化工具,我们也需要引入依赖:
<!--jackson依赖--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.1</version> </dependency>
我们再次打开测试观察结果:
@SpringBootTest class RedisDemoApplicationTests { @Autowired private RedisTemplate<String, Object> redisTemplate; @Test void testCode() { String checheCode = "cheche_code"; String code = "168901"; //写入Redis redisTemplate.opsForValue().set(checheCode, code); //读出Redis Object o = redisTemplate.opsForValue().get(checheCode); System.out.println("验证码为" + o); } }
我们可以发现数据已经正常显示出来了
三.StringRedisTemplate
由于存储在 Redis 中的 key 和 value 通常是很常见的 String 类型,Redis模块提供了 RedisConnection 和 RedisTemplate 的扩展,分是 StringRedisConnection 和 StringRedisTemplate,作为字符串操作的解决方案。
打开源码我们可以看见对于Key、Value、HashKey、HashValue都是进行String类型的序列化。
因此对于一些复杂类型,如对象在StringRedisTemplate的时候往往需要自己手动序列化将对象转为JSON再存入Redis。
到此这篇关于RedisTemplate的使用与注意事项小结的文章就介绍到这了,更多相关RedisTemplate使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!