重写Redis实现缓存过程中的序列化


一、用Redis实现缓存(2024/8/13)

1.什么是Redis序列化

  • Redis序列化是指将Redis中的数据结构(如strings、hashes、lists、sets、zsets等)转换为二进制格式,以便在内存和磁盘之间进行存储和传输的过程。

2.为什么要重写Redis序列化

  • redis的序列化方式:默认使用JDK方式序列化,该序列化对象必须实现一个接口
  • JDK 方式的对象序列化, 对象 ->字符流->二进制。会把对象转成二进制存储,不方便查看,所以要重写redis 序列化方式。

3.RedisTemplate和StringRedisTemplate区别

RedisTemplate 和 StringRedisTemplate 都是Spring Data Redis提供的模板类,用于简化与Redis的数据交互,但它们有特定的关注点:

  1. RedisTemplate:
    这是一个更通用的模板,它提供了一系列操作不同类型数据的接口,包括字符串、哈希、列表、集合和有序集合等。你可以直接对各种键值对数据进行CRUD操作,例如get、set、hmset等。
  2. StringRedisTemplate:
    它是专门针对字符串类型数据设计的,提供了更多的字符串操作方法,如msetnx(原子设置多个键),strlen(获取字符串长度),del(删除键)等。其API通常比RedisTemplate更简洁,专注于处理字符串相关的场景。

两者的区别在于使用场景和效率。如果你的应用只需要对Redis的字符串类型数据进行操作,并希望API更精简,那么StringRedisTemplate是更好的选择。如果需要对多种数据结构进行操作,或者希望使用更全面的功能集,RedisTemplate则更为合适。

4. 如何重写Redis缓存序列化

@Configuration
public class RedisConfig {
    /**
     * redisConnectionFactory 链接redis工厂
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate redisTemplateInit(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置序列化Key的实例化对象
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置序列化Value的实例化对象
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        /**
         * 设置Hash类型存储时,对象序列化报错解决
         */
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }
}

4.简单使用

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
    //object为要使用缓存的实体类
    //1.判断redis中有没有该数据,如果存在,就响应数据给请求,否则到2
    Object cacheobject = (Object) redisTemplate.opsForValue().get("CACHE:QUERYFRUIT" + id);
    if(cachobject!=null){
    //ResponseDate<>()是响应的统一返回类,ok()是自定义的响应成功的方法,ObjectDTO是实体类的DTO层,其中有一个自定义构造方法可以将实体类中数据传给DTO中相应字段
    return new ResponseData<>().ok(new ObjectDTO(cacheobject));
    }
    //2.查询数据库中是否有符合请求的信息
    Object object= objectMapper.queryById(id);
    //3.将该信息传输到redis中下次请求就可以通过redis响应
    redisTemplate.opsForValue().set("CACHE:QUERYFRUIT"+id,fruit);

5.用redis做缓存会有下面三个问题

  1. 缓存穿透(一定要解决)
  2. 缓存雪崩
  3. 缓存击穿

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值