SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:https://spring.io/projects/spring-data-redis

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. 引入依赖

<!--Redis依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--连接池依赖-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

2. 配置文件

spring:
  redis:
    port: 6379
    host: localhost
    password: liuyang

3. 依赖注入 + 编写测试

@SpringBootTest
public class SpringRedis {
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void testString() {
        // 插入一条string类型数据
        redisTemplate.opsForValue().set("name", "李四");
        // 读取一条string类型数据
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println("name = " + name);
    }
}

<aside> 💡 如果使用默认的序列化器,可能有出现这样的key:\xAC\xED\x00\x05t\x00\x04name 因此我们应该更改序列化器

</aside>

方法一(JSON序列化)

4. 添加序列化器

@Configuration
public class RedisConfig{
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        // 创建Template
        RedisTemplate<String, Object> redisTemplate=new RedisTemplate<>();
        // 设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 设置序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer=new GenericJackson2JsonRedisSerializer();
        // key和 hashKey采用 string序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        // value和 hashValue采用 JSON序列化
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        return redisTemplate;
    }
}

5. 测试存储对象

@Data
@AllArgsConstructor
@NoArgsConstructor
public class RUser {
    String name;
    Integer age;
}

@Test
void testObject() {
    RUser rUser = new RUser("小虎", 21);
    // 插入一条string类型数据
    redisTemplate.opsForValue().set("name", rUser);
    // 读取一条string类型数据
    RUser user = (RUser) redisTemplate.opsForValue().get("name");
    System.out.println("user = " + user);
}

// 输出
{
  "@class": "com.hell.RUser",
  "name": "小虎",
  "age": 21
}

观察输出,我们发现这样的序列化会可以直接进行强转,但是会多一个字符串,浪费存储

方法二(高频):

为了防止浪费存储,我们需要手动进行序列化、反序列化

4. 手动序列化,不需要定义序列化器

我们应该使用:StringRedisTemplate(也就不需要定义配置类了)