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 设计与实现 (二)--数据库的更多相关文章

  1. 《Redis设计与实现》- 数据库

    1. 服务器中数据库结构 Redis 服务器将所有数据库都保存在服务器状态 redisServer 结构的 db 数组中,由 redisDb 结构代表一个数据库 struct redisServer ...

  2. Redis设计与实现——单机数据库的实现

    数据库 服务器中的数据库 redisClient切换数据库 redis客户端默认目标数据库为0号数据库,可以通过SELECT命令来切换目标数据库. 客户端状态redisClient结构的db属性记录了 ...

  3. Redis 设计与实现:数据库

    本文的分析都是基于 Redis 6.0 版本源码 redis 6.0 源码:https://github.com/redis/redis/tree/6.0 服务器中的数据库 Redis 服务器将绝大部 ...

  4. Redis设计与实现 (二): 链表

    Redis实现为双链表结构, 列表键的底层实现之一就是链表,  发布与订阅, 慢查询, 监视器等功能都用到了链表. Redis本身也使用链表维持多个客户端. 节点定义, 位于 adlist.h/lis ...

  5. Redis设计与实现2.1:数据库和事件

    数据库和事件 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 数据库 数据库的结构定义在 redis.h/redisServer 这个结构体中,这个结构体有许多 ...

  6. 探索Redis设计与实现9:数据库redisDb与键过期删除策略

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  7. 面试问题记录 二 (数据库、Linux、Redis)

    面试问题记录 二 (数据库.Linux.Redis) 前言 接着上次的面试问题记录,在最后还有几道问的数据结构方面的知识点要补充 还是那句话:如果文中解释有明显错误,劳烦请及时指正我,在这不胜感激!! ...

  8. 《Redis 设计与实现》读书笔记(二)

    单机数据库实现 九.数据库 1.服务器中的数据库 一个redis服务器保存多个数据库. struct redisServer { //一个数组,多个数据库 redisDb *db; } 当执行sele ...

  9. Redis | 第4章 Redis中的数据库《Redis设计与实现》

    目录 前言 1. Redis中的数据库 2. 数据库的键空间 3. 键的生成时间与过期时间 4. Redis中的过期键删除策略 5. AOF.RDB和复制功能对过期键的处理 5.1 生成 RDB 文件 ...

  10. Redis设计与实现(一~五整合版)【搬运】

    Redis设计与实现(一~五整合版) by @飘过的小牛 一 前言 项目中用到了redis,但用到的都是最最基本的功能,比如简单的slave机制,数据结构只使用了字符串.但是一直听说redis是一个很 ...

随机推荐

  1. 【玩转开源】BananaPi R2 —— 第二篇 Openwrt 网口配置分析

    上次和大家分享了如何烧录和安装Openwrt到BananaPi R2,运行Openwrt的R2目前就具备路由器的功能了,这次我们来看看R2运行Openwrt的性能如何,同时也会讲解一些常用的网络知识. ...

  2. 第一阶段——CentOS6_Python3.6.1笔记(尚学堂-Python基础快速入门)+ 【补充】麦子-Python程序入门与进阶

    虚拟机环境: 设置网络 .修改网络地址 .设置网卡为nat模式 .确保物理机启动dhcp.net服务 .编辑文件:vim /etc/sysconfig/network-scripts/ifcfg-et ...

  3. 字符串正则匹配(递归/DP)

    Wildcard-Matching &  Regular Expression Matching Wildcard-Matching中?匹配任意一个字符,*匹配任意长度字符串包括空字符串 方法 ...

  4. windows jdk安装

    先去官网下载安装包 x86 32位 x64 64位 下载地址 安装jdk 安装目录默认c盘 配置系统环境 JAVA_HOME环境变量.作用:它指向jdk的安装目录,Eclipse/NetBeans/T ...

  5. iperf3 使用

    iperf 分client 和 server server:   iperf3 -s -p 5000 -i 1 client: iperf3 -c 192.168.31.11 -p 5000 Serv ...

  6. php字符串与数组的特殊情况

    来看一个有趣的实验 实验1 <?php $arr = array('a','b','c'); var_dump(isset($arr[1][0])); var_dump($arr[0][0]); ...

  7. 爬虫之图片懒加载技术及js加密

    图片懒加载 图片懒加载概念: 图片懒加载是一种网页优化技术.图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完,将大大增加页面的首屏加载时间.为了 ...

  8. tar解压到指定目录

    对于tar.gz的压缩包,压缩参数是tar xvzf 指定解压路径为/tmp则为: tar xzvf xxx.tar.gz -C /tmp 注意/文件夹必须存在.

  9. 关于各种工具输入参数中"-"和"--"

    关于各种工具输入参数中"-"和"--" 写个随笔记录下来 一直搞不懂,为啥在使用很多工具的时候,他的参数要加的"-"数量不一样呢? 如果输入 ...

  10. 无线路由WMM,Short GI,AP隔离功能介绍(转)

    无线路由器中有开启WMM.开启Short GI和开启AP隔离分别代表什么呢?这是我在我的TP-LINK无线路由器TL-WR841N中的无线高级设置中看到的三个选项,下面三点对这三项无线高级设置做了下解 ...