【Redis】SpringDataRedis

Spring Data Redis 使得开发者能够更容易地与 Redis 数据库进行交互,并且支持不同的 Redis 客户端实现,如 JedisLettuce 。Spring Data Redis 会自动选择一个客户端,通常情况下,Spring Boot 默认使用 Lettuce 作为 Redis 客户端。你也可以选择使用 Jedis

Spring Data Redis 的使用步骤

(1)引入spring-boot-starter-data-redis依赖

java 复制代码
<dependency>
    <!--redia依赖-->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
    <!--common-pool-->
    <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
            

(2)在application.yml配置Redis信息

java 复制代码
spring:
  data:
    redis:
      host: 192.168.30.130
      port: 6379
      password: xxxxxx
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: 100ms

(3)注入RedisTemplate

SpringDataRedis 是 Spring Data Redis 中最重要的工具类,其中封装了各种对Redis的操作,并且将不同数据类型的操作API封装到了不同的类型中。

SpringDataRedis 可以接受任何类型的java对象,并通过 RedisSerializer 将它们转成 Redis 可以处理的字节(byte[])格式。这是因为 Redis 本身只能够存储字节数据,而不能直接存储 Java 对象。因此,Spring Data Redis 提供了自动序列化和反序列化机制来支持 Java 对象的存储和读取。

java 复制代码
@SpringBootTest
class RedisDemoApplicationTests {
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    void testString() {
        //写入一条String数据
        redisTemplate.opsForValue().set("name","虎哥");
        //获取string数据
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println("name = " + name);
    }

}

RedisTemplate 默认使用 JDKSerializationRedisSerializer 来序列化和反序列化对象,但它具有**不可读性,**JDK 序列化的字节流是二进制的,不易于人工读取或调试。如果你需要查看 Redis 中存储的数据,JDK 序列化的对象将无法直接转换回人类可读的格式,这使得调试和监控变得困难。

可以自定义RedisTemplate的序列化方式,常见做法是key使用String序列化(StringRedisSerializer),value使用JSON序列化(GenericJackson2JsonRedisSerializer)。这种方法可以自动帮我们处理JSON的序列化和反序列化,但是会占用额外空间。

所以为了节省空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器(StringRedisTemplate),要求只能存储String类型的key和value。当需要存储java对象时,手动把对象序列化为JSON,读取Redis时手动把读取到的JSON反序列化为对象。

java 复制代码
@SpringBootTest
class RedisStringTests {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    
    @Test
    void testString() {
        //写入一条String数据
        stringRedisTemplate.opsForValue().set("name","虎哥");
        //获取string数据
        Object name = stringRedisTemplate.opsForValue().get("name");
        System.out.println("name = " + name);
    }
    
    private static final ObjectMapper mapper = new ObjectMapper();
    @Test
    void testSaveUser() throws JsonProcessingException {
        //创建对象
        User user = new User("虎哥", 21);
        //手动序列化
        String json = mapper.writeValueAsString(user);
        //写入数据
        stringRedisTemplate.opsForValue().set("user:200",json);
        //获取数据
        String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
        //手动反序列化
        User user1 = mapper.readValue(jsonUser, User.class);
        System.out.println("user1 = " + user1);
    }

    @Test
    void testHash() {
        stringRedisTemplate.opsForHash().put("user:400","name","虎哥");
        stringRedisTemplate.opsForHash().put("user:400","age","21");

        Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:400");
        System.out.println("entries = " + entries);
    }
}
相关推荐
一灯架构2 小时前
90%的人答错!一文带你彻底搞懂ArrayList
java·后端
倔强的石头_2 小时前
从 “存得下” 到 “算得快”:工业物联网需要新一代时序数据平台
数据库
Y4090013 小时前
【多线程】线程安全(1)
java·开发语言·jvm
TDengine (老段)3 小时前
TDengine IDMP 可视化 —— 分享
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据·时序数据
布局呆星3 小时前
SpringBoot 基础入门
java·spring boot·spring
风吹迎面入袖凉3 小时前
【Redis】Redisson的可重入锁原理
java·redis
GottdesKrieges3 小时前
OceanBase数据库备份配置
数据库·oceanbase
w6100104663 小时前
cka-2026-ConfigMap
java·linux·cka·configmap
SPC的存折4 小时前
MySQL 8组复制完全指南
linux·运维·服务器·数据库·mysql