五、RDB和AOF的优缺点
5.1 RDB持久化的优缺点
优点:
RDB文件紧凑,体积小,网络传输快,适合全量复制;恢复速度比AOF快很多。当然,与AOF相比, RDB最重要的优点之一是对性能的影响相对较小。
(体积小,恢复速度更快,对性能影响较小。)
缺点:
- RDB文件的致命缺点在于其数据快照的持久化方式决定了必然做不到实时持久化,而在数据越来越重要的今天,数据的大量丢失很多时候是无法接受的,因此AOF持久化成为主流。
- 此外,RDB文 件需要满足特定格式,兼容性差(如老版本的Redis不兼容新版本的RDB文件)。
- 对于RDB持久化,一方面是bgsave在进行fork操作时Redis主进程会阻塞,另一方面,子进程向硬盘写数据也会带来IO压力。
(实时性差、兼容性差、在fork子进程时会阻塞父进程。)
5.2 AOF持久化的优缺点
- 与RDB持久化相对应,AOF的优点在于支持秒级持久化、实时性好、兼容性好,缺点是文件大、恢复速度慢、对性能影响大。
- 对于AOF持久化,向硬盘写数据的频率大大提高(everysec策略下为秒级),IO 压力更大,甚至可能造成AOF追加阻塞问题。
- AOF文件的重写与RDB的bgsave类似,会有fork时的阻塞和子进程的 IO 压力问题。相对来说,由于AOF向硬盘中写数据的频率更高,因此对Redis主进程性能的影响会更大。
六、Redis性能管理
6.1 查看Redis内存使用
方法一:进入redis数据库查看 redis-cli 127.0.0.1:6379> info memory 方法二:命令行查看 redis-cli info memory 复制代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|
6.2 内存碎片
6.2.1 内存碎片率如何计算:
内存碎片率=Redis向操作系统申请的内存 / Redis中的数据占用的内存
mem_fragmentation_ratio = used_memory_rss / used_memory
- mem_fragmentation_ratio:内存碎片率。
- used_memory_rss:是Redis向操作系统申请的内存。
- used_memory:是Redis中的数据占用的内存。
- used_memory_peak:redis内存使用的峰值。
6.2.2 内存碎片如何产生的?
- Redis内部有自已的内存管理器,为了提高内存使用的效率,来对内存的申请和释放进行管理。
- Redis中的值删除的时候,并没有把内存直接释放、交还给操作系统,而是交给了Redis内部有内存管理器。
- Redis中申请内存的时候,也是先看自己的内存管理器中是否有足够的内存可用。
- Redis的这种机制,提高了内存的使用率,但是会使Redis中有部分自己没在用,却不释放的内存,导致了内存碎片的发生。
6.2.3 跟踪内存碎片率
跟踪内存碎片率,对理解Redis实例的资源性能是非常重要的:
- 内存碎片率在1到1.5之间是正常的,这个值表示内存碎片率比较低,也说明Redis 没有发生内存交换。
- 内存碎片率超过1.5,说明Redis消耗了实际需要的物理内存的150%,其中50%是内存碎片率。
- 内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换(使用虚拟内存,会降低性能)。需要增加可用物理内存或减少Redis内存占用。
6.2.4 解决碎片率大的问题:
- 如果你的Redis版本是4.0以下的,需要在redis-cli 工具上输入shutdown save命令,让Redis数据库执行保存操作并关闭Redis服务,再重启服务器。Redis服务器重启后,Redis 会将没用的内存归还给操作系统,碎片率会降下来。
- Redis4.0版本开始,可以在不重启的情况下,线上整理内存碎片,将未使用的内存归还给操作系统。
config set activedefrag yes #自动碎片清理 memory purge #手动碎片清理 复制代码
6.3 内存使用率
redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换。
避免内存交换发生的方法:
- 针对缓存数据大小选择安装Redis 实例
- 尽可能的使用Hash数据结构存储
- 设置key的过期时间
6.3.1 内回收key
内存清理策略,保证合理分配redis有限的内存资源。
当内存使用达到设置的最大阈值时,需选择一种key的回收策略,默认情况下回收策略是禁止删除(noenviction)。
配置文件中修改 maxmemory-policy 属性值:
vim /etc/redis/6379.conf ---598行---- maxmemory-policy noenviction #修改max-memory-policy属性值 ##回收策略有以下几种:## ●volatile-lru #使用LRU算法从已设置过期时间的数据集合中淘汰数据 (移除最近最少使用的key,针对设置了TTL的key) ●volatile-ttl #从已设置过期时间的数据集合中挑选即将过期的数据淘汰 (移除最近过期的key) ●volatile-random #从已设置过期时间的数据集合中随机挑选数据淘汰 (在设置了TTL的key里随机移除) ●allkeys-lru #使用LRU算法 从所有数据集合中淘汰数据 (移除最少使用的key,针对所有的key) ●allkeys-random #从数据集合中任意选择数据淘汰(随机移除key) ●noenviction #禁止淘汰数据(不删除直到写满时报错) 复制代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|
七、Redis的优化有哪些
设置客户端连接超时时间、客户端最大连接数、自动碎片清理、最大内存阀值、key回收策略。
1、设置Redis客户端连接的超时时间
vim /etc/redis/6379.conf -----114行------ 114 timeout 0 #单位为秒(s),取值范围为0~100000。默认值为0,表示无限制,即Redis不会主动断开连接,即使这个客户端已经空闲了很长时间。 #例如可设置为600,则客户端空闲10分钟后,Redis会主动断开连接。 #注意:在实际运行中,为了提高性能,Redis不一定会精确地按照timeout的值规定的时间来断开符合条件的空闲连接,例如设置timeout为10s,但空闲连接可能在12s后,服务器中新增很多连接时才会被断开。 复制代码
网络异常,图片无法展示
|
2、设置 redis客户端最大连接数
redis客户端最大连接数默认为10000。
vim /etc/redis/6379.conf -----540行------ 540 # maxclients 10000 #若不设置,默认是10000 复制代码
网络异常,图片无法展示
|
查看 redis 当前连接数:
[root@yuji ~]# redis-cli 127.0.0.1:6379> info clients #查看redis当前连接数 # Clients connected_clients:1 #redis当前连接数的为1 client_recent_max_input_buffer:2 client_recent_max_output_buffer:0 blocked_clients:0 复制代码
网络异常,图片无法展示
|
查看 redis 允许的最大连接数:
127.0.0.1:6379> config get maxclients 1) "maxclients" 2) "10000" #redis允许的最大连接数默认为10000 复制代码
网络异常,图片无法展示
|
3、设置redis自动碎片清理
config set activedefrag yes #自动碎片清理 memory purge #手动碎片清理 复制代码
网络异常,图片无法展示
|
4、设置redis最大内存阈值
内存阈值如果不设置,则没有限制,直到把服务器的内存干满、之后会使用交换分区。
设置内存阈值后,不会使用swap交换分区。且如果设置了key回收策略,当内存使用达到设置的最大阈值时,系统会进行key回收。
vim /etc/redis/6379.conf -----567行------ 567 # maxmemory <bytes> 568 maxmemory 1gb #例如设置最大内存阈值为1gb 复制代码
网络异常,图片无法展示
|
5、设置key回收策略
当内存使用达到设置的最大阈值时,需选择一种key的回收策略,默认情况下回收策略是禁止删除(noenviction)。
设置key回收策略后,则当redis内存使用达到设置的最大阈值时,系统会进行key回收,释放一部分内存。
vim /etc/redis/6379.conf ---598行---- maxmemory-policy noenviction #需要修改max-memory-policy属性值 ##回收策略有以下几种:## ●volatile-lru #使用LRU算法从已设置过期时间的数据集合中淘汰数据(移除最近最少使用的key,针对设置了TTL的key) ●volatile-ttl #从已设置过期时间的数据集合中挑选即将过期的数据淘汰(移除最近过期的key) ●volatile-random #从已设置过期时间的数据集合中随机挑选数据淘汰(在设置了TTL的key里随机移除) ●allkeys-lru #使用LRU算法 从所有数据集合中淘汰数据(移除最少使用的key,针对所有的key) ●allkeys-random #从数据集合中任意选择数据淘汰(随机移除key) ●noenviction #禁止淘汰数据(不删除直到写满时报错) 复制代码
网络异常,图片无法展示
|