redis集群数据存储原理
hash槽算法/分区算法:
RedisCluster采用此分区,所有的键根据哈希函数(CRC16[key]%16384)映射到0-16383槽内,共16384个槽位,每个节点维护部分槽及槽所映射的键值数据.根据主节点的个数,均衡划分区间.
算法:哈希函数: Hash()=CRC16[key]%16384
当向redis集群中插入数据时,首先将key进行计算.之后将计算结果匹配到具体的某一个槽的区间内,之后再将数据set到管理该槽的节点中.
题目分析
redis中最多存储16384个key----错
例:CRC16(KEY1)%16384 = 2000/CRC16(KEY2)%16384 = 2000
表示key1和key2都归节点1进行管理. 至于节点到底是否能够存储 由内存决定.
Redis集群中最多有16384台主机,
Redis集群中最少有3台主机.
Redis持久化策略
持久化需求说明
Redis数据都保存在内存中,如果内存断电则导致数据的丢失.为了保证用户的内存数据不丢失,需要开启持久化机制.
持久化----定期将内存中的数据保存到磁盘中.
持久化分类
说明:Redis中的持久化方式主要有2种.
方式1: RDB模式 dump.rdb 默认的持久化方式
方式2: AOF模式 appendonly.aof 默认关闭的需要手动的开启
RDB模式
1.说明:
RDB模式是Redis中默认的持久化策略.
2.特点:
1).RDB模式可以实现定期的持久化,但是可能导致数据丢失.(类似冷备份)
2).RDB模式作的是内存数据的快照, 并且后拍摄的快照会覆盖之前的快照.所以持久化文件较小.恢复数据的速度较快. 工作的效率较高.
3.命令:
用户可以通过命令要求redis进行持久化操作.
1).save 是同步操作 要求redis立即执行持久化操作. 用户可能会陷入阻塞状态.
2).bgsave 是异步操作, 开启单独的线程执行持久化操作. 持久化时不会影响用户的使用. 不能保证立即马上执行.
4.持久化策略说明:
LG: save 900 1 redis在900秒内执行一次set操作时则持久化一次.
用户操作越频繁则持久化的周期越短.
5.持久化目录: 可以执行持久化文件生成的位置.dir ./
6.持久化文件名称的设定.dbfilename dump.rdb
AOF模式
1.特点:
1).AOF模式默认的条件下是关闭状态,需要手动的开启.
2).AOF模式记录的是用户的执行的状态.所以持久化文件占用空间相对较大.恢复数据的速度较慢.所以效率较低.
3).可以保证用户的数据尽可能不丢失.
2.配置:
1).开启AOF配置appendonly yes
2).AOF模式的持久化策略
appendfsync always 如果用户执行的了一次set操作则持久化一次
appendfsync everysec aof每秒持久化一次
appendfsync no 不主动持久化.
关于RDB/AOF模式特点
1.如果用户可以允许少量的数据丢失可以选用RDB模式(快).
2.如果用户不允许数据丢失则选用AOF模式.
3.实际开发过程中一般2种方式都会配置. 一般主机开启RDB模式,从机开启AOF模式.
实际情况
如果在线上执行了FLUSHALL命令怎么办?
---应该将AOF模式中flushAll删除,之后重启redis即可.
Redis内存优化
Redis可以当做内存使用,但是如果一直往里存储不删除数据,则必然导致内存溢出.
LRU算法
1.LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。
2.维度:时间T
3.LRU算法是当下实现内存清理的最优算法.
LFU算法
1.LFU(least frequently used (LFU) page-replacement algorithm)。即最不经常使用页置换算法,要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。但是有些页在开始时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。
2.维度: 引用次数
Random算法---随机
TTL算法
监控剩余的存活时间,将存活时间少的数据提前删除.
Redis内存优化策略
1.volatile-lru 在设定了超时时间的数据中,采用lru算法.
2.allkeys-lru 所有数据采用lru算法
3.volatile-lfu 在超时的数据中采用lfu算法
4.allkeys-lfu -> 所有数据采用lfu算法
5.volatile-random -> 设定超时时间的数据采用随机算法
6.allkeys-random -> 所有数据随机删除
7.volatile-ttl -> 删除存活时间少的数据
8.noeviction -> 不会删除数据,如果内存溢出报错返回.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。