Redis---------实现更改数据业务,包括缓存更新,缓存穿透雪崩击穿的处理

三种更新策略

内存淘汰是Redis内存的自动操作,当内存快满了就会触发内存淘汰。超时剔除则是在存储Redis时加上其有限期(expire),有限期一过就会自动删除掉。而主动更新则是自己编写代码去保持更新,所以接下来研究主动更新策略。

主动更新策略

结论:从上面可以得知我们一般是要删除缓存而不是更新

结论:从上面得知我们是要先操作数据库再操作缓存

总结主动更新策略的读写操作:

代码实现:

java 复制代码
    @Override
    @Transactional//加注解实现事务的原子性
    public Result updatesh(Shop shop) {
        Long id = shop.getId();
        if(id == null){
            return Result.fail("id错误!");
        }

        //1,先更新数据库
        updateById(shop);

        //2,删除缓存
        stringRedisTemplate.delete(CACHE_SHOP_KEY + "id");

        return Result.ok();
    }

三种缓存的问题:

缓存穿透

请求的数据既不在Redis中也不在数据库中,导致每次请求都会打到数据库,例如id=-1

解决的方法:①缓存空对象 ,把这个攻击的请求给一个NULL对象存到缓存中并设置TTL,使下次攻击命中②布隆过滤器,以位图来表示数据是否存在,如果存在就放行,否则直接拒绝访问,但是准确性不能保证

缓存雪崩

大量的Redis缓存同时失效或者Redis服务器宕机,导致大量的请求打到数据库

解决的方法:①存缓存的时候使用随机的TTL有效期②利用Redis集群提高高可用性③给业务添加多级缓存,使用nginx缓存 + redis缓存 + 其他缓存,不同层使用不同的缓存,可靠性更强,去缓解Redis宕机带来的后果

缓存击穿

缓存击穿问题也叫热点key问题,缓存的热点key失效,导致大量的请求该热点的访问全部都打到数据库

解决的方法:①互斥锁 ,多个线程进行查询都会进行Redis重构,导致性能大大降低,所以使用锁机制,只有一个线程获得锁,并且完成Redis重构,其他的线程在此时间内进行等待②逻辑过期,即久缓存,存进Redis中不设置TTL过期时间,而是以逻辑时间来标识

互斥锁解决缓存击穿的思路:获得锁与释放锁的操作通过Redis中的setnx来实现,只有该键不存在的时候才可以获得锁,该键存在即表示有线程在操作Redis重构。

逻辑过期解决缓存击穿的思路:设置一个字段表示其逻辑过期时间存在Redis中,而数据是不加TTL的,当我们去查询Redis时就判断这个逻辑字段是否过期,然后再进行返回或者重构操作

相关推荐
jinyishu_3 小时前
向量数据库入门:记录结构、索引、检索与选型
数据库
IT_陈寒3 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
打工仔折腾 AI4 小时前
把AI Agent托管在家用电脑:UU远程终端与端口映射实测记录
人工智能·后端·python·langchain·ai agent 实战
vx_Biye_Design4 小时前
springboot高校选课系统82776-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·课程设计·express
打工仔折腾 AI6 小时前
LLaMA 1 到 LLaMA 3 架构演进拆解:从 RoPE、GQA 到词表扩张
人工智能·后端·python·深度学习·langchain·llama
可乐鸡翅yeah_6 小时前
HLS 分片过期清理,直播旧 TS 分片磁盘爆满问题处理
java·后端·spring·m3u8·m3u8在线·音视频在线播放
张彦峰ZYF6 小时前
加了锁不等于扛得住争用:synchronized、显式锁与 CAS 的语义分层、争用代价账本与选型判据
后端·同步设施·内置锁的四种状态与单向升级·可重入的由来与四条硬边界·显式锁的状态字段与等待队列·读写锁与邮戳锁·一次同步的开销账本
写后端的胖头鱼7 小时前
【高频面试题】FullText 全文索引(MySQL)
数据库·mysql·索引·全文索引
专业程序开发源7 小时前
SSM校园拍摄交流服务平台36936-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·php·课程设计