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
官方文档
- 官网操作命令指南页面:https://redis.io/docs/latest/commands/?name=get&group=string
- Redis cluster specification
说明
- 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: 0host: 192.168.145.132port: 6379password: 123456lettuce:pool:max-active: 8max-wait: -1msmax-idle: 8min-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 -
添加接口
OrderService
public interface OrderService {void addOrder();String getOrderById(Integer keyId); }
-
添加实现类
OrderServiceImpl
@Service public class OrderServiceImpl implements OrderService {public static final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class);@Autowiredprivate RedisTemplate redisTemplate;@Overridepublic 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);}@Overridepublic 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 {@Autowiredprivate OrderService orderService;@GetMapping("add")public void addOrder() {orderService.addOrder();}@GetMappingpublic 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.StringRedisTemplate
public 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 {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// 设置key序列化方式stringredisTemplate.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形式,获取旧数据时可能会报错