数据库
Redis 所有的数据库都保存在服务器结构的 db 数组中。
服务端
redis.h/redisServer
typedef struct redisDb {
// ...
// 数据库键值对字典
dict *dict;
// 过期字典,保存键的过期时间信息
dict *expires;
// ...
} redisDb;
struct redisServer {
// 数据库数组,保存着服务器所有的数据库,默认有16个数据库,编号从 0 到 15
redisDb *db;
// ...
};
客户端
typedef struct redisClient {
// ...
// 记录客户端正在使用哪个数据库
redisDb *db;
// ...
} redisClient;
选择数据库
redis> select 1
OK
// 此时 redis 客户端的 db 指针将指向第二个数据库,即 redisServer 结构中 db 数组的第二个元素
数据库操作
redis> set k1 "v1"
OK
redis> rpush l1 "1" "2" "3"
(integer) 3
redis> hmset user1 name "coderjiang" age "28" sex "1"
OK
此时,已经在编号为 1 的数据库中,创建键值对:
# 内部结构表示如下(仅为方便表示内部数据状态,并非真实C内部数据状态):
redisDb = {
'dict': {
'k1': 'v1',
'l1': ['1', '2', '3'],
'user1': {'name': 'coderjiang', 'age': '28', 'sex': '1'}
}
}
过期时间
使用命名:expire 或者 pexpire 命令,设置键的过期时间
redis> set k1 "v1" // 设置键 k1 的值为 "v1"
OK
redis> expire k1 3 // 设置键 k1 在 3 秒后过期
(integer) 1
redis> get k1 // 3秒之内执行
"v1"
redis> ttl k1 // 查看键 k1 还有几秒过期
2
redis> get k1 // 3秒之后执行
(nil)
保存过期时间
结构 redisDb 中属性 exipres 保存着键的过期时间。
过期键删除策略
惰性删除
当一个键过期后,Redis 不会主动删除,并回收内存;只有当程序在取键时,判断是否过期,执行回收操作。
定期删除
每个一段时间执行一次删除过期键操作,并限制操作执行的时长和频率,较少删除操作对 CPU 的占用。
Redis 结合使用以上两种过期键删除策略