Redis 数据库知识点整理

  • Redis 数据库整理
  • 1. Redis服务器默认创建16个数据库
  • 2. 切换数据库
  • 3. 数据库中值得保存——以键值对形式保存
  • 4. 读写键空间时的维护操作
  • 5. 键的生存时间和过期时间
  • 6.过期键的判定:
  • 7.过期键的删除策略


Redis 数据库整理

1. Redis服务器默认创建16个数据库

redis 增加数据文件 redis新建数据库_数据库


db 是一个数组,保存服务器中所有的数据库

dbnum 表示需要创建的数据库数量

2. 切换数据库

SELECT 2  //表示选择的数据库

这时,clientServer中的db就会指向db[2]

3. 数据库中值得保存——以键值对形式保存

Redis中,每个RedisDb结构中都有dict字典,这个字典保存数据库中的所有键值对。

4. 读写键空间时的维护操作

a. 服务器读取一个键后,会根据键是否存在更新服务器中的键空间命中次数(keyspace-hits)和键空间不命中次数(keyspace-misses)。
b. 服务器在更新一个键后会更新LRU(最后一次使用)时间,用来计算键的空闲时间。
c. 如果读取时发现一个键过期,就会删除这个键,在进行其他操作。
d. 如果客户端使用WATCH见识某个键,在该键修改后会被标记为dirty。
e. 服务器每次修改一个键后都会对脏键计数器加1,用于持久化和复制操作。
f. 如果服务器开启数据库通知功能,那么对键修改后会进行相应的数据库通知。

5. 键的生存时间和过期时间

5.1 设置生存时间命令:

EXPIRE KEY 5 	//设置键key的生存时间为5s

PEXPIRE KEY 5	//设置键key的生存时间为5ms

SETEX key 5 "aaa" //只针对字符串,设置键key的生存时间为5s

设置过期时间命令:过期时间是一个时间戳

EXPIREAT key 1377257300		//key到1377257300时,就会删除,时间戳以秒为单位

PEXPIREAT key 1377257300000		//key到1377257300000时,就会删除,时间戳以毫秒为单位

其他命令

TTL key //查询这个键的剩余生存时间
PTTL key //同上,但以毫秒为单位

5.2 过期时间的保存
redisdb结构中,维护一个expires字典用于保存过期时间,所以称为过期字典:
过期字典的键是一个指针,指向空间中某个键对象。
过期字典的值是一个龙long long类型的整数(以毫秒单位)

6.过期键的判定:

先判断键是否存在过期时间,如果有,获取过期时间;
判断当前时间时间戳是否大于过期时间,如果是,则认为过期。

7.过期键的删除策略

删除策略有三种:

删除策略

内容

优劣

定时删除

在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作

过期键会被尽可能快的删除,但对CPU不友好

惰性删除

放任键的过期,在每次取键时进行判断是否过期,如果过期则删除该键,否则返回该键

对内存不友好,一些不太会用到的数据就不太能被删除掉,占用内存空间

定期删除

每隔一段时间,程序对数据库进行一次检查,删除里面的过期键

对删除执行的时长和频率需要判断

Redis结合惰性删除和定期删除
定期删除补充:

  • 每次删除都是随机去除一定数量的键进行检查删除。
  • 全局变量current_db会记录检查进度,并在下一次检查时,接着上一次的进度进行处理。
  • 如果所有服务器都被检查了一遍,则current_db会重置为0,然后开始新的检查。