持久化概述
- redis是运行在内存中,内存中的数据断电丢失
- 萎了能够重用redis数据,或者防止系统故障,需要将redis中的数据写入到磁盘空间中,即持久化
持久化分类
- RDB方式:创建快照的方式获取某一时刻redis中所有数据的副本
- AOF方式:将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化
RDB持久化
- redis的默认持久化方式
- 默认文件名为:dump.rdb
- 优缺点:
1、适合大规模的数据恢复
2、如果业务对数据完整性和一致性要求不高,RDB是很好的选择
3、数据的完整性和一致性不高
4、备份时占用内存
数据恢复
- 通过RDB文件恢复数据
将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务即可 - 配置文件选项
vim /etc/redis/6379.conf
save 900 1 ##900秒之内至少发生一次写操作
save 300 10 ##300秒之内至少发生10次写操作
save 60 10000 ##60秒之内发生至少10000次写操作
##只要满足以上其一都会触发快照操作,注释掉所有的save项表示关闭RDB
dbfilename dump.rdb ##RDB文件名称
dir /var/lib/redis/6379 ##RDB文件路径
rdbcopression yes ##是否进行压缩
AOF持久化
- redis默认不开启
- 弥补RDB的不足(数据的不一致性)
- 采用日志的形式来记录每个写操作,并追加到文件中
- redis重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
数据恢复
- 根据AOF文件恢复数据:
将appendonly.aof文件拷贝到redis的安装目录的bin目录下,重启redis服务即可 - 配置文件选项:
vim /etc/redis/6379.conf
appendonly yes ##开启AOF持久化
appendfilename "appendonly.aof" ##AOF文件名称
# appendfsync always ##同步持久化,每次发生数据变化会立刻写入磁盘
appendfsync everysec ##默认推荐,每秒异步记录一次(默认值)
# appendfsync no ##不同步,交给操作系统决定如何同步
aof-load-truncated yes ##忽略最后一条可能存在问题的指令
AOF重写
AOF的重写机制:
1、AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多
2、当AOF文件的大小超过所设定的阈值时,redis就会对AOF文件的内容压缩
AOF重写的原理:
redis会fork出一条新进程,读取内存中的数据(并没有读取旧文件),并重新写到一个临时文件中,最后替换旧的aof文件
AOF的重写配置:
redis性能管理
[root@localhost ~]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> info memory
# Memory
used_memory:2654624
used_memory_human:2.53M ##内存使用总量
used_memory_rss:13500416
used_memory_rss_human:12.88M
used_memory_peak:6746992
used_memory_peak_human:6.43M
used_memory_peak_perc:39.35%
used_memory_overhead:2565010
used_memory_startup:1449664
used_memory_dataset:89614
used_memory_dataset_perc:7.44%
allocator_allocated:3074920
allocator_active:3395584
allocator_resident:10424320
total_system_memory:3958075392
total_system_memory_human:3.69G
used_memory_lua:37888
used_memory_lua_human:37.00K
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:1.10
allocator_frag_bytes:320664
allocator_rss_ratio:3.07
allocator_rss_bytes:7028736
rss_overhead_ratio:1.30
rss_overhead_bytes:3076096
mem_fragmentation_ratio:5.17 ##内存碎片率
mem_fragmentation_bytes:10886816
mem_not_counted_for_evict:82
mem_replication_backlog:1048576
mem_clients_slaves:16922
mem_clients_normal:49694
mem_aof_buffer:82
mem_allocator:jemalloc-5.1.0
active_defrag_running:0
lazyfree_pending_objects:0
内存碎片率
- 操作系统分配的内存值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-Iru:使用LRU算法从所有数据集合中淘汰数据
- allkeys-random:从数据集合中任意选择数据淘汰
- no-enviction:禁止淘汰数据