Redis随手小结

日常工作加上考研实在是忙,能想到啥就写点啥,就当是复习了,如果有人看到不对的地方及时提醒一下哈~
一、缓存雪崩
简单的说就是请求数据的空档期,旧的缓存失效了,新的缓存还没上来,大量旧缓存失效就形成了雪崩
解决方案:
1、可以把缓存失效时间,根据业务实际场景进行分散
2、也可以用锁或者队列,防止高并发的访问,因为没有缓存肯定会访问数据库,到那个时候估计只能手动上预热数据了吧

二、缓存穿透
就好比请求的数据不在缓存也不在数据库上的时候,请求绕过缓存落在了数据库上,每次都会去问数据库,相当于一个请求问了两次
解决方案:
1、把空结果放在缓存
2、配合BitMap+Bloom-Filter算法,将所有数据的hash存进一个空间很大的BitMap中,直接可以过滤掉空的情况。
这个Bloom-filter原理是根据hash碰撞的一种解决形式,因为hash换算成的url可能会有相同的情况,就形成了hash冲突,就是碰撞。在这个算法中会出现多个hash,如果hash证明某个元素不在集合里,那就真的不在;如果多个hash证明某个元素在集合里,那就肯定存在。一般用在大数据层面

三、缓存击穿
是指缓存中的key接受了高并发的请求,一但这个key失效了,就全落在数据库上,形成了击穿
解决方案:
用SETNX形成分布式锁,把这个key锁住,请求完成后再删除锁,减少key的压力

四、缓存预热、更新
项目刚上线时候会出现没有缓存的情况,就需要弄个手动缓存,让缓存先存上来,避免给数据库压力。
缓存的更新有三种,一种就是Redis自带的缓存失效,另一种就是根据业务场景进行判断是否要更新,更新哪些,还有一种就是定期去清理。
这里还要说一下缓存删除和内存淘汰:
删除的话分为两种,一种是定时删除,这种对cpu的消耗比较大,100ms全部检查一次,另一种就是惰性删除,每次请求key的时候查看过期时间,满足条件就删除。
但是还有一个问题,如果定时删除没有删除部分key,长时间不请求key就不会检查过期时间,就不会删,这样缓存就暴增。
解决方案:
设置 expire 的key, 满足先决条件(prerequisites),设置内存淘汰策略:maxmemory-policy (volatile-lru、volatile-ttl、volatile-random、allkeys-lru、allkeys-random、no-enviction)具体用哪个看实际场景,然后百度每个是干嘛的,要学的东西太多,有些东西实在是记不住。。

五、缓存降级
当高并发出现时候,为了保证主要业务数据的准确性,要给一些数据降级,可以人为设置开关,也可以根据数据自动处理,降级等级设置可以参考异常等级分级。对于一些在高并发下可能产生的不重要的数据,可以对用户范围缓存中存在的默认数据(根据实际场景做处理)

六、分布式锁
因为Redis是单线程的,所以用SETNX以key作为value来实现线程锁,通过expire()设置失效时间,解锁用del key。
说道单线程,Redis是原子性,
七、Redis的类型
String、list、sortList、set、hsh

八、Redis的结构
dict 为了解决算法中的查找问题
sds 可以存储任意二进制数据
skiplist 单层多指针的链表,它查找效率很高
quicklist 快速列表
ziplist 压缩表

九、集群
codis和自带的cluster,还有一个忘了,有时间补充上

十、双写一致性
因为Reids是单线程的,可以保证事务的原子性。为了更好的性能,实现了IO多路复用。对于缓存和数据库写和删,先干嘛后干嘛的问题抽空再总结,,,,,,

续写一致性问题
一个鸡生蛋蛋生鸡以及鸡和蛋同时生成的问题讨论,并且各有各的说法。
1、

有问题大佬们快快补充,临时想起什么就写下了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值