目录
1. 内存淘汰
1.1 主动过期
- 通过EXPIRE/EXPIREAT等命令主动设置key的过期时间。
1.2 内存策略
- volatile-lru->removethekeywithanexpiresetusinganLRUalgorithm
- volatile-random->removearandomkeywithanexpireset
- volatile-ttl->removethekeywiththenearestexpiretime(minorTTL)
- allkeys-random->removearandomkey,anykey
- allkeys-lru->removeanykeyaccordingtotheLRUalgorithm
- noeviction->don'texpireatall,justreturnanerroronwriteoperations
127.0.0.1:60000> set jingbotest
OK
127.0.0.1:60000> get jingbo
"test"
127.0.0.1:60000> expirejingbo30
(integer) 1
127.0.0.1:60000> ttljingbo
(integer) 27
127.0.0.1:60000> ttljingbo
(integer) 26
127.0.0.1:60000> ttljingbo
(integer) 25
127.0.0.1:60000> ttljingbo
(integer) 24
redis> SET mykey"Hello"
"OK"
redis> EXISTS mykey
(integer) 1
redis> EXPIREATmykey1293840000
(integer) 1
redis> EXISTS mykey
(integer) 0
redis>
1.3 Redis淘汰机制
1. 主动淘汰
- 在beforeSleep方法中执行key快速过期检查
- 在serverCron方法中执行key过期检查,serverCron方法执行周期为1秒钟执行server.hz次,hz默认为10,所以约100ms执行一次。hz设置越大过期键删除就越精准,但是cpu使用率会越高,这里建议线上redis采用的默认值。redis主要是在这个方法里删除大部分的过期键。
2. 被动淘汰
- 使用内存超过最大内存被迫根据相应的内存策略删除符合条件的key。(触发时影响相应时间)
- 在key写入之前进行被动检查,检查key是否过期,过期就进行删除。
- randomkey命令,该命令随机从redis获取键,每次获取到键的时候会检查该键是否过期。
2. Redis事务
2.1 事务简介
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的逻辑工作单位,由RDBMS中的事务管理子系统负责事务的处理。
2.2 Redis事务使用
1.开始事务
redis127.0.0.1:6379> MULTI
2.命令入队
redis127.0.0.1:6379> set jingbotest
redis127.0.0.1:6379> set zbdba test
3.执行事务
redis127.0.0.1:6379> EXEC
2.3 Redis事务原理
2.4 Redis事务踩坑
1.业务反映Redis夯住
2.查看slow log
3.发现MULTI
注意:合理使用事务,避免长事务对线上造成影响。
3. Redis持久化
Redis是缓存数据库,但是也提供了如下数据落盘的方式:
- RDB // 做一份内存快照
- AOF // 将Redis执行的命令追加到AOF文件中
- MIX // 在内存快照的基础上追加AOF文件
3.1 RDB
3.1.1 RDB 配置使用
# save <seconds> <changes>
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
# Note: you can disable saving completely by commenting out all "save" lines.
# It is also possible to remove all th