Redis(十九)-Redis的数据库与键空间

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 前面我们介绍了Redis的五种数据结构,这一篇我们换一个角度,让我们来看看Redis服务器的数据库。单个Redis服务器默认会创建16个数据库,数据库之间的数据是相互隔离的。默认的话使用的是0库。

前言

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

数据库

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

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

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

0a69315e7d7cca61a5c7a3be3f1658ec_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ1MzQ4MDg=,size_16,color_FFFFFF,t_70#pic_center.png


键空间

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

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

需要说明的是:

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

其键空间的存储情况下如图所示:

c384eb23f9248590f2f5868c336ed59f_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ1MzQ4MDg=,size_16,color_FFFFFF,t_70#pic_center.png

添加新键

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

如下图新增一个bookpage的键。

HSET bookpage  page 123

725719eb0da941d577604dfe7d69e395_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ1MzQ4MDg=,size_16,color_FFFFFF,t_70#pic_center.png

删除键

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

更新键

对一个数据库键进行更新,实际上就是对键空间里面键所对应的值对象进行更新,根据值对象的类型不同,更新的具体方法有所不同。下面以对上面的键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.在读取一个键之后(读操作和写操作都要对键进行读取),服务器会根据键是否存在来更新服务器的键空间命中(hit)次数或键空间不命中(miss)次数,这两个值可以在INFO status命令的keyspace_hits属性和keyspcace_misses属性中查看。

2.在读取一个键之后,服务器会更新键的LRU(最后一次使用)时间,这个值可以用于计算键的闲置时间,使用OBJECT idletime <key>命令可以查看键key的闲置时间。

3.如果服务器在读取一个键时发现该键已经过期,那么服务器会先删除这个过期键,然后才执行余下的其他操作。

4.如果有客户端使用WATCH命令监视了某个键,那么服务器在对监视的键进行修改之后,会将这个键标记为脏(dirty),从而让事务程序注意到这个键已经被修改过 。

总结

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

参考

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


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 NoSQL Redis
【Redis】利用Redis List实现数据库分页快速查询
【Redis】利用Redis List实现数据库分页快速查询
111 0
|
1月前
|
存储 缓存 NoSQL
利用Redis List实现数据库分页快速查询的有效方法
利用Redis List实现数据库分页快速查询的有效方法
|
1月前
|
NoSQL Java 数据库连接
使用Java实现从数据库查出数据存入Redis,并在查询时先查Redis,如果Redis中没有数据再从数据库中读取
使用Java实现从数据库查出数据存入Redis,并在查询时先查Redis,如果Redis中没有数据再从数据库中读取
358 1
|
8天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
130 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
24天前
|
存储 缓存 NoSQL
Redis 服务器指南:高性能内存数据库的完整使用指南
Redis 服务器指南:高性能内存数据库的完整使用指南
|
1月前
|
缓存 NoSQL 数据库
[Redis]——数据一致性,先操作数据库,还是先更新缓存?
[Redis]——数据一致性,先操作数据库,还是先更新缓存?
|
2月前
|
NoSQL 关系型数据库 MySQL
Windows、Linux、Mac安装数据库(mysql、MongoDB、Redis)#0
不同系统下进行MySQL安装、MongoDB安装、Redis安装【2月更文挑战第5天】
445 5
Windows、Linux、Mac安装数据库(mysql、MongoDB、Redis)#0
|
2月前
|
NoSQL Java API
分布式锁【数据库乐观锁实现的分布式锁、Zookeeper分布式锁原理、Redis实现的分布式锁】(三)-全面详解(学习总结---从入门到深化)
分布式锁【数据库乐观锁实现的分布式锁、Zookeeper分布式锁原理、Redis实现的分布式锁】(三)-全面详解(学习总结---从入门到深化)
298 0
|
3月前
|
存储 NoSQL Java
【Redis】利用 Redis List 实现 Java 数据库分页快速查询
在大型应用中,数据库分页查询是日常开发中不可避免的需求之一。随着数据量的不断增加,传统的数据库分页方式可能会变得效率较低。为了解决这一问题,本文将介绍如何使用 Redis List 数据结构,结合 Java 编程语言,实现高效的数据库分页查询。
121 9
|
3月前
|
NoSQL Linux Redis
【Redis】Redis数据库安装(Linux)
【1月更文挑战第18天】【Redis】Redis数据库安装(Linux)

热门文章

最新文章