redis——数据库

举报
兔老大 发表于 2021/04/20 01:09:51 2021/04/20
【摘要】 redis服务器将所有数据库都保存在redis/redisServer中,数组db存放所有数据库,每一项是一个redisdb结构。dbnum代表数据库数量。 客户端有一个指针指向当前数据库,可以切换,也就是移动指针。 键空间 现在稍微介绍一下redisdb结构,它的字典保存了所有键值对 键空间的键也就是数据库的键, 每个键都是一个字符串对象。 键空间的值也就是数据库...

redis服务器将所有数据库都保存在redis/redisServer中,数组db存放所有数据库,每一项是一个redisdb结构。dbnum代表数据库数量。

客户端有一个指针指向当前数据库,可以切换,也就是移动指针。

键空间

现在稍微介绍一下redisdb结构,它的字典保存了所有键值对

键空间的键也就是数据库的键, 每个键都是一个字符串对象。

键空间的值也就是数据库的值, 每个值可以是字符串对象、列表对象、哈希表对象、集合对象、有序集合对象

所有数据库的操作,添加一个键值对, 删除一个键值对, 获取某个键值对, 等等,都是通过对键空间字典进行操作来实现的。

维护

读写键空间的时候,服务器会执行一些额外操作,比如:

  • 读一个键后(读操作写操作都要对键读取), 会根据键是否存在, 更新键空间命中(hit)次数或不命中(miss)次数。
  • 读取一个键后, 服务器会更新键的 LRU (最后一次使用)时间, 这个值可以用于计算键的闲置时间。
  • 如果服务器在读一个键时, 该键已经过期, 服务器会删除这个键, 然后执行其他操作。
  • 如果客户使用 WATCH 监视某个键,在对这个键进行修改之后, 会将这个键记为脏(dirty),让事务程序知到这个键被修改
  • 服务器每次修改一个键之后, 都会对脏(dirty)键计数器的值增一, 这个计数器会触发服务器的持久化以及复制操作执行
  • 如果服务器开启了数据库通知功能, 那么在对键进行修改之后, 服务器将按配置发送相应的数据库通知。

时间

用户可以给某个键设置生存时间,过期时间是一个UNIX时间戳,到时间自动删除这个键。

redisdb结构的expires字典保存了所有的键的过期时间,我们称这个字典为过期字典。

三种过期键删除策略

1)定时删除:创建一个定时器,到时间立即执行删除操作(对内存友好,因为能保证过期了立马删除,但是对cpu不友好)

2)惰性删除:键过期不管,每次获取键时检查是否过期,过期就删除(对cpu友好,但是只有在使用的时候才可能删除,对内存不友好)

3)定期删除:隔一段时间检查一次(具体算法决定检查多少删多少,需要合理设置)

淘汰策略

当Redis占用内存超出最大限制 (maxmemory) 时,可采用如下策略 (maxmemory-policy) ,让Redis淘汰一些数据,以腾出空间继续提供读写服务 :

noeviction: 对可能导致增大内存的命令返回错误 (大多数写命令,DEL除外) ;

volatile-ttl: 在设置了过期时间的key中,选择剩余寿命 (TTL) 最短的key,将其淘汰;

volatile-lru: 在设置了过期时间的key中,选择最少使用的key (RU) ,将其淘汰;

volatile-random: 在设置了过期时间的key中,随机选择一些key,将其淘汰;

allkeys-1Lru: 在所有的key中,选择最少使用的key (LRU) ,将其淘汰;

allkeys-random: 在所有的key中,随机选择一些key,将其淘汰;

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/89382408

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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