Redis的设计与实现笔记 -- 数据库

一些命令//

RANDOMKEY :随机返回数据库中的某个键

FLUSHDB:清空整个数据库,删除所有键值对

DBSIZE:返回数据库中键值对数量

127.0.0.1:6379[2]> RANDOMKEY
"alphabet"
127.0.0.1:6379[2]> dbsize
(integer) 3

EXPIRE: 设置键的生存的时间,客户端设置某个键的生存时间,在指定秒数后服务器会自动删除生成时间= 0的键 

127.0.0.1:6379[2]> SET key "kk"
OK
127.0.0.1:6379[2]> EXPIRE key 10
(integer) 1
127.0.0.1:6379[2]> Get key
"kk"
127.0.0.1:6379[2]> Get key
"kk"
127.0.0.1:6379[2]> Get key
"kk"
127.0.0.1:6379[2]> Get key
"kk"
127.0.0.1:6379[2]> Get key
"kk"
127.0.0.1:6379[2]> Get key
"kk"
127.0.0.1:6379[2]> Get key
"kk"
127.0.0.1:6379[2]> Get key
"kk"
127.0.0.1:6379[2]> Get key
"kk"
127.0.0.1:6379[2]> Get key
(nil)

TTL:还剩余多少生存时间 s

键不再dict返回-2

127.0.0.1:6379[2]> TTL key
(integer) -2
127.0.0.1:6379[2]> EXPIRE key 1000
(integer) 1
127.0.0.1:6379[2]> TTL key
(integer) 994
127.0.0.1:6379[2]> TTL key
(integer) 992
127.0.0.1:6379[2]> TTL key
(integer) 991

 PTTL:还剩余多少生存时间 ms

127.0.0.1:6379[2]> Set key "dd"
OK
127.0.0.1:6379[2]> expire key 100
(integer) 1
127.0.0.1:6379[2]> ttl key
(integer) 96
127.0.0.1:6379[2]> pttl key
(integer) 90079

Redis服务器将所有数据库都保存在 redis.h/redisServer结构的db数组中

 

struct redisServer
{
    //一个数组,保存着服务器的所有数据库
    redisDb *db;
    //服务器的数据库数量
    int dbnum;
};

dbnum默认值 = 16,服务器默认创建16个数据库

 

默认情况下,客户端操作0号数据库,可以通过select命令选择数据库

127.0.0.1:6379> SET msg "hello world"
OK
127.0.0.1:6379> Get msg
"hello world"
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> get msg
(nil)
127.0.0.1:6379[2]> set msg "db2"
OK
127.0.0.1:6379[2]> get msg
"db2"

服务器内部的redisClient结构的db属性记录了客户端当前的目标数据库

typedef struct redisClient
{
    //记录客户端当前正在使用的数据库
    redisDb *db;
 
}redisClient;

服务器中的每个数据库都由redis.h/redisDb结构表示:

 typedef struct redisDb
{
    //数据库键空间,保存着数据库中的所有键值对
    dict* dict;
}redisDb;

因为数据库的键空间是一个字典,所以所有对数据库的操作,比如添加键值对,删除键值对,都是对键空间字典进行操作!

其中键为字符串对象,值为任意一种类型的Redis对象。

 

127.0.0.1:6379[2]> RPUSH alphabet "a" "b" "c"
(integer) 3
127.0.0.1:6379[2]> HSET book name "Redis in Action"
(integer) 1
127.0.0.1:6379[2]> HSET book author "Josiah"
(integer) 1
127.0.0.1:6379[2]> SET msg "hello world"
OK

执行以上命令后,数据库中的键空间:

127.0.0.1:6379[2]> LRANGE alphabet 0 -1
1) "a"
2) "b"
3) "c"

 


键的过期时间都保存在过期字典中

EXPIREAT:设置过期时间

EXPIRE:设置多少时间后过期

 

 过期键删除策略:

主动删除:

1)定时删除:设置过期键同时,创建定时器(timer),让定时器在键过期时间到时,立即删除-->占用太多cpu

2)定期删除:每隔一段时间,程序对数据库进行一次检查,删除里面的过期键。--》折中方法

被动删除

3)惰性删除:不管过期键,每次取键时才检测是否过期。-->容易造成内存泄漏,浪费内存。如:数据库中存在非常多的过期键又恰好没被访问到。可能永远不被删除(除非用户执行FLUSHDB)

Redis采用惰性删除和定期删除策略

惰性删除

定期删除

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值