Redis持久化机制
redis是用来做缓存。
持久化:数据从内存->磁盘
Redis官方提供了两种持久化机制。
- 快照(SNAPSHOT)RDB
- AOF(Append Only File)只追加日志文件
快照
特点:这种方式可以把某一时刻所有数据存入硬盘中,Redis默认的持久化机制保存的文件是以rdb形式保存。
快照的生成方式
- 客户端指令:BGSAVE或SAVE指令
- 服务器配置自动触发
- 配置文件中的触发策略
- 关闭redis服务
rdb文件就是快照持久化的核心,定期备份rdb文件。
AOF持久化
保存执行的命令。把操作数据的指令保存到一个aof文件里,Redis默认是不开启AOF持久化。
需要我们手动开启AOF持久化。
AOF持久化会自动忽略读指令,只记录写指令。
日志追加频率
- always:每个redis写的命令同步,降低redis效率。
- everysec:每秒执行一次同步,有延迟。
- no:由操作系统决定何时同步。
如果AOF持久化和RDB持久化同时开启,会以AOF为准。
AOF文件具备了一个自我修复的能力。
./redis-check-aof --fix appendonly.aof
AOF文件重写
# This base size is compared to the current size. If the current size is
# bigger than the specified percentage, the rewrite is triggered. Also
# you need to specify a minimal size for the AOF file to be rewritten, this
# is useful to avoid rewriting the AOF file even if the percentage increase
# is reached but it is still pretty small.
#
# Specify a percentage of zero in order to disable the automatic AOF
# rewrite feature.
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
如果当前aof文件的大小已经比64mb大了100%,自动指定重写AOF文件的指令。
Redis事务
Redis的事务是不支持回滚的。
开启事务:
MULTI
提交事务:
EXEC
放弃事务:
DISCARD
悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都会认为别人要修改,每次拿数据时都会上锁,别人想拿这个数据,就会被锁住,直到另外一方释放锁。在传统的关系型数据库中用到了很多的悲观锁,比如行锁,表锁,读锁,写锁。
乐观锁:顾名思义,就是很乐观,每次去拿数据的时候会认为别人不会修改,所以不会上锁。由于在开发中,所有的删除都是逻辑删除,都是修改操作,version版本号。当执行修改操作时,要提交的版本号必须大于当前版本号才能执行更新。
数据删除与淘汰策略
Redis中数据的特征
Redis是一种内存级数据库,所有数据都是存在内存中,内存中的数据可以通过TTL
获取器状态。
TTL
返回的值三种情况:
- 正数:代表该数据在内存中还能存活的时间
- -1:永久有效的数据
- -2:已经过期的数据或被删除的数据或未定义的数据
删除策略就是针对已过期数据的处理策略,已过期的数据是不是真的就立即删除了?
其实也不是,我们实际上有多种删除策略。
时效性数据的存储
所有的过期数据会存放在一块独立的存储空间,Hash结构,key就是内存地址,value是过期时间,保存了所有的key的过期描述,在最终进行过期处理的时候,对该空间的数据进行监测。
数据删除策略
目标:在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成redis性能的下降,甚至引发服务器宕机或内存泄漏。
- 1.定时删除
- 2.惰性删除
- 3.定期删除
定时删除
创建一个定时器,当key设置了过期时间,且过期时间到达时,由定时器任务立即执行对键的闪出去操作。
- 优点:节约内存,到时就删除,快速释放不必要的内存占用。
- 缺点:CPU压力很大,无论CPU此时负载量多高,占用CPU,会影响redis的响应时间。
- 总结:用CPU性能换取存储空间。
惰性删除
数据到达过期时间,不做处理。等下次访问该数据时,我们需要判断:
- 如果未过期,返回数据
- 如果过期,删除,返回不存在
- 优点:节约CPU性能,必须删除的时候才删除
- 缺点:内存压力很大,出现长期占用内存的资源
- 总结:用存取空间换取CPU性能
定期删除
其实是上两种策略的折中方案!
- Redis启动服务器初始化的时候,读取一个配置,
server.hz
,默认是10 - 每秒中实行一次配置。