Redis深入之路(八)

数据库

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 结合使用以上两种过期键删除策略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值