SpringDataRedis
约 303 个字 92 行代码 3 张图片 预计阅读时间 2 分钟
简介
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis。
功能
- 提供了对不同Redis客户端的整合(Lettuce和Jedis)
 - 提供了RedisTemplate统一API来操作Redis
 - 支持Redis的发布订阅模型
 - 支持Redis哨兵和Redis集群
 - 支持基于Lettuce的响应式编程
 - 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
 - 支持基于Redis的JDKCollection实现
 
不同数据类型的操作API

SpringBoot
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.配置文件
# application.properties文件里
spring:
    redis:
        host:172.18.84.81
        port: 6379
        lettuce:
            pool:
                max-active: 8 #最大连接
                max-idle: 8 #最大空闲连接
                min-idle: 8 #最小空闲连接
                max-wait: 100 #连接等待时间
3.注入RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
4.测试
@SpringBootTest
public class RedisTest {
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    void testString(){
        redisTemplate.opsForValue().set("name","fmy1");
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println("name = " + name);
    }
    //进行序列化配置后,会实现自动序列化、反序列化
    @Test
    void testSaveUser(){
        redisTemplate.opsForValue().set("user:100",new User("fmy",21));
        User p = (User) redisTemplate.opsForValue().get("user:100");
        System.out.println(p);
    }
}
SpringDataRedis的序列化方式
序列化问题

序列化配置
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory) throws UnknownHostException {
        //创建RedisTemplate 对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        //创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // 设置Key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        //设置Value的序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        //返回
        return template;
    }
}
JSON的序列化方式的问题
    为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,
会带来额外的内存开销。  
    为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求
只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。
StringRedisTemplate
@SpringBootTest
public class RedisStringTest {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Test
    void testString(){
        stringRedisTemplate.opsForValue().set("name","wzq");
        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("fmy" , 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);
    }
}
总结
