一.服务器中的数据库
每个redisDb都代表一个数据库,而数据库的数量由服务器的dbnum决定。
struct redisServer{
//一个数组,保存redis中所有数据库
redisDb *db;
//服务器数据库数量
int dbnum;
}
二.切换数据库
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 "another world"
OK
127.0.0.1:6379[2]> get msg
"another world"
127.0.0.1:6379[2]> SELECT 1
OK
127.0.0.1:6379[1]> get msg
(nil)
127.0.0.1:6379[1]> SELECT 3
OK
127.0.0.1:6379[3]> set msg "hi"
OK
127.0.0.1:6379[3]> get msg
"hi"
127.0.0.1:6379[3]> SELECT 2
OK
127.0.0.1:6379[2]> get msg
"another world"
127.0.0.1:6379[2]> select 0
OK
127.0.0.1:6379> get msg
"hello world"
虽然key都是msg,但是由于数据库选择的不一样,相同键所保存的结果也是不一样的。
三.数据库键空间
添加键
127.0.0.1:6379> set book "java"
OK
删除键
127.0.0.1:6379> del book
(integer) 0
更新
127.0.0.1:6379> set book "C#"
OK
设置过期时间
127.0.0.1:6379> EXPIRE book 5 //设置秒
(integer) 1
127.0.0.1:6379> PEXPIRE book 5 //毫秒
(integer) 0
127.0.0.1:6379> EXPIREAT book 156546546516 //过期时间设置为该时间的秒
(integer) 0
127.0.0.1:6379> PEXPIREAT book 156546546516 //过期时间设置为该时间的毫秒
(integer) 0
四.过期键删除策略
1.定时删除
- 优点:对内存友好,能让过期的键能尽快的被删除。
- 缺点:对CPU不友好,在需要删除的键过多时,会占用大量的CPU时间来删除键。
2.惰性删除
在取出键时判断键是否过期,过期则删除。
- 优点:对CPU友好,只在万不得已的时候才执行删除操作
- 缺点:对内存不友好,在该键已经过期时,由于一直未取出,导致不能删除,消耗内存。
3.定期删除
定期删除时对定时删除与惰性删除的折中:
- 每隔一段时间执行一次删除操作,并通过限制操作时长与频率来减少对CPU的影响。
- 能有效减少因为键过期带来的对内存的影响
五.AOF与RDB和复制功能对过期键的处理
- RDB
已过期的键不会保存到RDB中。
载入RDB:
在以主服务器模式运行时,未过期的会被加载到数据库中,已过期的则不会。
在以服务器模式运行时,载入文件时,不论键是否过期,都会加载到数据库中。
**
- AOF
**
写入:如果一个键已过期,没有被惰性删除和定期删除,AOF不会因为这个过期键而产生影响。如果被删除,则会向AOF中添加一条del的记录。
重写:在执行AOF重写中,程序会对键进行检查,如果键已过期则不会保存到数据库中。
**
- 复制
**
当服务器处于复制模式下:
1.当主服务器删除一个键时,会显示的向所有服务器发送一个del的命令,告诉其他服务器删除这个过期键
2.从服务器在执行客户端发送的读命令时,即使碰到过期键也不会将过期键删除,二十像未过期键那样操作键。
3.从服务器只有在接收到主服务器的DEL命令时,才删除过期键
六.数据库通知
获取0号数据库对book键的所有命令:
127.0.0.1:6379> get book
(nil)
127.0.0.1:6379> set book "java"
OK
127.0.0.1:6379> set book "C#"
OK
127.0.0.1:6379> get book
"C#"
127.0.0.1:6379> APPEND book "python"
(integer) 8
127.0.0.1:6379> get book
"C#python"
127.0.0.1:6379> SUBSCRIBE _ _keyspace@0_ _:book
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "_"
3) (integer) 1
1) "subscribe"
2) "_keyspace@0_"
3) (integer) 2
1) "subscribe"
2) "_:book"
3) (integer) 3