Redis设计与实现-第二部分-单机数据库的实现-第9章-数据库.docx

Redis设计与实现-第二部分-单机数据库的实现-第9章-数据库.docx

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
? ? Redis设计与实现 第二部分 单机数据库的实现 第9章 数据库 ? ? 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库。 struct redisServer { //一个数组,保存着服务器中的所有数据库 redisDb *db; //服务器的数据库数量 dbnum属性的值由服务器配置的database选项决定,默认情况下,该选项的值为16 int dbnum; } 切换数据库 每个redisClient都有自己的目标数据库,每当客户端执行数据库写命令或者数据库读命令的时候,目标数据库就会成为这些命令的操作对象。默认情况下,Redis客户端的目标数据库为0号数据库,但客户端可以通过执行SELECT命令来切换目标数据库。 在服务器内部,客户端状态redisClient结构的db属性记录了客户端当前的目标数据库,这个属性是一个指向redisDb结构的指针: typedef struct redisClient { //记录客户端当前正在使用的数据库 指向redisServer.db数组中的一个元素(目标数据库) //select命令的原理就是让redisClient.db指针指向服务器中不同的数据库,从而实现切换数据库 redisDb *db; } redisClient; 在redis执行flushdb这样的危险命令之前,最好先执行一个select命令,显示的切换到指定的数据库,然后再执行别的命令。 数据库键空间 Redis是一个键值对(key-value pair)数据库服务器,服务器中的每个数据库都由一个redis.h/redisDb结构表示,其中,redisDb结构的dict字典保存了数据库?的所有键值对,我们将这个字典称为键空间(key space). typedef struct redisDb { //数据库键空间,保存数据库中的所有键值对 dict *dict; } redisDb; 键空间和用户所见的数据库是直接对应的: 1.键空间的键也就是数据库的键,每个键都是一个字符串对象 2.键空间的值也就是数据库的值,每个值都可以是字符串对象、列表对象、哈希表对象、集合对象和有序集合对象中的任意一种Redis对象。 读写键空间时的维护操作 当使用redis命令对数据进行读写时,服务器不仅会对键空间执行指定的读写操作,还会执行一些额外的维护操作,其中包括: 1.在读取一个键之后(读和写都会对键进行读取),服务器会根据键是否存在来更新服务器键空间命中(hit)次数或键空间不命中(miss)次数,这两个值可以在INFO stats命令的keyspace_hits属性和keyspace_missess属性中查看。 2.在读取一个键之后,服务器会更新键的LRU(最后一次使用)时间,这个值可以用于计算键的空闲时间,使用OBJECT idletime命令可以查看键key的闲置时间。 3.如果服务器在读取一个键时发现该键已经过期,那么服务器会先删除这个过期键,然后才执行余下的其他操作,本章稍后对过期键的讨论会详细说明这一点。 4.如果客户端使用watch命令监视了某个键,那么服务器修改这个键,会将这个键标记为脏(dirty),从而让事物程序注意到这个键已经被修改过。 5.服务器修改一个键之后,都会对脏(dirty)键计数器的值增1,这个计数器会触发服务器的持久化以及复制操作。 6.如果服务器开启了数据库通知功能,那么在对键进行修改之后,服务器将按配置发送相应的数据库通知。 设置键的生存时间或过期时间 通过EXPIRE命令或者PEXPIRE命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间(Time To Live,TTL),在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键。 注意: SETEX命令可以在设置一个字符串键的同时为键设置过期时间,因为这个命令是一个类型限定的命令(只能用于字符串键),所以本章不会对这个命令进行介绍,但SETEX命令设置过期时间的原理和本章介绍的EXPIRE命令设置过期时间的原理是完全一样的。 与EXPIRE命令和PEXPIRE命令类似,客户端可以通过EXPIREAT命令或PEXPIREAT命令,以秒或者毫秒精度给数据库中的某个键设置过期时间(expire time,unix时间戳,当过期时间来临时,服务器就会自动从数据库删除这个键). TTL命令和PTTL命令接受一个带有生存时间后者过期时间的键,返回这个键的剩余生存时间,也就是,返回这个键被服务器自动删除还有多长时间。 设置过期时间 Re

文档评论(0)

科技之佳文库 + 关注
官方认证
内容提供者

科技赋能未来,创新改变生活!

版权声明书
用户编号:8131073104000017
认证主体重庆有云时代科技有限公司
IP属地上海
统一社会信用代码/组织机构代码
9150010832176858X3

1亿VIP精品文档

相关文档