常见问题之redis

  • redis过期键删除策略
    1.立即删除:有定时处理器处理,发现键过期立刻删除(对cpu不友好,对内存友好)
    2.惰性删除:当需要用某个键时再判断是否需要删除,没用到的键一直在(对cpu友好,对内存不友好)
    3.定时删除:定时删除就是在某个时间点,去定时删除某些过期的键(对cpu影响小,对内存消耗少,需要控制好时长和频率)

  • redis的数据淘汰策略
    1.volatile-lru 从已 [ 设置过期时间 ] 的数据集中挑选最近[ 最少 ] 使用的数据淘汰
    2.volatile-ttl 从已设置过期时间的数据集中挑选将要过期的数据淘汰
    3.volatile-random 从已设置过期时间的数据集中任意选择数据淘汰
    4.volatile-leu 从已设置过期时间的数据集中
    5.allkeys-lru 从所有数据集中挑选最近最少使用的数据淘汰
    6.allkeys-random 从所有数据集中任意选择数据进行淘汰
    7.allkeys-lfu 从所有数据集中Least Frequently Used最少使用
    8.noeviction 不删除策略,达到最大内存限制时,如果需要更多内存,直接返回错误信息。大多数写命令都会导致占用更多的内存
    注意(如过读者想做实现,启动 redis 后,使用客户端 执行 info memory 命令看看 used_memory ,然后设置
    在 config 文件 中设置 maxmemory配置项,设置大于一点点,那么会触发淘汰算法 )

  • 缓存雪崩概念
    存储的缓存key/value在同一时间失效,造成在某一时刻大量数据都直接访问数据库,造成数据库短时间内承受大量请求而崩掉。

  • 缓存雪崩解决方案
    1.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生
    2.如果并发量不是很大,对性能要求不是很高的话用锁进行排队,这里并不是指的分布式锁,java自带的Lock,sync就可以了,因为这里不考虑并发的问题,只是不希望大量数据同一时间打到数据库上
    3.给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。

  • 缓存穿透概念
    缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。一般来说都是一些恶意的请求。

  • 缓存穿透解决方案
    1.对用户权限进行校验,校验用户id,id<=0的直接拒绝
    2.可以给这种恶意攻击用户设置一个key,然后value=null,设置30s的过期时间,这样同一个用户30s内至少是无法暴力攻击的。
    3.采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力

  • 缓存击穿概念
    缓存中没有,但是数据库中有这条数据,原因是因为缓存时间已经到了。当在高并发的情况下,由于某条数据是很多接口必查的数据,那么缓存失效,必然导致数据库直接面向这些请求,导致数据库崩掉。

  • 缓存雪崩和缓存击穿的区别
    想要搞明白这两个区别,其实只要明白一个例子就行了。缓存雪崩是指多个用户维度的数据同时失效,导致多个用户同时请求打在数据库上面(用户token缓存);缓存击穿是指所有用户都要用到的一条数据,一旦失效,所有用户都会去数据库并发查询这条公用的数据,导致大量请求打到数据库上,数据库崩溃(面向所有用户公用的一条配置)。

  • 缓存击穿解决方案
    1.因为是面向所有用户的数据,比如面向所有用户配置,设置不过期
    2.加互斥锁
    3.可以通过缓存预热,每次手动刷新这个缓存,这种数据大多是为了可配置

  • 缓存预热
    将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据

  • 缓存预热解决方案
    1.直接写个缓存刷新页面,上线时手工操作一下;
    2.数据量不大,可以在项目启动的时候自动进行加载;
    3.定时刷新缓存,分批刷新缓存;

  • 五种数据结构
    1.string(存储字符串,整数,小数)
    2.list (存储 任意数据的有序集合,元素可以相同)
    3.set(存储 任意数据的无序集合,元素不可以相同)
    4.hash(存储 任意数据的hash表,key不能相同)
    5.zset(存储 任意数据的有序集合,元素不可以相同)

  • 缓存与数据库数据不一致问题
    待收集

  • 使用场景
    1.计数器(读写效率高,单线程不存在更新丢失覆盖问题)
    2.缓存一些热数据,配置最大内存和淘汰策略,提高命中率
    3.会话缓存,存储token之类的,这样可以更好实现会话统一管理,确保应用服务器无状态,可扩展
    4.分布式锁的实现
    5.使用list实现消息队列的功能,不过最好使用kafak,rocketMq
    6.使用zset,可以实现排行榜的功能

  • redis和memcached的区别
    1.redis是单线程架构的,memcached是多线程,非阻塞io多路复用
    2.redis支持丰富的数据结构,memcached只是支持文本,二进制
    3.redis支持RDB,AOF的持久化策略,memcached不支持持久化

  • redis的持久化策略
    1.RDB
    配置方式: 在redis的配置文件中配置 save m(s) n(key) 当在m秒的时间内发生n个key进行了写操作,那么将将进行一次持久化操作,将数据写到RDB文件。但是最后一次的数据会发生丢失
    2.AOF
    配置方式: 在redis的配置文件中,开启aop, 调用fsync追加redis命令日志,可以有两种方式aways和everysecond ,分别为每次一个写命令过来都会追加命令到aop文件中和每隔多少秒会写入到日志。

猜你喜欢

转载自blog.csdn.net/weixin_38312719/article/details/105524267
今日推荐