Redis缓存穿透、缓存雪崩、缓存击穿(视频笔记)

Redis缓存穿透、缓存雪崩、缓存击穿(视频笔记)

1.Redis缓存穿透

        1.1.概念

                        1.请求的key在redis中不存在,请求会直接穿过redis直接打在DB上,高并发环境下对DB的负载过大,可能使其崩溃。

        1.2.场景设定和解决方案

                     场景一:使用不存在的key不断的发起请求

                               1.解决方法:从DB中查找,若存在则将返回的数据缓存到redis,如果不存在则将null缓存到redis

                     场景二:使用不存在的key不断的发起请求,且每次key都不相同(uuid)

                              1.问题:

                                    1.如果还使用场景1中的解决方法加之内存的LRU和LFU则会会造成redis中存的都是没有用的数据

                              2.解决方法:

                                    1.布隆过滤器

2.布隆过滤器

       2.1.概述

                  1.置于redis和DB之间来判断是否有该key

                  2.内存紧张的解决

                  3.布隆算法
                          1.通过一定的错误率来换取空间
                          2.bit数组占用空间少
                          3.布隆算法是由于存在hash碰撞所以导致出现错误率


        2.2.原理


                        1.使用bit数组来标识数据
                         2.初始化都是0
                         3.例:如标识id = 10

                                    1.先传给hash函数
                                    2.hash范围必须在(0-数组长度)
                                    3.计算出的hash值要足够散列
                                    4.计算出的结果代表数组下标
                                    5.按计算出的下标将数组中对应下标的值改为1
                                    6.发生hash碰撞后会有错误率


          2.3.解决hash碰撞的概率


                       1.增加bit数组的长度
                       2.增加hash函数的个数

                                 1.标识一条数据通过多个函数
                                  2.多个hash算法得到多个数据
                                 3.需要在数组多个下标中标记
                                 4.降低碰撞的概率
                                 5.数据更多就增长bit数组的长度
                                 6.hash长度的个数需要参考数组的长度(调优点)


         2.4.hash错误率


                     1.布隆算法说数据存在,可能不存在
                     2.布隆算法说不存在则一定不存在


        2.5.布隆算法弊端


                   1.删除数据时不好处理
                             1.处理方法:可以增加一个计数器

3.缓存雪崩                           

       3.1.概述

                    redis缓存的数据在某一个时刻突然大面积失效,导致大量的请求打向DB

       3.2.原因和解决


             1.redis数据有效期一致导致的
                   1.解决:不要突然同时失效,给每一条数据加上随机有效期
             2.redis数据库挂掉了
                  1.分布式缓存
                          1.切片集群模式

                                       1 .数据量大
                                       2.总数据切片后分到各个服务器
                          2.副本集群模式
                                      1.数据量不大
                                      2.在每个服务器都备份相同的数据

 

4.redis集群的一致性Hash算法


           4.1.例子


                       1.一份data需要存到redis集群(A和B两台)
                                        1.对data的key进行hash取模
                                                             1.hash(key) % 2
                                                                                1.如果结果为0就存到第一台(A)
                                                                                 2.如果结果为1就存到第二台(B)
                        2.问题:如果新增一台数据库
                                        1.需要取出之前所有的数据再hash(key) % 3再重新存入集群
                                                         1.比较麻烦
                                                          2.解决方法:hash一致性算法


          4.2.一致性Hash算法


                        1.hash环

                                   1.例子:
                                           1.环上分布着点
                                            2.设换上有2^32的数据
                                            3.将两台redis服务器映射到环上

                                                                  映射方法:
                                                                         1.hash(ip) %2^32
                                                                         2.结果是0-2^32
                                                                         3.一定能映射到环上
                                                                         4.把要存储的数据也要映射到环上
                                                                                             1.hash(key) % 2^32

                                                                                              2.映射到环上
                         2.存储策略
                                           1.想要知道某一个数据存在哪一个redis服务器:数据往后对环顺时针查找
                                           2.顺时针找到的第一个redis就是他存在的那个分布式数据库中
                        3.新增一台redis数据库
                                           1.只要hash(ip)映射到环上,按照存储策略的规则查找就知道哪些数据存在这个redis上
                                           2.只涉及三个数据库的数据交换
                                           3.无需重新对所有数据进行hash
                        4.弊端
                                          1.容易发生数据倾斜
                                                         1.大部分的数据存在少量的结点上
                                                         2.环上redis如果hash值的很近就会造成少量数据在s1上,大部分数据都在s1上
                                           2.解决
                                                         1.使用虚拟结点使数据存储比较均衡


5.缓存雪崩和缓存击穿


          1.缓存击穿是一条数据失效
          2.缓存雪崩是多条数据失效
          3.缓存雪崩和缓存击穿本质都是缓存穿透
          4.缓存雪崩和缓存击穿是缓存穿透的特殊表现

 

6.缓存击穿


         6.1.概述

                               缓存中一条数据失效(超时时间已过),其请求会打到DB


         6.2.没有特别热门的数据无需解决


         6.3.解决方案


                         1.分布式锁
                                    1.zookeeper

                                                       1.zookeeper处理成功会先同步数据到其他结点再返回结果
                                                       2.当主节点宕机会选取新leader时有ZAB集群架构保护协议
                                                       3.ZAB保证了有这个lock的follower结点被选举为新leader
                                                       4.牺牲可用性来换数据一致性
                                    2.分布式锁解决缓存击穿
                                                 1.高并发访问下redis中没有查到数据
                                                 2.多个线程在访问DB前先进行抢锁保证只有一个线程可以访问DB
                                                 3.拿到数据后缓存进redis
                                                 4.其他的线程就可以直接在redis拿到数据
                                                 5.效率低
                        2.直接把查询出来的数据缓存到redis中
                                    1.允许部分并发请求直接访问DB,取到数据后缓存到redis
                                    2.后序的请求就可以从redis取出数据

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值