redis缓存数据(异步操作,缓存穿透,缓存雪崩)

利用redis缓存数据可以减少减少用户访问并发量带来的服务器读写压力,提高读写效率,降低响应时间。

1.数据可能存入过多

解决方案:

内存淘汰:redis自动进行,当redis内存达到咱们设定的max-memery的时候,会自动触发淘汰机制,淘汰掉一些不重要的数据(可以自己设置策略方式)

超时剔除:当我们给redis设置了过期时间ttl之后,redis会将超时的数据进行删除,方便咱们继续使用缓存

主动更新:我们可以手动调用方法把缓存删掉,通常用于解决缓存和数据库不一致问题

2.如何保存缓存与数据库的操作的同时成功或失败(先操作数据库,再删除缓存)

  • 删除缓存还是更新缓存?

    • 更新缓存:每次更新数据库都更新缓存,无效写操作较多

    • 删除缓存:更新数据库时让缓存失效,查询时再更新缓存

  • 如何保证缓存与数据库的操作的同时成功或失败?

    • 单体系统,将缓存与数据库操作放在一个事务

    • 分布式系统,利用TCC等分布式事务方案
       

应该具体操作缓存还是操作数据库,我们应当是先操作数据库,再删除缓存,原因在于在两个线程并发来访问时,假设线程1先来,他先把缓存删了,此时线程2过来,他查询缓存数据并不存在,此时他写入缓存,当他写入缓存后,线程1再执行更新动作时,实际上写入的就是旧的数据,新的数据被旧数据覆盖了。        

代码片段:

3.缓存穿透

缓存穿透:指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。

产生原因:过多不存在的请求给数据库带来巨大压力

解决方式:1.缓存空对象(会造成额外的内存消耗)
                2.布隆过滤(利用一个庞大的二进制数字,哈希思想去判断请求数据是否存在,不存在则直接返回,不访问数据库但是只要是哈希思想便会有哈希冲突 导致误判并且实现复杂)
                    

缓存空对象解决方式代码片段:

4.缓存雪崩

缓存雪崩:指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力

解决方式:* 给不同的Key的TTL添加随机值(缓存预热时,设置不同的失效时间)
                  * 利用Redis集群提高服务的可用性
                  * 给缓存业务添加降级限流策略
                  * 给业务添加多级缓存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值