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是一个很 ...
随机推荐
- 几道比较有意思的js面试题
1.[] ? !![] : ![];输出结果是什么? 1 2 3 4 5 let val = [] ? !![] : ![]; console.log(val); //true: //之前的错误解释 ...
- resource links
http://cenalulu.github.io/linux/all-about-cpu-cache/
- POSIX信号量
DESCRIPTION POSIX 信号量允许进程间和线程间同步他们的操作. 一个信号量是一个整型(integer),其值不能小于0. 信号量允许2中操作:给信号量的值加1(sem_post); 给信 ...
- C++11 带来的新特性 (3)—— 关键字noexcept
1 关键字noexcept 从C++11开始,我们能看到很多代码当中都有关键字noexcept.比如下面就是std::initializer_list的默认构造函数,其中使用了noexcept. co ...
- vue 手机端样式统一配置
- Android进阶:七、Retrofit2.0原理解析之最简流程【下】
紧接上文Android进阶:七.Retrofit2.0原理解析之最简流程[上] 一.请求参数整理 我们定义的接口已经被实现,但是我们还是不知道我们注解的请求方式,参数类型等是如何发起网络请求的呢? 这 ...
- Oracle:select into 查询没有记录的解决办法
在数据库编程中,select into 语句可以将数据库的某些值赋值给程序的变量,使用起来非常方便.但很多时候也会遇到查询出来没有记录的情况,这时程序会出错. 可以使用 exception when ...
- FunData — 电竞大数据系统架构演进
电竞出现在人们视野中的频率越来越高了,此次选取FunData作为电竞数据平台,v1.0 beta版本主要提供由Valve公司出品的顶级MOBA类游戏DOTA2相关数据接口(详情:open.varena ...
- golang struct 和 byte互转
相比于encoding, 使用unsafe性能更高 type MyStruct struct { A int B int } var sizeOfMyStruct = int(unsafe.Sizeo ...
- ubuntu系统下matplotlib中文乱码问题
参考 [ubuntu系统下matplotlib中文乱码问题 - CSDN博客](https://blog.csdn.net/jeff_liu_sky_/article/details/54023745 ...