Redis--常见问题及方案

  • 缓存穿透:请求一个一定不存在的数据,因为缓存中不存在,就一定会去数据库查,然后数据库也不存在,就不会写入缓存,一直查数据库,导致数据库压力很大。
    解决方案:即使不存在,也要写入缓存,设置过期时间短一点。
  • 缓存击穿:一个不存在的数据,瞬间请求过来,在还没写入缓存这段时间内,全部查库,数据库压力很大。
    解决方案:
    1 加独占锁
    在这里插入图片描述
    缺点:可能会导致有很多个线程阻塞。
    优点:保证数据一致性。
    2 设置键永不过期,用定时的线程去更新缓存,定时的时间即为键的过期时间。
    缺点:需要单独的线程构建,不能保证数据一致性。
    优点:不会有线程的等待时间。

3 缓存雪崩:
redis中大量key集体过期

-------------------------------------------------------------------------------------bigKey优化---------------------------------------------------------------
string类型的value超过10KB、hash、list、set、zset元素个数超过5000个。
危害

  • redis阻塞
  • 网络阻塞
    官方提供的查找bigkeys工具没有具体定义那些是bigkey,
 ./src/redis-cli -h 192.168.209.101 -p 6379 --bigkeys

在这里插入图片描述
scan+debug object
在这里插入图片描述
优化bigKey方法

  • 优化数据结构,比如一个key存储的是一天的记录,可以按小时细粒度的拆分成一个小时一个key,这样对空间占用能降低很多。

-------------------------------------------------------------------热点key----------------------------------------------------

  • 在客户端做调用统计。
  • 在服务端抓包
  • 使用redis官方的监控工具,会存在一定的性能消耗。
    在这里插入图片描述

淘汰策略:

  • noeviction:默认策略,不淘汰,如果内存已满,添加数据是报错。

  • allkeys-lru:在所有键中,选取最近最少使用的数据抛弃。

  • volatile-lru:在设置了过期时间的所有键中,选取最近最少使用的数据抛弃。

  • allkeys-random: 在所有键中,随机抛弃。

  • volatile-random: 在设置了过期时间的所有键,随机抛弃。

  • volatile-ttl:在设置了过期时间的所有键,抛弃存活时间最短的数据。
    参考:
    https://baijiahao.baidu.com/s?id=1643753170863062704&wfr=spider&for=pc

  • 数据库与缓存一致性问题
    先修改MySQL数据-》再删除缓存:该种方式最为稳妥,删除出现异常,那么MySQL中的数据回滚,能保证一致性,除非出现极端的情况
    在这里插入图片描述
    这种情况基本不可能出现,因为写库比读库耗时,肯定是先写入缓存,修改的线程再删除的。如果非要考虑写库比读库快的情况,
    可以考虑在修改数据后延迟双删除缓存,第一次删除缓存是为了让其他线程去读DB,延迟的第二次删除是为了在删除缓存到提交事务间隙其他线程读取到的脏数据然后写入到了缓存。
    比如睡眠800毫秒然后删除key,删除的是旧数据写入到缓存的。延迟时间应该大于读数据时间+写入缓存的时间,主要是是让读取错误数据的线程读取到数据,然后把错误的数据删除。
    其实给缓存设置过期时间是能保证一致性最好的方案。

双删除,
第一次 删除是尽最大可能保证一致,删除缓存,让请求马上去查询mysql最新的数据
第二次 删除在第一次删除缓存到更新数据库这段时间内查询到的脏数据

spring-boot redis打印每次的命令

logging.level.io.lettuce.core=debug
logging.level.org.springframework.data.redis.core=debug

参考:https://mp.weixin.qq.com/s/2MMZrNnDjVy-cexcety89g

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值