springboot整合redis-RedisTemplate单机模式

文档

  1. redis单机安装
  2. redis常用的五种数据类型
  3. redis数据类型-位图bitmap
  4. redis数据类型-基数统计HyperLogLog
  5. redis数据类型-地理空间GEO
  6. redis数据类型-流Stream
  7. redis数据类型-位域bitfield
  8. redis持久化-RDB
  9. redis持久化-AOF
  10. redis持久化-RDB+AOF混合模式
  11. redis持久化-纯缓存模式
  12. redis事务
  13. redis管道 -redis pipeline -redis pipelining
  14. redis发布订阅
  15. redis主从复制
  16. redis哨兵模式
  17. redis集群模式 -分区算法
  18. redis集群模式 -集群搭建
  19. redis集群模式 -节点故障 -节点主从调整
  20. redis集群模式 -扩缩容
  21. redis集群模式 -批量操作
  22. springboot整合redis-Jedis
  23. springboot整合redis-Lettuce

官方文档

  1. 官网操作命令指南页面:https://redis.io/docs/latest/commands/?name=get&group=string
  2. Redis cluster specification

说明

  1. redis版本:7.0.0
  2. springboot版本:3.2.0

springboot整合redis-RedisTemplate单机模式

安装单机版redis
  1. 安装单机版redis参考文档:redis单机安装
引入依赖
  1. 引入依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
    • 版本号:3.2.0,与springboot版本一致
配置连接信息
  1. 修改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
    
  2. 在配置中,默认生效的spring.data.redis.client-typelettuce

  3. 启动服务默认加载的RedisTemplateStringRedisTemplate的Bean对象,使用的RedisConnectionFactoryLettuceConnectionFactory实现类对象。自定义RedisTemplate的Bean时,也使用LettuceConnectionFactory。参考:org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration

示例
  1. 启动springboot服务,通过注入RedisTemplate的对象来操作reids

  2. 添加接口OrderService

    public interface OrderService {
    
        void addOrder();
    
        String getOrderById(Integer keyId);
    }
    
  3. 添加实现类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;
        }
    }
    
  4. 添加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产生的序列化问题
  1. OrderServiceImpl类中注入的是RedisTemplate,并且没有泛型,将出现序列化问题

    @Autowired
    private RedisTemplate redisTemplate;
    
  2. 调用接口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
    
  3. 调用接口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
    
  4. 从日志可以看出,并不是中文乱码导致的问题

  5. 在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> 
    
  6. 在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
    
  7. 从命令行可以看出,中文是可以正常显示的

  8. 可以看出,使用RedisTemplate,会在key和value上都增加了前缀\xac\xed\x00\x05t\x00,这是序列化问题导致的

  9. 如果OrderServiceImpl类中注入的是RedisTemplate<String, String>,有String泛型,则该注入的对象为StringRedisTemplate类型,可以解决序列化问题

    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    
使用StringRedisTemplate解决序列化问题
  1. 如果OrderServiceImpl类中注入的是StringRedisTemplate,可以解决序列化问题

    @Autowired
    private StringRedisTemplate redisTemplate;
    
  2. 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
  1. 自定义RedisTemplate的Bean后,默认的RedisTemplate的Bean将失效

  2. 添加配置类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;
        }
    }
    
    • 这里使用的RedisConnectionFactoryLettuceConnectionFactory实现类对象
  3. 此时OrderServiceImpl类中注入RedisTemplate对象为自定义的Bean

    @Autowired
    private RedisTemplate redisTemplate;
    
  4. 注意,自定义的RedisTemplate改变了序列化方式,比如value序列化方法变成了json形式,获取旧数据时可能会报错

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐