参考资料:
redis 4.x cookbook 中文版;
redis官方文档
注: 本文redis的版本为: 5.0.3
- key-过期:
expire key seconds
设置某个key过期时间;如果seconds为负数,将执行删除;
未设置过期时间,将永不过期;
针对key的set,del,getset操作将会覆盖过期时间;
针对key的lpush,lpop等操作,不会涉及到过期时间的改变;
- key-驱逐策略:
当有写数据的请求到达redis主服务器时,如果redis主服务器中的内存已达到配置的maxMemory
将会按照配置好的驱逐策略,清除key;
大体分为以下几种:
LRU(最近最少使用);
LFU(最少使用);每个key都存储一个使用频率,根据此值做驱逐,频率值会衰减,后面会说;
Random(随机删除),ttl(过期时间剩余最短)
Volatile-lru->针对具有到期设置的key,进行LRU模式淘汰;
allkey-lru->针对所有key,使用LRU模式淘汰;
Volatile-LFU->在设置了过期的key中使用LFU模式淘汰;
allkey-lFU->在所有key中进行LFU模式淘汰;
Volatile-Random->从设置了过期的key中随机淘汰;
allkey-Random->随机淘汰任意key;
volatile-ttl->淘汰过期时间最近的key(Minor TTL);
noeviction->不淘汰任何内容,在写入操作中返回错误;
配置LFU的频率计数器相关:
访问次数达到多少次才启动频率计数器,值为0-255,越高,越难达到;
数值越低对于低访问量的应用来说更好;
lfu-log-factor 10
lfu的频率计数器衰减间隔(单位是分钟);如果设置为0,每次扫描数据库时都将衰减;
lfu-decay-time 1
配置清除过期key的频率;
清除过期key/超时客户端连接 的频率,应当是1-500,通常不建议大于100;(设置为10,意味着每秒10次)
hz 10
允许自适应频率,即,当访问量过大或者客户端过多时,允许redis自行提高频率倍数;
dynamic-hz yes
- 事务
相关命令:
DISCARD 丢弃正在追加的事务命令列表;
EXEC 执行命令列表
MULTI 开启命令列表
UNWATCH 刷新所有监视(放弃所有正在进行的监视),已经开始的事务中执行对某个被监视的key的修改命令,那么虽然监视被放弃了,但是事务还是会执行失败;
WATCH 监视一组/一个key;
这些命令是redis事务的基础;
在redis的事务中:
使用exec命令将触发事务中所有命令的执行;
所有命令都会被执行,但是当其中某一个命令错误,其他命令会被执行,不会被回滚;当服务器进程被杀死或者崩溃时:
执行exec之前,将不执行任何操作;
执行exec之后(会将事务信息写到redis服务器的磁盘上[AOF文件中]),在事务中命令全部完成之前,那么当redis重启通过aof文件恢复数据时,将会删除掉对应的事务信息,以恢复到事务之前的状态;
综上所述,redis中的事务,如果以关系型数据库的事务标准(ACID)来看;
redis事务中的原子性认为,只要你的命令被redis服务器接收,即认为成功;(返回错误结果不代表执行命令失败,只有当redis服务器崩溃时才会被认为是执行失败);
redis中不满足隔离性,因为你第一个命令执行后,第二个命令get,将获得第一个命令执行成功后的结果
它满足一致性,执行前后数据库内的数据始终保持一致
它满足持久性,也即是,只要执行成功后,这些数据都将被记录在内存中,然后被RDB+AOF持久化到硬盘上(如果开启了RDB与AOF)
#事务的基本模板:
#可以在同一个事务中对同一个key进行设置;后操作会覆盖前操作;
127.0.0.1:6379> get a
"xxd"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set a 444
QUEUED
127.0.0.1:6379> get a
QUEUED
127.0.0.1:6379> set a 332
QUEUED
127.0.0.1:6379> hset a 1 2
QUEUED
127.0.0.1:6379> exec
1) OK
2) "444"
3) OK
4) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get a
"332"
#A客户端监视某个key;
127.0.0.1:6379> watch a
OK
#B客户端在A客户端监视后就修改key
127.0.0.1:6379> set a 880
OK
#A客户端在监视后开启事务并执行,将会返回nil;宣告修改失败;
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a 999
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379>
redis中的脚本也是事务性的,其实他俩是重复功能;但是事务是先出现的,脚本后出现,所以并不能单纯的取消某一个;官方更建议使用脚本;因为它更快些;