一些命令//
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采用惰性删除和定期删除策略
惰性删除
定期删除