美文网首页
Redis高频问题总结

Redis高频问题总结

作者: packet | 来源:发表于2019-04-09 20:02 被阅读0次
    1. redis为什么这么快?
    • 纯内存操作
    • 单线程操作,避免了线程上下文切换
    • NIO 多路复用机制。IO多路复用程序会将文件事件,放在一个队列里。文件事件分派器从队列中读取,转发到不同的事件处理器中。


    1. redis的数据结构用在什么场景下?
      string:value可以是字符串,也可以做计数器。
      list: 可以做简单的消息队列;使用lrange可以做分页功能。
      set: 去重;可以做交集、并集、差集等操作
      hash:是一个map
      sorted set:top N 排行榜;延时队列。

    2. key的过期策略和内存淘汰机制
      定期删除 + 惰性删除
      定期删除是每隔100ms,抽取一部分key检查。
      这种组合方式并非完美,有些过期的key可能未能及时删除。这时候就用到了内存淘汰策略。
      这里介绍LRU:
      allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 Key。(推荐使用,目前项目在用这种)(最近最久使用算法)
      volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 Key。这种情况一般是把 Redis 既当缓存,又做持久化存储的时候才用。(不推荐)

    3. redis和数据库的双写一致性问题
      一致性问题分为强一致性和最终一致性。
      缓存和数据库的联合使用,必然会存在不一致的问题。如果要求强一致性,则不能使用缓存。所以只能保证最终一致性。
      解决方法从根本上来说,只能降低不一致问题发生的概率:要先更新数据库,再删除缓存。删除缓存的时候,可能会失败,这时可以提供一个补偿措施,比如利用消息队列。

    4. 缓存穿透
      定义:黑客故意请求缓存中不存在的数据,导致所有请求都达到数据库上。
      提供一个拦截机制,比如使用布隆过滤器,内部维护一系列合法有效的key,判断key是否合法。
      布隆过滤器判断一个元素是否在一个集合中,可能还有一个误识别的问题,就是某些非法的key可能被判断在这个集合里。但是数量不多,所以可以接受。
      布隆过滤器的问题只有add和isExsit操作,不支持delete。如果isExsit返回true,只能说明该元素有较大可能在集合中;如果返回false,则一定不会在集合中。

    1. 缓存雪崩
      定义:缓存同一时间大面积失效,这个时刻的请求都会被打到服务器上。
    • 缓存失效的时间,可以使用在某个范围内的随机值,避免集体失效。
    • 双缓存:我们有两个缓存,缓存 A 和缓存 B。缓存 A 的失效时间为 20 分钟,缓存 B 不设失效时间。自己做缓存预热操作。然后细分以下几个小点:从缓存 A 读数据库,有则直接返回;A 没有数据,直接从 B 读数据,直接返回,并且异步启动一个更新线程,更新线程同时更新缓存 A 和缓存 B。

    鸣谢:
    为什么我们做分布式使用Redis?
    详解布隆过滤器的原理,使用场景和注意事项
    缓存数据库双写一致性问题

    相关文章

      网友评论

          本文标题:Redis高频问题总结

          本文链接:https://www.haomeiwen.com/subject/bftwiqtx.html