Redis—SpringDataRedis

与其明天开始,不如现在行动!


SpringDataRedis

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis

官网地址: https://spring.io/projects/spring-data-redis

  1. 提供了对不同Redis客户端的整合 (Lettuce和Jedis)
  2. 提供了RedisTemplate统一API来操作Redis
  3. 支持Redis的发布订阅模型
  4. 支持Redis哨兵和Redis集群
  5. 支持基于Lettuce的响应式编程
  6. 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
  7. 支持基于Redis的]DKCollection实现

SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

API返回值类型说明
redisTemplate.opsForValue()ValueOperations操作String类型数据
redisTemplate.opsForHash()HashOperations操作Hash类型数据
redisTemplate.opsForList()ListOperations操作List类型数据
redisTemplate.opsForSet()SetOperations操作Set类型数据
redisTemplate.opsForZSet()ZSetOperations操作SortedSet类型数据
redisTemplate通用的命令

快速入门:

  1. 引入依赖

    <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>
    
  2. 配置文件

    spring:
      data:
        redis:
          host: " 你的主机地址"
          port: 端口号
          password: "密码"
          lettuce:
            pool:
              max-active: 8
              max-idle: 8
              min-idle: 0
              max-wait: 1000
    
  3. 注入RedisTemplate

    @Autowired
    private RedisTemplate redisTemplate;
    
  4. 编写测试

    @SpringBootTest
    class RedisDemoApplicationTests {
    
        @Autowired
        private RedisTemplate redisTemplate;
        @Test
        void contextLoads() {
            redisTemplate.opsForValue().set("name", "Lucy");
            Object name = redisTemplate.opsForValue().get("name");
            System.out.println("name" + name);
        }
    
    }
    

RedisTemplate

RedisTemplate的两种序列化实践方案:

  1. 方案一
    1. 自定义RedisTemplate
    2. 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer
  2. 方案二
    1. 使用StringRedisTemplate
    2. 写入Redis时,手动把对象序列化为JSON
    3. 读取Redis,手动把读取到的JSON反序列化为对象

方案一

SpringDataRedis的序列化方式
RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认采用JDL序列化。得到的结果是这样的

> get "\xac\xed\x00\x05t\x00\x04name"
"\xac\xed\x00\x05t\x00\x04Lucy"

缺点:

  1. 可读性差
  2. 内存占用较大

修改序列化方式:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        //创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        //设置连接工厂
        template.setConnectionFactory(redisConnectionFactory);
        //创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //设置key序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        //设置value序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        //返回
        return template;
    }
}

存储对象

User类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    public String name;
    public int age;
}

测试:

@Test
void testUser() {
    redisTemplate.opsForValue().set("user:1000", new User("小明", 18));
    Object o = redisTemplate.opsForValue().get("user:1000");
    System.out.println("o = " + o);
}

方案二

  1. 注入StringRedisTemplate

    @Autowired
        private StringRedisTemplate redisTemplate;
    
  2. 测试

    private static final ObjectMapper mapper = new ObjectMapper();
    
        @Test
        void testUser() throws JsonProcessingException {
            //创建对象
            User user = new User("胖虎", 20);
            //手动序列化
            String json = mapper.writeValueAsString(user);
            redisTemplate.opsForValue().set("user:2000", json);
            String jsonUser = redisTemplate.opsForValue().get("user:2000");
            //手动反序列化
            User user1 = mapper.readValue(jsonUser, User.class);
            System.out.println("user = " + user1);
        }
    

💎总结

本文中若是有出现的错误请在评论区或者私信指出,我再进行改正优化,如果文章对你有所帮助,请给博主一个宝贵的三连,感谢大家😘!!!


  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不爱生姜不吃醋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值