springboot整合redis-RedisTemplate单机模式
springboot整合redis-RedisTemplate单机模式
文档
- redis单机安装
- redis常用的五种数据类型
- redis数据类型-位图bitmap
- redis数据类型-基数统计HyperLogLog
- redis数据类型-地理空间GEO
- redis数据类型-流Stream
- redis数据类型-位域bitfield
- redis持久化-RDB
- redis持久化-AOF
- redis持久化-RDB+AOF混合模式
- redis持久化-纯缓存模式
- redis事务
- redis管道 -redis pipeline -redis pipelining
- redis发布订阅
- redis主从复制
- redis哨兵模式
- redis集群模式 -分区算法
- redis集群模式 -集群搭建
- redis集群模式 -节点故障 -节点主从调整
- redis集群模式 -扩缩容
- redis集群模式 -批量操作
- springboot整合redis-Jedis
- springboot整合redis-Lettuce
官方文档
说明
- redis版本:7.0.0
- springboot版本:3.2.0
springboot整合redis-RedisTemplate单机模式
安装单机版redis
- 安装单机版redis参考文档:redis单机安装
引入依赖
-
引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>- 版本号:
3.2.0,与springboot版本一致
- 版本号:
配置连接信息
-
修改
application.yml配置文件spring: data: redis: database: 0 host: 192.168.145.132 port: 6379 password: 123456 lettuce: pool: max-active: 8 max-wait: -1ms max-idle: 8 min-idle: 0 -
在配置中,默认生效的
spring.data.redis.client-type为lettuce -
启动服务默认加载的
RedisTemplate、StringRedisTemplate的Bean对象,使用的RedisConnectionFactory为LettuceConnectionFactory实现类对象。自定义RedisTemplate的Bean时,也使用LettuceConnectionFactory。参考:org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
示例
-
启动springboot服务,通过注入
RedisTemplate的对象来操作reids -
添加接口
OrderServicepublic interface OrderService { void addOrder(); String getOrderById(Integer keyId); } -
添加实现类
OrderServiceImpl@Service public class OrderServiceImpl implements OrderService { public static final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class); @Autowired private RedisTemplate redisTemplate; @Override public void addOrder() { int keyId = ThreadLocalRandom.current().nextInt(1000) + 1; String serialNo = UUID.randomUUID().toString(); String key = "order:" + keyId; String value = "order:" + serialNo; redisTemplate.opsForValue().set(key, value); logger.info("redis key: {}", key); logger.info("redis value: {}", value); String key1 = "order订单:" + keyId; String value1 = "order内容:" + serialNo; redisTemplate.opsForValue().set(key1, value1); logger.info("redis key: {}", key1); logger.info("redis value: {}", value1); } @Override public String getOrderById(Integer keyId) { String key = "order:" + keyId; String value = (String) redisTemplate.opsForValue().get(key); logger.info("redis key: {}", key); logger.info("redis value: {}", value); String key1 = "order订单:" + keyId; String value1 = (String) redisTemplate.opsForValue().get(key1); logger.info("redis key: {}", key1); logger.info("redis value: {}", value1); return value; } } -
添加Controller类
OrderController@RestController @RequestMapping("order") public class OrderController { @Autowired private OrderService orderService; @GetMapping("add") public void addOrder() { orderService.addOrder(); } @GetMapping public String getOrderById(@RequestParam("keyId") Integer keyId) { return orderService.getOrderById(keyId); } }
使用RedisTemplate产生的序列化问题
-
当
OrderServiceImpl类中注入的是RedisTemplate,并且没有泛型,将出现序列化问题@Autowired private RedisTemplate redisTemplate; -
调用接口
http://localhost:8080/redis01/order/add,redis设置key、value,控制台打印日志如下:2025-10-19T16:23:01.573+08:00 INFO 3176 --- [nio-8080-exec-5] x.y.r.service.impl.OrderServiceImpl : redis key: order:966 2025-10-19T16:23:01.573+08:00 INFO 3176 --- [nio-8080-exec-5] x.y.r.service.impl.OrderServiceImpl : redis value: order:1db5b3cc-dac2-4cdc-952f-2800a887249f 2025-10-19T16:23:01.574+08:00 INFO 3176 --- [nio-8080-exec-5] x.y.r.service.impl.OrderServiceImpl : redis key: order订单:966 2025-10-19T16:23:01.575+08:00 INFO 3176 --- [nio-8080-exec-5] x.y.r.service.impl.OrderServiceImpl : redis value: order内容:1db5b3cc-dac2-4cdc-952f-2800a887249f -
调用接口
http://localhost:8080/redis01/order?keyId=966,根据redis的key获取value,控制台打印日志如下:2025-10-19T16:24:04.086+08:00 INFO 3176 --- [nio-8080-exec-7] x.y.r.service.impl.OrderServiceImpl : redis key: order:966 2025-10-19T16:24:04.086+08:00 INFO 3176 --- [nio-8080-exec-7] x.y.r.service.impl.OrderServiceImpl : redis value: order:1db5b3cc-dac2-4cdc-952f-2800a887249f 2025-10-19T16:24:04.086+08:00 INFO 3176 --- [nio-8080-exec-7] x.y.r.service.impl.OrderServiceImpl : redis key: order订单:966 2025-10-19T16:24:04.086+08:00 INFO 3176 --- [nio-8080-exec-7] x.y.r.service.impl.OrderServiceImpl : redis value: order内容:1db5b3cc-dac2-4cdc-952f-2800a887249f -
从日志可以看出,并不是中文乱码导致的问题
-
在redis命令行,使用命令
./redis-cli -p 6379 -a 123456查看127.0.0.1:6379> keys * 1) "\xac\xed\x00\x05t\x00\x0forder\xe8\xae\xa2\xe5\x8d\x95:966" 2) "\xac\xed\x00\x05t\x00\torder:966" 127.0.0.1:6379> get "\xac\xed\x00\x05t\x00\x0forder\xe8\xae\xa2\xe5\x8d\x95:966" "\xac\xed\x00\x05t\x000order\xe5\x86\x85\xe5\xae\xb9:1db5b3cc-dac2-4cdc-952f-2800a887249f" 127.0.0.1:6379> -
在redis命令行,使用命令
./redis-cli -p 6379 -a 123456 --raw查看127.0.0.1:6379> keys * ¬쳯rder订单:966 ¬ order:966 127.0.0.1:6379> get "\xac\xed\x00\x05t\x00\x0forder订单:966" ¬첰order内容:1db5b3cc-dac2-4cdc-952f-2800a887249f -
从命令行可以看出,中文是可以正常显示的
-
可以看出,使用
RedisTemplate,会在key和value上都增加了前缀\xac\xed\x00\x05t\x00,这是序列化问题导致的 -
如果
OrderServiceImpl类中注入的是RedisTemplate<String, String>,有String泛型,则该注入的对象为StringRedisTemplate类型,可以解决序列化问题@Autowired private RedisTemplate<String, String> redisTemplate;
使用StringRedisTemplate解决序列化问题
-
如果
OrderServiceImpl类中注入的是StringRedisTemplate,可以解决序列化问题@Autowired private StringRedisTemplate redisTemplate; -
StringRedisTemplate重写了序列化方法,参考:org.springframework.data.redis.core.StringRedisTemplatepublic StringRedisTemplate() { this.setKeySerializer(RedisSerializer.string()); this.setValueSerializer(RedisSerializer.string()); this.setHashKeySerializer(RedisSerializer.string()); this.setHashValueSerializer(RedisSerializer.string()); }
自定义RedisTemplate的Bean
-
自定义
RedisTemplate的Bean后,默认的RedisTemplate的Bean将失效 -
添加配置类
RedisConfig,自定义RedisTemplate的Bean@Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); // 设置key序列化方式string redisTemplate.setKeySerializer(new StringRedisSerializer()); // 设置value的序列化方式json,使用GenericJackson2JsonRedisSerializer替换默认序列化 redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; } }- 这里使用的
RedisConnectionFactory为LettuceConnectionFactory实现类对象
- 这里使用的
-
此时
OrderServiceImpl类中注入RedisTemplate对象为自定义的Bean@Autowired private RedisTemplate redisTemplate; -
注意,自定义的
RedisTemplate改变了序列化方式,比如value序列化方法变成了json形式,获取旧数据时可能会报错
更多推荐




所有评论(0)