redis数据库键空间

最后更新:2020-04-04

1. 键空间

Redis 服务器都有多个 Redis 数据库,每个Redis 数据都有自己独立的键值空间。每个 Redis 数据库使用 dict 保存数据库中所有的键值对。

键空间的键也就是数据库的键,每个键都是一个字符串对象,而值对象可能为字符串对象、列表对象、哈希表对象、集合对象和有序集合对象中的一种对象。

除了键空间,Redis 也使用 dict 结构来保存键的过期时间,其键是键空间中的键值,而值是过期时间,如上图所示。

通过过期字典,Redis 可以直接判断一个键是否过期,首先查看该键是否存在于过期字典,如果存在,则比较该键的过期时间和当前服务器时间戳,如果大于,则该键过期,否则未过期。

如果我们在空白的数据库中执行以下命令:

redis> SET message "hello world"
OK

redis> RPUSH alphabet "a" "b" "c"
(integer) 3

redis> HSET book name "Redis in Action"
(integer) 1

redis> HSET book author "Josiah L. Carlson"
(integer) 1

redis> HSET book publisher "Manning"
(integer) 1

那么在这些命令执行之后, 数据库的键空间将会是下图所展示的样子:

  • alphabet 是一个列表键, 键的名字是一个包含字符串 "alphabet" 的字符串对象, 键的值则是一个包含三个元素的列表对象。
  • book 是一个哈希表键, 键的名字是一个包含字符串 "book" 的字符串对象, 键的值则是一个包含三个键值对的哈希表对象。
  • message 是一个字符串键, 键的名字是一个包含字符串 "message" 的字符串对象, 键的值则是一个包含字符串 "hello world" 的字符串对象。

因为数据库的键空间是一个字典, 所以所有针对数据库的操作 —— 比如添加一个键值对到数据库, 或者从数据库中删除一个键值对, 又或者在数据库中获取某个键值对, 等等, 实际上都是通过对键空间字典进行操作来实现的,

2. 添加新键

添加一个新键值对到数据库, 实际上就是将一个新键值对添加到键空间字典里面, 其中键为字符串对象, 而值则为任意一种类型的 Redis 对象。

redis> SET date "2013.12.1"
OK

键空间将添加一个新的键值对, 这个新键值对的键是一个包含字符串 "date" 的字符串对象, 而键值对的值则是一个包含字符串 "2013.12.1" 的字符串对象,如下图所示

3. 删除键

删除数据库中的一个键, 实际上就是在键空间里面删除键所对应的键值对对象。

redis> DEL book
(integer) 1

book 以及它的值将从键空间中被删除,如下图所示

4. 更新键

对一个数据库键进行更新, 实际上就是对键空间里面键所对应的值对象进行更新, 根据值对象的类型不同, 更新的具体方法也会有所不同。

redis> SET message "blah blah"
OK

message 的值对象将从之前包含 "hello world" 字符串更新为包含 "blah blah" 字符串,如下图所示

redis> HSET book page 320
(integer) 1

那么键空间中 book 键的值对象(一个哈希对象)将被更新, 新的键值对 page320 会被添加到值对象里面,

5. 对键取值

对一个数据库键进行取值, 实际上就是在键空间中取出键所对应的值对象, 根据值对象的类型不同, 具体的取值方法也会有所不同。

redis> GET message
"hello world"

GET 命令将首先在键空间中查找键 message , 找到键之后接着取得该键所对应的字符串对象值, 之后再返回值对象所包含的字符串 "hello world"

redis> LRANGE alphabet 0 -1
1) "a"
2) "b"
3) "c"

LRANGE 命令将首先在键空间中查找键 alphabet , 找到键之后接着取得该键所对应的列表对象值, 之后再返回列表对象中包含的三个字符串对象的值

6. 参考资料

http://redisbook.com/preview/database/key_space.html

Edgar

Edgar
一个略懂Java的小菜比