技术编程|Redis面试知识点( 三 )


缓存击穿指的的是大量的请求访问一个点 , 就是说某一个热点比如某一个明星有出轨了 , 在不停的扛着大并发 , 当这个key失效的瞬间 , 持续的大并发请求就会穿破缓存到达数据库 , 导致数据库宕机 , 这就像给一个屏障上凿开了一个洞 , 这是缓存击穿 。
缓存雪崩指的是缓存层出现了错误 , 或者停电了 , 宕机了 , 或者大量的缓存同时失效了 , 于是所有的请求都会到达数据库 , 造成数据库的崩溃 。
缓存穿透的解决方案:
设置布隆过滤器: 设置所有的可能查询的数据哈希到一个bitmap中 , 当用户查询的时候先使用布隆过滤器 , 如果发现不在集合中 , 则直接丢弃 , 不进行后台查询 。
布隆过滤器是是一组byte数组 , 存储0和1 , 对数据进行多种hash运算 , 将每一种hash值对应的byte位存储为1 , 多个hash就会有多个1 , 所以先对请求你的数据按规则进行hash,在byte数组中查找 , 如果请求的数据不在byte数组中 , 那么这个数据一定不存在 , 如果存在的话 , 就说明可能存在 , 因为byte上的面的1可能重复 , 可能是别的数据hash的映射 。
对于查询的数据如果没有话也进行缓存 , 缓存为空 , 设置的过期时间少一些 。
缓存击穿的解决方案:
设置热点的缓存永不过期 , 这种方法需要任务定时去更新数据 , 如果很多的话 , 同时更新搞不好会出现缓存雪崩的情况
加锁 。加锁在获取缓存的方法里面 , 保证在多用户的情况下 , 只有一个线程去数据库请求数据并存入缓存中 , 其他的线程只需要在这个线程请求结束并放入缓存中之后在缓存中拿数据即可
缓存雪崩的解决方案:
1. redis的高可用 , 搭建redis集群 , 保证redis不会全部宕机
限流 , 就是在缓存失效之后 , 加锁或者缓存队列的方式来控制读写数据库的数量
数据预热: 在即将发生大并发访问前手动触发加载缓存不同的key , 设置不同的过期时间 , 让缓存失效的时间点尽量均匀 。命令操作:setkey1hellogetkey1setex设置过期时间setnx不存在的话才设置 , 存在key , 就会失败 , 常用语分布式锁mset设置多个k-vmget获取多个k-vgetset先获得旧的值 , 在设置新的值
list
所有的命令都是以l 开头的LPUSHlistoneLRANGElist0-1取出所有的值LPUSH放在头部 , RPUSH放在尾部LPOPlist移除第一个元素RPOPlist移除最后一个元素LINDEXlist1获取下标为1的数据LLENlistlist的个数LREMlist1one移除某一个值 , 1表示移除一个oneLTRIMlist12通过下标截取valuerpoplpush移除列表的最后一个元素 , 并放到另外一个list中lsetlist0str根据索引覆盖其他值 , 如果不存在列表或者索引不存在则报错先进先出是队列 , 先进后出是栈 。LPUSHRPOP就是队列
setSADDmysetstr向set集合中添加元素smembersmyset查看集合中的所有元素SRANDMEMBERmyset2随机获取两个元素SPOPmyset随机删除一个元素SMOVEmysetmyset2str移动str从一个集合到另外一个集合SDIFFmysetmyset2差集SINTER交集SUNION并集scardmyset查看所有的元素
hash 设置的键值对hsetmyhashfield1value设置键field1值是valuehgetmyhashfield1获取某一个值hgetallmyhash获取所有的值hdelmyshafield1删除hkyesmyhash所有的keyhvaluesmyhashhincrbymyhashfields自增
zset 有序集合 , 和set类似 , 但是需要一个标志用于排序zaddmyset1one多了一个1 , 用于排序zrangebyscoremyset-inf+inf排序 , 从负无穷到正无穷 , 就是升序
【技术编程|Redis面试知识点】技术编程|Redis面试知识点
文章图片

文章图片


推荐阅读