Redis持久化
:如果用户将数据保存到内存中,如果服务器断电或者宕机则内存数据将清空,导致缓存数据清空.
持久化文件使用规则:
当程序正常运行时会生成持久化文件.如果当服务器宕机后重启时.会根据配置文件中指定的持久化文件进行数据的恢复.
RDB模式:
说明:
- RDB模式是redis默认的持久化策略
- RDB模式能够定期实现内存数据持久化(可能会丢失数据)
- RDB模式每次操作时记录内存数据的快照.持久化文件较小.
- RDB模式持久化效率高.
- RDB模式操作是同步的.(阻塞)
AOF模式
说明:
- AOF模式是对RDB模式的补充.可以实现数据的实时持久化.
- AOF模式默认是关闭的.需要手动开启.
- AOF模式记录的是用户的操作过程.会有大量的持久化文件生成.数据恢复时效率低. 需要定期维护持久化文件
- AOF的优先级高于RDB模式.2个文件同时开启时以AOF文件为准.
- AOF模式异步操作.
Redis内存优化策略
1.1 LRU算法
LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。
时间T:数据自上一次到现在的时间.
1.2 LFU算法
说明:LFU算法是redis5以后才提出的.
LFU(least frequently used (LFU) page-replacement algorithm)。即最不经常使用页置换算法,要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。但是有些页在开始时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。
使用次数越少越先被删除.
1.3 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 不删除内存数据,如果内存溢出报错返回.
1.4 Redis分片机制
说明:将多台redis搭建成分片的结构.实现内存的扩容.
1.5 hash一致性算法
Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
规则:
- 同一个数据hash的结果必定相同.
- 获取结果不能反推输入值.
- hash值有32位16进制数 2^128次
二进制: 逢2进1 0,1
八进制: 逢8进1 0-7
十六进制 逢16进制1 0-9-A(10)-F(15)
1.5.1 均衡性
说明:因为采用hash一致性算法,可能导致数据负载不均.所以hash一致性提出虚拟节点解决负载均衡的问题.
1.5.2 单调性
说明:当节点新增时,其中的数据会自动的迁移.
注意事项:节点只能新增,不能减少,因为少了内存缺失,数据丢失.
1.5.3 分散性
说明:由于分布式的部署,某个节点不能获取全部的内存空间.一个key可能会有多个位置.
1.5.4 负载
说明:由于分布式部署.某个节点不能获取全部的内存空间.一个位置可能保存了多个数据.
如果有效降低分散性和负载:尽可能的使用同一块内存区域.