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是一个很 ...
随机推荐
- 金山WPS一面
昨天下午在武汉面了一场服务端开发工程师吧,结果还未通知,是校招的, 大体上题目如下: 先自我介绍 然后是聊了一些笔试上的情况 问了spring的的作用以及优势 http的状态,三次握手四次挥手 gc的 ...
- python中thread的setDaemon、join的用法的代码
下面内容是关于python中thread的setDaemon.join的用法的内容. #! /usr/bin/env python import threading import time class ...
- ansible理解
目录 inventory文件 patterns 模块 ansible配置文件 PlayBook使用 inventory文件 [cassandra:children] shcp-01 shcp-06 b ...
- windows使用pyecharts报错 No module named 'pyecharts_snapshot
下载此文件后,使用命令 pip install pyecharts_snapshot-0.1.8-py2.py3-none-any.whl 安装完成即可 链接地址:https://pypi.org/p ...
- 仓位管理 V4.3
之前设计的仓位管理算法一直比较有效,往往能在市场的不断的上涨下跌中获利.不过感觉短期变动的仓位占整体的仓位较低,使得盈利较低.所以这个月对仓位管理算法进行了升级,尝试了几个版本.这里做一个记录. V4 ...
- Net Framework 4.7.2 覆盖 Net Framework 4.5 解决办法
场景:由于c盘空间不够,本机pc又安装了 vs2013 和 vs2017 : 所以通过,github上的一个工具,把vs2013 卸载完毕,只留下vs2017: 导致问题由于项目需要net frame ...
- linux查看空间情况----df与du命令
1.查看整个磁盘空间使用情况,可以使用命令 :df -h 2.获取当前的文件夹下的磁盘使用情况,可以使用如下命令:du --max-depth=1 -h 使用 du --max-depth=1 - ...
- Pytorch: cuda runtime error (59) : device-side assert triggered at /pytorch/aten/src/THC/generic/THCTensorMa
更换了数据集, 在计算交叉熵损失时出现错误 : cuda runtime error (59) : device-side assert triggered at /pytorch/aten/src/ ...
- ISP PIPLINE (十四) AE(自动曝光)
自动曝光可以可以通过调节 模拟增益,数字增益,曝光时间,光圈大小来调剂曝光. 曝光在ISP PIPLINE的位置. (先介绍一个额外的知识点: ) gamma compression(也就是de-ga ...
- HCNA(华为)_DHCP篇
在大型的企业网络中,会有大量的主机或设备需要获取IP地址等网络参数.如果采用手工配置,工作量大 且不好管理,如果有用户擅自修改网络参数,还有可能会造成IP地址冲突等问题.使用动态主机配置协DHCP 来 ...