Redis的宕机条件
什么是Reids宕机
- 宕机是计算机术语,口语里面我们简单的把停掉机器叫做《宕机》,但很多人都叫做“当机”“死机”
宕机条件 : Redis中的主机缺失时,并且没有从机替补,Redis内存数据丢失.这时Redis集群崩溃了.
问题1 : 6台redis 3主3从(1主1从分为3组). 至少Redis宕机几台集群崩溃. 至少2台 集群崩溃.
问题2 : 9台redis 3主6从(1主2从分为3组). 至少宕机几台Redis集群崩溃. 至少5台 集群崩溃.
集群宕机的条件 : 当主机的数量不能保证时集群崩溃.
特点 : 集群中如果主机宕机,那么从机可以继续提供服务
当主机中没有从机时,则向其它主机借用多余的从机.继续提供服务.如果主机宕机时没有从机可用,则集群崩溃 : 9个redis节点,节点宕机5-7次时集群才崩溃
redis分区算法(hash曹算法)
说明: RedisCluster采用此分区,所有的键根据哈希函数(CRC16[key]%16384)映射到0-16383槽内,共16384个槽位,每个节点维护部分槽及槽所映射的键值数据.根据主节点的个数,均衡划分区间.
算法: 哈希函数: Hash()=CRC16[key]%16384
重点 :向redis集群中插入数据时,首先将key进行计算.之后将计算结果匹配到具体的某一个槽的区间内,之后再将数据set到管理该槽的节点中
核心知识:
hash槽算法 : 用来确定 数据归谁管理的问题. 最终的数据都会存储到节点中
槽位 : Redis集群中确实有16384个槽位.但是这些槽位是用来划分数据归谁管理的.不是用来存储数据的. 并且根据hash计算的规则肯能出现碰撞的问题
比如:
hash(key1)%16384=3000
hash(key2)%16384=3000
槽位只是用来区分数据,数据到底能存储多少个完成由redis内存决定
缓存穿透
访问数据库中不存在的数据,缓存中没有访问的数据,那么去数据库里找
说明 : 用户高并发环境下,频繁访问数据库中不存在的数据.导致用户请求直接访问数据库.严重时导致数据库服务器宕机(死机)
布隆过滤器(最佳解决方法)
简介:
布隆过滤器 是1970年由布隆提出的.
它实际上是一个很长的二进制向量和一系列随机映射函数
,布隆过滤器可以用于检索一个元素是否在一个集合中,它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难
核心:
用法 ----- 由二进制向量,hash函数组合
作用 ----- 判断一个元素是否存在于集合中
优点 ----- 占用空间更小/效率更高
缺点 ----- 有一定的误判率(hash碰撞), 删除困难
优点说明:
问题 :如果有1000万的热点数据需要保存到redis缓存中能存吗?
计算 ---- 1000万的数据如果需要存储 大约需要20G左右的空间…
解决 ---- 假设可以通过 0/1的方式,判断数据是否存在.同时占用的空间较小.那么这个问题就解决了.
布隆过滤器应用场景
说明 :
当用户查询服务器时,首先查询布隆过滤器,如果查询存在该数据,则执行后续的流程,如果查询没有该数据,则直接返回.无需执行后续流程.
布隆过滤器算法介绍
作用 :
判断数据是否存在内存中,如果存在的话执行流程,如果不存在那么直接返回
判断 :
- 0 不存在
- 1 存在
操作
将数据保存到布隆过滤器中
算法
- hash (KEY)%长度
关于布隆过滤器优化说明
根据hash原则 数据存在hash碰撞的概率. 则使用布隆过滤器容器造成误判. 如何解决?
解析
- KEY 和 KEY1 的值是一摸一样的,存储在一个位置 这种情况是hash碰撞
- 用户获取的时候 该获取KEY的还是KEY1
优化hash碰撞概率
解析
- 增加二进制向量的长度 (有效的降低hash碰撞的概率)
- 增加hash函数的个数
- 优化后hash碰撞的该路是0.03% (100万数据 100条误判)
- 两个相同的值 计算不同两个hash函数中,向量长度够的话碰撞概率降低
关于布隆在项目中使用过程
缓存击穿
说明 : 在高并发环境下 某个热点数据由于删除/超时导致该数据在缓存中失效. 这时有大量的请求直接访问数据库.导致数据库宕机
某个热点数据突然失效,导致用户直接访问数据库
如何优化:
定期更新热点数据的超时时间
增加多级缓存机制
缓存雪崩:
概念 : 由于Redis中大量的内存数据失效.导致用户访问缓存的命中率太低.大量的请求直接访问数据库.导致数据库宕机
解决方案:
- 1.设定不同的超时时间/动态更新超时时间
- 2.设定多级缓存.