1. redis过期时间原理:
- 消极方法: 对于执行get(key)等命令的时候,判断当前key是否过期,如果过期,则执行删除操作.
- 积极方法: 周期性的从设置了过期时间的key中挑选一部分,进行删除操作.
1). 随机测试20个带有timeout信息的key;
2). 对其中已经过期的key进行删除;
3). 如果25%的key被删除,则重复执行整个流程;
2. redis持久化操作
· RDB(快照) -Redis Database
1). 当符合某些条件的时候,fork子进程会生成dump.rdb快照文件;
默认配置规则(redis.conf文件中),如下:
save | seconds | changes | describe(描述) |
---|---|---|---|
save | 900 | 1 | 在900s内,有1个key发生变化,生成一次快照 |
save | 300 | 10 | 在300s内,有10个key发生变化,生成一次快照 |
save | 60 | 10000 | 在60s内,有10000个key发生变化,生成一次快照 |
2).主动命令生成快照;
save: 会阻塞所有客户端请求.
bgsave: 在后台异步快照,不会阻塞客户端请求.
slave: redis从节点发送sync命令后,主节点执行bgsave命令.
flushall: 清空整个redis服务器的数据(删除所有数据库的所有key).
shutdown: 关闭redis服务器.
flushall和shutdown命令,在执行相关操作之前都会执行bgsave操作.
· AOF(添加日志文件) -Append Only File
1 在redis.conf文件中, 修改append only属性, 改为yes,启动即可. 开启后会生成一个 .aof后缀的文件.
2.当AOF开启后,redis重启默认从aof文件中获取数据.
3.aof文件只记录对数据变更的命令操作.
属性(redis.conf文件内) | 属性值 | 描述 |
---|---|---|
appendonly | no/yes | AOF持久化:no:关闭(缺省值)/yes:开启 |
appendfilename | appendonly.aof | aof持久化文件名称(默认appendonly.aof) |
appendfsync | always/everysec/no | aof持久化策略 |
aof持久化策略:
- always: 同步持久化,每次发生数据变化,会立刻写入磁盘中.性能较差,数据完整性比较好(慢,安全);
- everysec: 每秒异步记录一次(缺省值);
- no: 不同步;
aof重写:
- AOF持久化是通过保存被执行的写命令来记录数据库状态的,所以随着服务器运行时间的流逝,AOF文件中的内容越来越多,文件体积越来越大,如果不加以控制,会对redis服务器甚至宿主计算器造成影响;
- AOF重写不需要对原有的AOF文件进行任何写入和读取,针对的是redis数据库中键的当前值进行操作;
AOF配置重写触发机制:
属性(redis.conf文件内) | 属性值 | 描述 |
---|---|---|
auto-aof-rewrite-percentage | 100 | aof文件增长率 |
auto-aof-rewrite-min-size | 64mb | aof文件需要重写的最小字节数(单位:mb) |
rewrite操作具体流程:
1). redis fork一个子进程;
2). 子进程基于当前内存中的数据, 构建日志, 开始往一个新的临时AOF文件中写入日志;
3). redis主进程, 接收到client新的写操作之后, 在内存中写入日志, 同时新的日志也继续写入旧的AOF文件;
4). 子进程写完新的日志文件之后, redis主进程将内存中的新日志再次追加到新的AOF文件中;
5). 用新的日志文件替换旧的日志文件;
3. redis内存回收策略
- 由redis.conf配置文件中的maxmemory-policy属性决定redis内存回收策略;
maxmemory-policy属性值:
maxmemory-policy属性值 | 描述 |
---|---|
noeviction | 当内存使用达到阈值的时候, 所有引起申请内存的命令都会报错 |
allkeys-lru | 在所有的键中采用lru算法删除键, 直到腾出足够的内存为止 |
allkeys-random | 在所有的键中采用随机算法删除键,直到腾出足够的内存为止 |
volatile-lru | 在设置了过期时间的键中采用lru算法删除键,直到腾出足够的内存为止 |
volatile-random | 在设置了过期时间的键中采用随机算法删除键,直到腾出足够的内存为止 |
volatile-ttl | 在设置了过期时间的键中, 具有更早过期时间的key优先删除 |
- lru: 全称:Least Recently Used,即最近最少使用.
- 思考:如何保证redis中的数据是热点数据? 可以采用redis内存回收策略中的最少使用数据去淘汰.volatile-lru/allkeys-lru