20200324 redis学习记录

20200324
redis学习:
redis一般会出现三种问题。雪崩,穿透,击穿。
雪崩(顾名思义,就是一下子崩盘了,就像你的五个队友装备都没起来,直接就让对面上高地把水晶推了):
定义:redis里的key大面积失效,导致用户请求直接访问db数据库,数据库承受不住大并发量而出现崩溃,从而对其他服务产生连带效应,比如用户系统崩溃了,那么其他依赖用户的一些服务也会随之收到影响。
解决办法:
key的失效时间加一个随机值,这样key就不会全部一起失效,从而减少数据库的压力。
设置key的失效时间为永久,如果需要更新,那么刷新一下缓存中的数据,猥琐发育才是王道。
使用分布式部署
穿透(顾名思义,就是穿过某个东西,直接到达目的地,突然想起王者荣耀里的破甲穿透,无视护甲(redis),直接对你进行伤害(db)):
定义:假设数据库的id是从1开始,自增长的,如果这时候有大量的请求使用的id是小于1的,那么这时候请求会略过redis缓存,直接请求到数据库,请求的并发量大的话就会导致数据库崩溃,这就是缓存的穿透。
解决办法:
a.加一些过滤条件,比如判断一下id是否大于0,实际场景根据自己需要去增加一些过滤,比如买个反甲。
b.使用布隆过滤器,他利用高效的数据结构算法计算出你要查的key是否存在数据库,不存在直接返回,存在返回key和value,并刷新缓存。
c.如果从缓存和数据库中都读取不到数据,那么就奖缓存中key对应的value置为null,并设一个短点的失效时间,时间长了也会有其他影响,这样就能防止id暴力攻击了。
击穿(就像敌方知道你是个妹纸,然后敌方的上中下带个辅助五个人同时去围剿你了,呸,游戏体验真不好)
定义:某个key是个热点,然后大并发一直去请求这个key,当这个key瞬间失效的时候,大量数据直接请求db,导致数据库崩溃。
解决办法:
a.设置缓存为永久失效时间。
b.加互斥锁。分布式的话得用分布式锁,然而我也没用过,等我看过了再补充吧。
在这里插入图片描述
抄袭别人一段互斥锁代码,意思是:缓存中没有数据,第1个进入的线程,获取锁并从数据库去取数据,没释放锁之前,其他并行进入的线程会等待100ms,再重新去缓存取数据。这样就防止都去数据库重复取数据,重复往缓存中更新数据情况出现。
最后这个我还没太明白,查不到的那个数据是怎么处理的,不用管了吗?如果有小伙伴给我解释一下,那我将感激不尽了。

总结:
事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + Hystrix 限流+降级,避免MySQL 被打死。
事后:Redis 持久化 RDB+AOF,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

redis持久化:
RDB:每隔5秒或者更久的时间会保存一次数据到一个文件中。
AOF:每隔1秒会记录一条日志(append-only)到一个文件中。
两者比较:
RDB因为记录时间相隔较长,所以会出现丢失数据,但是RDB性能好,他会fork一个子进程去做持久化,数据恢复的时候AOF快。
AOF数据丢失率低,数据保存比较完善,redis默认是AOF恢复,但是数据恢复时间比RDB长。
实际使用:
可以两者同时开启,先用RDB快速恢复,然后用AOF去补全数据。

redis哨兵集群:
主要功能:
集群监控:负责监控 Redis master 和 slave 进程是否正常工作。
消息通知:如果某个 Redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。
故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。
配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址。

数据同步:
你启动一台slave 的时候,他会发送一个psync命令给master ,如果是这个slave第一次连接到master,他会触发一个全量复制。master就会启动一个线程,生成RDB快照,还会把新的写请求都缓存在内存中,RDB文件生成后,master会将这个RDB发送给slave的,slave拿到之后做的第一件事情就是写进本地的磁盘,然后加载进内存,然后master会把内存里面缓存的那些新命名都发给slave。

redis过期策略:
定期删除:默认100s会随机抽取一些过期的key,进行删除
惰性删除:查询的时候验证是否过期,过期的就不返回了
如果定期没删,查询也没删,那么redis会执行lru内存淘汰机制。
linkedHashMap也是用的lru算法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值