一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情。
1 redis事务
事务可以一次执行多个命令, 并且带有以下两个重要的保证:
- 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
- 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
1.1 MULTY & EXEC
MULTY 开启事务
EXEC 执行事务
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 1
QUEUED
127.0.0.1:6379> set k2 2
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
注意:
当两个事务并行发起的时候,谁的EXEC先发起,谁先执行。
也就是说当事务1发起,修改k1值为a,然后尚未执行EXEC。此时事务2发起,修改k2值为b,然后执行EXEC。此时,事务2开始执行,修改k2数据,当事务1的EXEC执行后,事务1才在这时开始开始执行。
1.2 watch
可以watch一个key,然后开启事务,在事务未执行完毕前,若是这个key被修改了,则事务不会执行。
也就是说,当两个事务同时开始,修改同一个key,当第一个事务修改完毕之后,第二个事务则不会执行。
2 Redis作为缓存使用
特点
- 缓存数据不重要
- 不是全量数据
- 缓存随着访问变化
2.1 过期数据删除策略
- noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
- allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
- volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
- allkeys-random: 回收随机的键使得新添加的数据有空间存放。
- volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
- volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
2.2 给key设定过期时间
ttl查询key的剩余时间,这个时间不随访问而延长
127.0.0.1:6379> set k1 aaa ex 20
OK
127.0.0.1:6379> ttl k1
(integer) 16
127.0.0.1:6379> get k1
"aaa"
127.0.0.1:6379> ttl k1
(integer) -2
127.0.0.1:6379> get k1
(nil)
也可以通过EXPIRE给一个已有的key设定过期时间。
127.0.0.1:6379> set k1 bbb
OK
127.0.0.1:6379> EXPIRE k1 20
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 15
如果此时对k1重写,则剔除过期时间
也可以使用EXPIREAT命令进行定时删除,指定删除时间戳,
2.3 缓存数据过期处理方式
Redis keys过期有两种方式:被动和主动方式。
被动:
- 当客户端尝试访问数据时,key会被发现并主动的过期。
- 数据清理不及时,若是有的数据永远不会被访问时,将永远不会被清理。 主动:
- Redis每秒10次:
- 测试随机的20个keys进行相关过期检测。
- 删除所有已经过期的keys。
- 如果有多于25%的keys过期,重复步奏1.
3 redis作为数据库使用
redis时点性创建快照,定时持久化
3.1 持久化原理
redis的持久化是通过子进程的方式实现的,通过fork的方式创建子进程,数据并没有真的拷贝出来,只是新的指针指向原来的数据,若是修改的数据,则仅拷贝修改的数据,对于子进程来说,数据仍是未修改。主进程修改时会触发内核级别的写时复制(copy on write)即修改主进程对应的指针到新的数据,子进程的指针和数据并不会修改。
3.2 redis数据持久化命令
save
- 阻塞并持久化数据
- 场景,关机维护前持久化数据可用save命令
bgsave
- 同步,非阻塞,创建子线程持久化数据
配置文件给出save规则,标识是save,触发的是bgsave命令
配置文件中也有对持久化的配置:
- 这个命令表示在60秒内发生10000比交易时进行持久化
- 300秒内发生10笔交易的时候进行持久化
- 900秒内有一笔交易发生时进行持久化
save 900 1
save 300 10
save 60 10000
数据库文件名
dbfilename dump.rdb
数据库文件地址
dir /var/lib/redis/6379