Redis06-Redis的数据库与键空间

举报
码农飞哥 发表于 2021/05/29 12:06:23 2021/05/29
【摘要】 前言 前面我们介绍了Redis的五种数据结构,这一篇我们换一个角度,让我们来看看Redis服务器的数据库。单个Redis服务器默认会创建16个数据库,数据库之间的数据是相互隔离的。默认的话使用的是0库。 数据库 Redis服务器将所有数据库都保存在服务器状态 redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redis...

前言

前面我们介绍了Redis的五种数据结构,这一篇我们换一个角度,让我们来看看Redis服务器的数据库。单个Redis服务器默认会创建16个数据库,数据库之间的数据是相互隔离的。默认的话使用的是0库。

数据库

Redis服务器将所有数据库都保存在服务器状态 redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库。在初始化服务器时,程序会根据服务器状态的dbnum属性来决定应该创建多少个数据库,默认的话是16个。

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

服务器数据库的示例图如下:

在这里插入图片描述

键空间

Redis是一个键值对(key-value pair)数据库服务器,服务器中的每个数据库都由一个redis.h/redisDb结构表示,其中,redisDb结构的dict字典保存了数据库中的所有键值对,我们将这个字典称为键空间(key space)。数据结构如下:

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

需要说明的是:

  1. 键空间和用户所见的数据库是直接对应的,也就是说当前客户端连接的是哪个数据库,键空间就是哪个数据库的键空间。
  2. 键空间的键也就是数据库的键,每个键都是一个字符串对象。这个可以这样理解,就是说数据库中的数据都是存在键空间的。
  3. 键空间的值也就是数据库中的值,每个值可以是字符串对象、列表对象、哈希表对象、集合对象和有序集合对象中的任意一种Redis对象。
    下面我们对一个空的数据库进行设值操作,我们分别设值了一个字符串对象message,一个列表对象order,一个哈希对象book。
127.0.0.1:6379> set message "hello world"
OK
127.0.0.1:6379> lpush order "111" "222" "333"
(integer) 3
127.0.0.1:6379> HSET book name "Learn Redis" author zhangsan
(integer) 2


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

其键空间的存储情况下如图所示:
在这里插入图片描述

添加新键

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

 HSET bookpage  page 123

  
 
  • 1

在这里插入图片描述

删除键

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

更新键

对一个数据库键进行更新,实际上就是对键空间里面键所对应的值对象进行更新,根据值对象的类型不同,更新的具体方法有所不同。下面以对上面的键book为例,将author的field修改成lisi

127.0.0.1:6379> HSET book name "Learn Redis" author lisi
(integer) 0
127.0.0.1:6379> hgetall book
1) "name"
2) "Learn Redis"
3) "author"
4) "lisi"


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

对键取值

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

读写键空间时的维护操作

  1. 在读取一个键之后(读操作和写操作都要对键进行读取),服务器会根据键是否存在来更新服务器的键空间命中(hit)次数或键空间不命中(miss)次数,这两个值可以在INFO status命令的keyspace_hits属性和keyspcace_misses属性中查看。
  2. 在读取一个键之后,服务器会更新键的LRU(最后一次使用)时间,这个值可以用于计算键的闲置时间,使用OBJECT idletime <key>命令可以查看键key的闲置时间。
  3. 如果服务器在读取一个键时发现该键已经过期,那么服务器会先删除这个过期键,然后才执行余下的其他操作。
  4. 如果有客户端使用WATCH命令监视了某个键,那么服务器在对监视的键进行修改之后,会将这个键标记为脏(dirty),从而让事务程序注意到这个键已经被修改过 。

总结

本文主要是参考《Redis的设计与实现第二版》写的一篇关于Redis的数据库以及数据库键空间的文章。单机的Redis服务器默认有16个数据库,对数据库的操作本质上就是对键空间的操作。

参考

《Redis的设计与实现第二版》

文章来源: feige.blog.csdn.net,作者:码农飞哥,版权归原作者所有,如需转载,请联系作者。

原文链接:feige.blog.csdn.net/article/details/108642692

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。