Redis持久化
持久化概述与持久化
持久化概述
- Redis是运行在内存中,内存中的数据断电丢失
- 为了能够重用Redis数据,或者防止系统故障,需要将Redis中的数据写入到磁盘空间中,即持久化
持久化分类
- RDB方式:创建快照的方式获取菜一时刻Redis中所有数据的副本
- AOF方式:将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化
RDB快照好处:能保存环境数据特别完整,方便恢复,不好的地方,两个快照点之间,如果突然断电,会照成部分数据丢失,所以说RDB不是连续性的
AOF以日志方式记录数据,是连续性的,两个相辅相成
RDB方式持久化
●RDB是Redis的默认持久化方式
●默认文件名dump.rdb
[root@redis utils]# cd /var/lib/redis/6379/
[root@redis 6379]# ls
dump.rdb
●触发条件:
- 在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
- 执行save或者是bgsave(异步)命令
- 执行flushall命令,清空数据库所有数据
- 执行shutdown命令,保证服务器正常关闭且不丢失任何数据
●优缺点:
- 适合大规模的数据恢复
- 如果业务对数据完整性和一致性要求不高,RDB是很好的选择
- 数据的完整性和一致性不高
- 备份时占用内存
●通过RDB文件恢复数据
- 将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务即可
配置RDB持久化:
vim /etc/redis/6379.conf
###默认已经帮你开启的优化,保存规律###,这些值可以改
219 save 900 1 ##执行1次操作,900秒保存一次
220 save 300 10 ##执行10次操作,300秒保存一次
221 save 60 10000 ##执行10000次操作,60秒保存一次
####默认已经帮你开启的优化,RDB模式持久化###
254 dbfilename dump.rdb ##RDB文件名称
264 dir /var/lib/redis/6379 ##这个是文件路径,你可以出去查看
##默认开启的,是否执行压缩####
242 rdbcompression yes
AOF持久化
- Redis默认不开启
- 弥补RDB的不足(数据的不一致性)
- 采用日志的形式来记录每个写操作,并追加到文件中
- Redis重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
●根据AOF文件恢复数据
- 将appendonly.aof文件拷贝到redis安装目录的bin目录下,重启redis服务即可
配置AOF持久化
####打开配置文件#########AOF模式(用日志形式恢复)持久化########默认不开启
vim /etc/redis/6379.conf
#####开启AOF模式持久化############
700 appendonly yes 开启AOF模式,修改为yes
######更改同步规则,开启实时同步##################
729 appendfsync always 这个表示实时同步
730 # appendfsync everysec 每秒进行同步
731 # appendfsync no 不同步
########开启忽略最后一条存在问题的语句########
796 aof-load-truncated yes
Redis的优化(内存方向)
AOF重写机制
●重写的机制:
- AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多,当AOF文件的大小超过设置阈值时,redis就会
- 对AOF文件的内容压缩
●重写的原理:
- redis会fork出一条新进程,读取内存中的数据(不读取旧文件),并重新写到一个临时文件中,最后替换就得aof文件
配置AOF重写:
752 no-appendfsync-on-rewrite yes ##因为有很多冗余的数据,我们开启去重功能,但是去重也有规则,看下两条
771 auto-aof-rewrite-percentage 100 ##当前AOF文件大小是上次日志重写时AOF文件大小两倍时,开启重写
772 auto-aof-rewrite-min-size 64mb ##文件大小为64mb时,开启压缩到硬盘当中,控制它在内存使用得大小,如果你要用它,它会到内存中解压
Redis性能管理
查看Redis内存使用
[root@localhost bin]# /usr/local/bin/redis-cli
127.0.0.1:6379> INFO memory ###查看redis内存情况
# Memory
##前两条为 内存使用总量
used_memory:853304
used_memory_human:833.30K
used_memory_rss:14655488
used_memory_rss_human:13.98M
used_memory_peak:853304
used_memory_peak_human:833.30K
used_memory_peak_perc:100.01%
used_memory_overhead:841078
used_memory_startup:791384
..。。。。。。。.....//省略部分
llocator_rss_bytes:11468800
rss_overhead_ratio:1.10
rss_overhead_bytes:1314816
mem_fragmentation_ratio:18.04 ##内存碎片率
mem_fragmentation_bytes:13843208
什么是内存碎片率?
操系统分配的内存值used_ memory _rss除以redis使用的内存值 |
---|
used_ _memory计算得出 |
内存碎片是由操作系统低效的分配/回收物理内存导致的 |
不连续的物理内存分配 |
跟踪内存碎片率对理解redis实例的资源性能是非常重要的 |
内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低 |
内存碎片率超过1.5,说明redis消耗了实际需要物理内存的150%,其中50%是内存碎片率 |
内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换 |
什么是内存使用率?
redis实例的内存使用率超过可用最大内存,操作系统将开始进行 |
---|
内存与swap空间交换 |
避免内存交换 |
针对缓存数据大小选择 |
尽可能的使用Hash数据结构 |
设置key的过期时间 |
回收Key
●保证合理分配redis有限的内存资源
●当内存使用达到设置的最大阀值时,需要选择一种key的回收策略
●默认情况下回收策略是禁止删除
●redis.conf配置文件中修改maxmemory-policy属性值
- volatile-lru:使用LRU算法从已设置过期时间的数据集合中淘汰数据
- volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰(建议使用)
- volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰
- allkeys-lru:使用LRU算法从所有数据集合中淘汰数据
- allkeys-random:从数据集合中任意选择数据淘汰
- no-enviction:禁止淘汰数据