赞
踩
这也是Redis相关一些面试可能问到的知识点,但是又不知道归于哪一类,就挤到这篇文章
Redis官方文档
Redis毕竟是基于内存的,内存空间相对于磁盘来说比较小,想比较好的应用就只有两种方法:开源与节流
开源(扩展空间):集群方式,一台机器空间不够,多几台机器就好了
节流:有限的空间尽可能存最有效的信息,将暂时不用的数据清除掉,用过期可能更符合语境(只是缓存不存这个,不是说在数据库删除这部分数据)
回收策略
当maxmemory限制达到的时候Redis会使用的行为由 Redis的maxmemory-policy配置指令来进行配置。
noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
allkeys-random: 回收随机的键使得新添加的数据有空间存放。
volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
根据情况进行策略设置
LRU是什么?百度下吧,我这篇文章如果再写这个也太长了。原理理解不复杂。
注意:volatile-XX 是回收 【设置了过期时间,但是过期时间不一定到了】的键
如何设置过期时间下面两种方法
当设置过期时间后,如果第二次修改或删除 过期时间就没有了(除非是公司有硬性要求,否则很多时候设置的时候记得设置过期时间,但是修改时就不记得这个设置,导致本来要设置过期时间的键变成永久键了)
//设置book存活时间为5秒
setx book 5 Java核心技术
//设置book存活时间为5秒
set book Java编程思想
expire book 5
惰性删除和定时删除就相当于平时的自检,确保空间够用,不会到达最大空间,使其不触发回收策略。那6种回收策略就相当于最后的保险了。可以发现空间不够就回收,丢到的数据不全部是设置了过期时间的数据。当然并不是说要极力避免这个,这个和JAVA的垃圾回收又不一样,代价没有那么大。有可能是因为使用时为了方便根本就没有设置过期时间(因为只要做修改就要重新设置,不是很方便),这个时候惰性删除还是定时删除压根就不会触发
Redis回收是代表这块空间Redis可以再次使用,不代表这块空间还给操作系统了。所以有时候发现回收了很多东西后,Redis还是占有很多空间,那是因为Redis是基于Hash的,内存分布很散,但是对于操作系统来说,内存是按页分配的,如果这样有一小部分被Redis占用,操作系统就认为这页是被Redis占用的。但是Redis可以再使用这个空间。
操作系统的页 可以也百度查下
不知道这个布隆过滤器和弗雷尔卓德之心什么关系?弗雷尔卓德之心举防盗门可以给后排挡部分伤害。都起到拦截作用。
嘿,扯远了
布隆过滤器,其过滤作用,经过布隆过滤器,判断不存在的数据一定不存在,判断存在的数据不一定存在。这样就可以起到将一大批无效访问之间给予答复的效果,减去访问数据库的压力。
其原理及其简单,只要明白原理就知道其特性的原因了(没找到好的画图工具,用excel将就下):
利用位图(其实就是String类型,有位图操作。百度搜Redis位图)
hash函数都是不一样的
举例子:(假设我们布隆过滤器是只有三个hash函数)
输入 19 对于hash1,hash2,hash3分别为 1,2,6
输入18,对应2,2,3
输入500,对应 6,7,8
如下图:(位图存的是0或1,一代表有数据)
现在我检查 19,hash1,hash2,hash3分别有对应(1,2,6)数据,说明该数据可能存在
检查20,hash1,hash2,hash3对应(1,2,4)只有有一位数据不存在,说明该数据一定不存在
检查21,对应(2,7,3),位图检查存在,但是实际上是没有这个数据的。
布隆过滤器表明不存在的数据一定不存在,表明存在的数据,可能不存在
位图越大,判断误差越小
坏处:位图越大,布隆过滤器越准确,但是String最多只能有512M,而且数据越大,迁移的成本就越高(Redis单线程,迁移大数据就会会相对耗时,看起来就比较卡顿或者说不够流畅)
先说一致性Hash,Hash槽其实就是在一致性hash上进行了改进
一致性Hash:网上找了个图,讲的清清楚楚 原文
2^32个节点(hash值0~ 2的32次方-1 )
hash值对应的
(NodeA–NodeB] 之间的数据放在B
(NodeB–NodeC] 存储在C
(NodeC–NodeD]存储在D
(NodeD–NodeA]存储在A
假如NodeC节点宕机,那么(B–D]存储到D
好处:加入机器比较方便;而且机器宕机后能自动换到还在工作的机器
劣势:不能指定hash放在指定的机器
Redis哈希槽一共有16384个节点(2^14),为什么Redis是16384个节点?(百度一下,和心跳监测,判断是否存活有关)
与一致性hash相比,hash槽的改进是可以指定某个hash放在哪个机器上,相当于每个机器是1个槽,可以指定接收那些节点,分配16384个节点、
与一致性hash相比
好处:加入机器也比较方便(指定接收哪些节点,然后新的节点到这个器,将原来的机器上的节点迁移过来),能够指定hash放在某个机器上
缺点:如果某个节点挂了,这个节点的数据不会迁移到其他节点,这个节点的数据就丢失了,这个时候就体现除了主从备份的好处,主节点挂了,从节点会成为新的节点
一般是这样的集群
(A,A1,A2,B,B1,B2,C,C1,C2)----ABC系列内容不一致,A,A1,A2是主从复制,内容一致
**另外:**我在网上看到说,如果B系列整个宕机(如果B宕机,B1,B2会选一个主节点出来,保证使用),就是说B,B1,B2宕机。会导致整个集群不可用ABC系列都不可用。但是我对这个是有点怀疑的。我不是很理解B系列宕机怎么影响AC了。只是说B系列不可用了而已。不应该还会影响AC【注:这是我自己的理解,不一定是对的,有没有人能帮助我理解下】
这个下次吧
仰天大笑出门去,我辈岂是蓬蒿人
博主:五更依旧朝花落
首次发布时间:2020年4月8日20:16:33
最后更新时间:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。