Redis 设计与实现 (二)--数据库
typedef struct redisDb {
dict *dict; /* The keyspace for this DB */
dict *expires; /* Timeout of keys with a timeout set */
dict *blocking_keys; /* Keys with clients waiting for data (BLPOP) */
dict *ready_keys; /* Blocked keys that received a PUSH */
dict *watched_keys; /* WATCHED keys for MULTI/EXEC CAS */
struct evictionPoolEntry *eviction_pool; /* Eviction pool of keys */
int id; /* Database ID */
PORT_LONGLONG avg_ttl; /* Average TTL, just for stats */
} redisDb;
一、数据库 默认是16个
二、切换数据库:select 0~15
三、数据库键空间 *dict
保存了数据库中的所有键值对,它是一个字典称之为键空间
键空间的键 =数据库的键;
键空间的值=数据库的值;
3.1 添加新键:新键添加到键空间字典中
3.2 删除键:键空间 删除键所对应的键值对对象
3.3 更新键:对键空间的键对应的值进行更新
四、读写键控件时的维护操作
4.1 读取一个键之后,判断键是否存在,更新服务器的键空间命中次数或者键空间未命中次数。
127.0.0.1:> INFO stats
# Stats
total_connections_received:
total_commands_processed:
instantaneous_ops_per_sec:
total_net_input_bytes:
total_net_output_bytes:
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:
sync_full:
sync_partial_ok:
sync_partial_err:
expired_keys:
evicted_keys:
keyspace_hits:8 //命中次数
keyspace_misses:0 //未命中次数
pubsub_channels:
pubsub_patterns:
latest_fork_usec:
migrate_cached_sockets:
slave_expires_tracked_keys:
active_defrag_hits:
active_defrag_misses:
active_defrag_key_hits:
active_defrag_key_misses:
4.2 服务器会更新LRU(最后一次使用)时间,用于计算键的空闲时间
OBJECT idletime key 毫秒
127.0.0.1:> OBJECT idletime sun
(integer)
4.3 如果发现键过期,先删除这个键,然后执行后续操作
4.4 如果这个键被监视 WATCH key ,标记为脏(dirty)。服务器每次修改一个键,都会对脏键进行+1
4.5 数据库开通通知功能,每次修改键,都会发送通知。
五、设置键的生存时间或者过期时间
EXPIRE key ttl 秒数
PEXPIRE key ttl 毫秒数
EXPIREAT key timestamp 秒数时间戳
PEXPIREAT key timestamp 毫秒数时间戳
六、保存过期时间
dict *expires 过期时间键的集合
过期字典键-指针,指向数据库的键
过期字典值-long,毫秒精度时间戳 七、移除过期时间
PERSIST
在过期字典集合中,查询键,解除过期设置。
TTL
秒为单位键的剩余生存周期
PTTL 毫秒级
127.0.0.1:> get msg
(nil)
127.0.0.1:> set msg "sun"
OK
127.0.0.1:> PEXPIREAT msg
(integer)
127.0.0.1:> get msg
"sun"
127.0.0.1:> TTL msg
(integer)
127.0.0.1:> PERSIST msg
(integer)
127.0.0.1:> TTL msg
(integer) -
八、过期键的删除策略
惰性删除+定期删除 九、过期键的影响
9.1 RDB文件 -- SAVA 和 BGSAVE,已经过期的键不保存
主服务器载入RDB--忽略过期间
从服务器载入RDB--全局导入,主从同步时,从数据会被清空。
9.2 AOF文件
AOF文件写入
执行惰性或者定期删除之前 -- 过期间不受影响
执行惰性或者定期删除之后 -- 追加一条删除记录
AOF重写
过期键不会写入到AOF文件中
9.3 复制
复制模式,从服务器依赖于主服务器,从服务器即便接收到删除命令,也不会删除。 十、数据库通知
客户端订阅指定的变化通知
127.0.0.1:> SUBSCRIBE __KEYSPACE@0__:MSG
Reading messages... (press Ctrl-C to quit)
) "subscribe"
) "__KEYSPACE@0__:MSG"
) (integer)
Redis 设计与实现 (二)--数据库的更多相关文章
- 《Redis设计与实现》- 数据库
1. 服务器中数据库结构 Redis 服务器将所有数据库都保存在服务器状态 redisServer 结构的 db 数组中,由 redisDb 结构代表一个数据库 struct redisServer ...
- Redis设计与实现——单机数据库的实现
数据库 服务器中的数据库 redisClient切换数据库 redis客户端默认目标数据库为0号数据库,可以通过SELECT命令来切换目标数据库. 客户端状态redisClient结构的db属性记录了 ...
- Redis 设计与实现:数据库
本文的分析都是基于 Redis 6.0 版本源码 redis 6.0 源码:https://github.com/redis/redis/tree/6.0 服务器中的数据库 Redis 服务器将绝大部 ...
- Redis设计与实现 (二): 链表
Redis实现为双链表结构, 列表键的底层实现之一就是链表, 发布与订阅, 慢查询, 监视器等功能都用到了链表. Redis本身也使用链表维持多个客户端. 节点定义, 位于 adlist.h/lis ...
- Redis设计与实现2.1:数据库和事件
数据库和事件 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 数据库 数据库的结构定义在 redis.h/redisServer 这个结构体中,这个结构体有许多 ...
- 探索Redis设计与实现9:数据库redisDb与键过期删除策略
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 面试问题记录 二 (数据库、Linux、Redis)
面试问题记录 二 (数据库.Linux.Redis) 前言 接着上次的面试问题记录,在最后还有几道问的数据结构方面的知识点要补充 还是那句话:如果文中解释有明显错误,劳烦请及时指正我,在这不胜感激!! ...
- 《Redis 设计与实现》读书笔记(二)
单机数据库实现 九.数据库 1.服务器中的数据库 一个redis服务器保存多个数据库. struct redisServer { //一个数组,多个数据库 redisDb *db; } 当执行sele ...
- Redis | 第4章 Redis中的数据库《Redis设计与实现》
目录 前言 1. Redis中的数据库 2. 数据库的键空间 3. 键的生成时间与过期时间 4. Redis中的过期键删除策略 5. AOF.RDB和复制功能对过期键的处理 5.1 生成 RDB 文件 ...
- Redis设计与实现(一~五整合版)【搬运】
Redis设计与实现(一~五整合版) by @飘过的小牛 一 前言 项目中用到了redis,但用到的都是最最基本的功能,比如简单的slave机制,数据结构只使用了字符串.但是一直听说redis是一个很 ...
随机推荐
- tensorflow保存读取-【老鱼学tensorflow】
当我们对模型进行了训练后,就需要把模型保存起来,便于在预测时直接用已经训练好的模型进行预测. 保存模型的权重和偏置值 假设我们已经训练好了模型,其中有关于weights和biases的值,例如: im ...
- AspNet Core下利用 app-metrics+Grafana + InfluxDB实现高大上的性能监控界面
在日常系统工作中,我们为了洞察系统的问题和运作情况通常会记录日志的方式来进行分析,但是在很多情况下都是被动的在出问题后才会去查日志.在很多时候,我们可能更需要相对实时的了解整个系统或者某一时段的运行的 ...
- 利用 Saltstack 远程执行命令
Saltstack的一个比较突出优势就是具备执行远程命令的功能. 操作方法与func (https://fedorahosted.org/func/)相似,可以帮助运维人员完成集中化的操作平台. ht ...
- HDU - 1827 Summer Holiday (强连通)
<题目链接> 题目大意: 听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所有人的联系方式,但是一个一个联系过去实在太耗时间 ...
- Java 博客导航
Java 博客导航 一.基础知识 Java 基础知识 Java 常用知识点 Java 多线程 Java 正则使用 Java IO Java 集合
- 练习html,css,js仿制百度首页
1.练习目的 练习使用html,scc,js 完成界面样式,用ul标签实现文本框下拉,通过js完成添加列表内容等功能 2.效果 3.程序代码 <!DOCTYPE html> <htm ...
- 使用Jsoup实现java爬虫(非原创)
1,查看页面源代码,使用css或者JQuery选择器方式或元素节点选择 例如: 或者写成:Elements elements1 = Jsoup.connect("http://jb.999a ...
- C++第四课:类的使用(二)[个人见解]
前面说到C++类的名字自定义要有含义,成员函数名也同样如此. 一个好的程序员除了让自己能看懂代码外,那是能力,也能让别人看懂,那是本事. 我们来看第一个特性:继承! 什么是继承? 小编不说概念性的定义 ...
- elasticsearch 文档资料
1.Function Score Query 自定义查询评分 https://www.elastic.co/guide/en/elasticsearch/reference/current/query ...
- python学习:字符串
字符串 #字符串操作# 对应操作:# 1.重复输出字符串# print('hello'*2)# 2.[],[:]通过索引获取字符串中字符,这里和列表的切片操作是相同的,具体内容见列表#print('h ...