(2)Redis常见功能分析

Redis 缓存雪崩

同一时间,批量缓存过期,导致大量请求直接越过缓存,直接访问数据库资源。

  1. 可以通过对热点数据不设置缓存过期时间,非热点数据设置不同过期时间来解决。(非主动过期)
  2. 使用主动过期策略,Redis定期主动清除。可以了解一下Redis的过期策略以及淘汰机制。

Redis 缓存击穿

Redis 数据过期后导致大量请求直接读库,或者Redis、数据库中都没有请求的数据,导致每次请求都需要直接访问数据库,在并发量大的情况下导致数据库连接数打满等不可控影响。

  1. 可以通过数据库没有值时,在Redis设置一个默认的值,同时加上过期时间。这样后续请求就可以快速失败返回。然后在流量大的业务场景,可以在访问数据库时加分布式锁,保证同时只有一个线程去访问数据库。
  2. 也可以使用布隆过滤器,提前存储好数据库中存在的数据,如果对于没有的数据,直接通过布隆过滤器拦截,快速返回。(面对恶意攻击,或者数量巨大千万上亿级的数据,如果使用第一种方式设置默认值,那么内存要撑爆了,布隆过滤器使用位图,4个字节便可存储32条数据)

布隆过滤器

原理:

  1. 初始化好一个内存空间(位数组)。
  2. 读取对象后,将对象Key转换为一个hash值,在内存空间中占位。(初始化为0,计算Hash值后落在哪一位哪一位设置为1),为了减少Hash碰撞,可以使用多个Hash函数。比如使用3个hash函数,计算出三个落点,将三个落点修改为1。
  3. 在需要检查数据是否存在时,同样使用N个Hash函数,检查落点是否都为1,如果都为1表示数据存在于内存中,如果有一个不为1那么数据肯定不存在,可以直接返回失败,避免操作缓存。

分布式锁

Redission已提供支持,无需重复造轮子。(通过Lua脚本实现)

分布式锁需要考虑哪些问题。

  1. 分布式操作互斥。(业务定义相同的Key)
  2. 逻辑操作原子性保证。(判断Key是否存在,不存在新增Key,加锁成功,存在抢占锁失败。)
  3. 超时设置。(如果意外,导致一直没有释放锁,要在超过一定时间后,主动释放)
  4. 自动续约设置。(如果再加锁时间超时,将要自动释放时,业务未处理完成,要自动续命)

Lua

Lua脚本是一种脚本语言,弱类型(灵活性较强)。在Redis中能够保证原子性。主要通过阻塞方式实现。(如果有一个客户端执行Lua脚本中,其他客户端的操作将会提示Redis Busy),如果Lua脚本不涉及事务操作(修改、新增、删除数据),那么其他客户端可以通过kill script 命令强制结束Lua脚本执行。如果涉及到事务,则只能重启(丢弃上次快照之后的数据缓存)。

Redis在用Lua脚本保证原子性的同时,也承担了额外的风险。因此使用Lua脚本时要注意,避免阻塞。另外Redis Config中也包含对Lua脚本超时时间的设置,可以根据实际情况灵活的配置使用。

Lua 脚本也可以压缩缓存,生成hash返回,后续使用Hash调用。

时间轮

image.png
image.png

时间轮,主要用来管理延迟任务执行(kafka的实现也是基于时间轮)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容