文档章节

Redis核心数据结构和实现

selfless
 selfless
发布于 2017/02/16 19:24
字数 709
阅读 15
收藏 1
点赞 0
评论 0

数据结构和对象

不同对象及使用的数据结构

名称Type编码使用的数据结构
字符串stringREDIS_STRINGint/embstr/raw
列表listREDIS_LISTziplist/linkedlist
哈希hashREDIS_HASHziplist/hashtable
集合setREDIS_SETintset/hashtable
有序集合zsetREDIS_ZSETziplist/skiplist

数据结构定义

名称object encoding编码作用
整数intREDIS_ENCODING_INT
embstr编码简单动态字符串SDSembstrREDIS_ENCODING_EMBSTR专门处理短字符串(<=39字节)
简单动态字符串rawREDIS_ENCODING_RAW
字典hashtableREDIS_ENCODING_HT
双端链表linkedlistREDIS_ENCODING_LINKEDLIST
压缩列表ziplistREDIS_ENCODING_ZIPLIST
整数集合intsetREDIS_ENCODING_INTSET
跳跃表和字典skiplistREDIS_ENCODING_SKIPLIST

数据库存储结构

Redis的三级索引结构

graph TD
    A[数据库db] --> B(数据库键空间dict)
    B --> C{键空间的值}
    C --> D[ListObject]
    C --> E[HashObject]
    C --> F[StringObject]

键空间的维护

  1. 增(SET)/删(DEL)/改()/查(GET)/设置过期时间(EXPIRE)
  2. 过期键采用“定期删除 + 惰性删除”策略
  3. RDB文件不包含过期键
  4. AOF文件显示追加一条DEL命令
  5. 主从模式,从服务器只有等主服务器发送DEL命令,才会删除自己的过期键,保证一致性

数据持久化

  1. RDB
  • 其实就是内存快照,一个经过压缩的二进制文件,可以通过SAVE或者BGSAVE命令来创建,SAVE是阻塞命令,BGSAVE是非阻塞命令
  1. AOF(Append Only File)
  • 其实就是日志记录,通过持久化执行的命令来记录数据库状态。分为:命令追加、文件写入、文件同步三步完成。

事件

  1. Redis服务器是事件驱动的,分为时间事件和文件事件
  2. 时间事件分为周期性事件和定时事件
  3. 文件事件是对socket操作的抽象:socket状态变化,产生相应的事件

主从

  1. SLAVEOF命令,设置主从服务器关系
  2. 2.8之前通过sync实现复制,2.8之后,通过psync实现复制
  3. psync的复制通过<偏移量、缓冲区、运行ID>来实现部分重新同步
  4. 主服务器向从服务器传播命令来更新从服务器状态,保持主从一致
  5. 从服务器向主服务器心跳检测,防止丢失命令

哨兵

  1. Sentinel是运行在特殊状态下的Redis服务器,每10s一次检测主服务器是否存活
  2. 判断主服务器下线后,选举从服务器作为新的主服务器
  3. 选举方法:Raft

集群

  1. 查看集群状态:
> CLUSTER NODES
> CLUSTER INFO
  1. 添加集群节点:
> CLUSTER MEET <ip> <port>
  1. 查看key所在的slot,一共16384个slot
> CLUSTER KEYSLOT <key>
  1. 设置从节点
> CLUSTER REPLICATE <node_id>

其他

  • 发布订阅
PUBLISH,SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE,PUNSUBSCRIBE
  • 事务
MULTI, EXEC, WATCH
redis 事务不支持回滚

  • 慢查询日志
> SLOWLOG GET
  • 成为Monitor,监视所有的操作命令
> MONITOR

© 著作权归作者所有

共有 人打赏支持
selfless
粉丝 24
博文 26
码字总数 21597
作品 0
海淀
程序员
《redis设计与实现(第二版)》.PDF

简介 本书全面而完整地讲解了Redis的内部机制与实现方式,对Redis的大多数单机功能以及所有多机功能的实现原理进行了介绍,展示了这些功能的核心数据结构以及关键的算法思想,图示丰富,描述清...

jackmk ⋅ 2017/08/12 ⋅ 0

RedBridge: 为Redis提供HTTP API及连接池功能

RedBridge 是一款基于Redis的 HTTP API。使用LUA直接跟Redis交互,对Redis的连接实现连接池。(类似数据库的存储过程) 高效的实现复杂的业务逻辑。 项目网址:http://code.google.com/p/redb...

红薯 ⋅ 2011/10/19 ⋅ 6

李景枫/mconf

配置中心(Mconf) 开源产品介绍(微服务基础设施QQ交流群:191958521) 配置中心(mconf) GITHUB:https://github.com/yu120/mconf 码云:https://git.oschina.net/yu120/mconf 微核心(micro)...

李景枫 ⋅ 2017/05/18 ⋅ 0

Redis入门-架构篇

关系代数的RDB,发展了很多年,很多成熟的产品和技术;K-V的redis,现在到了3.x,支持lua脚本、订阅、集群等;图形的neo4j,还有支持分布式的titan;文档数据库mongodb,换装wt引擎后更强劲;...

柳云龙 ⋅ 2016/10/13 ⋅ 0

redis源码分析之内存布局

介绍 众所周知,redis是一个开源、短小、高效的key-value存储系统,相对于memcached,redis能够支持更加丰富的数据结构,包括: 字符串(string) 哈希表(map) 列表(list) 集合(set) ...

wangdy ⋅ 2016/07/05 ⋅ 0

《Redis设计与实现(第二版)》

《Redis 设计与实现》一书全面而完整地讲解了 Redis 的内部运行机制, 对 Redis 的大多数单机功能以及所有多机功能的实现原理进行了介绍, 展示了这些功能的核心数据结构以及关键的算法思想。...

ddddd8 ⋅ 2017/12/21 ⋅ 0

Redis资料大全

1.Redis是什么? 十五分钟介绍 Redis数据结构 Redis系统性介绍 一个很棒的Redis介绍PPT 强烈推荐!非同一般的Redis介绍 Redis之七种武器 锋利的Redis redis 适用场景与实现 【翻译】Redis协议...

蓝狐乐队 ⋅ 2014/05/25 ⋅ 3

Memcached与Redis(四)

3.2 Redis和Memcached的集群实现机制对比 Memcached是全内存的数据缓冲系统,Redis虽然支持数据的持久化,但是全内存毕竟才是其高性能的本质。作为基于内存的存储系统来说,机器物理内存的大...

liujing07 ⋅ 2017/11/12 ⋅ 0

redis源码分析之事务Transaction(下)

接着上一篇,这篇文章分析一下redis事务操作中multi,exec,discard三个核心命令。 看本篇文章前需要先对上面文章有所了解: redis源码分析之事务Transaction(上) 一、redis事务核心命令简...

凌风郎少 ⋅ 2017/11/12 ⋅ 0

快速构建实时抓取集群

本文转载自搜淘宝索技术博客,描述了实时抓取集群的架构。其架构中使用Redis作为核心的LinkBase存储,包括了使用List结构来存储抓取队列,使用Hash结构来存储链接表及使用Sorted Sets结构来存...

红薯 ⋅ 2011/07/31 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 22分钟前 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 48分钟前 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

MVC——统一报文格式的异常处理响应

在我们写controller层的时候,常常会有这样的困惑,如果需要返回一个数据是,可能为了统一回去构造一个类似下列的数据格式: { status:true, msg:"保存成功!", data:[]} 而且在写...

alexzhu592 ⋅ 昨天 ⋅ 0

[知乎]SSH框架

网上图书馆管理系统包括管理员管理和图书管理,图书借阅,查询模块等等,网上商城包括前台页面和后台管理页面,两个都是以前别人的实际项目,只是别人用的不是SSH,我把他们改用SSH了,除了S...

颖伙虫 ⋅ 昨天 ⋅ 0

android -------- 打开本地浏览器或指定浏览器加载,打电话,打开第三方app

开发中常常有打开本地浏览器加载url或者指定浏览器加载, 还有打开第三方app, 如 打开高德地图 百度地图等 在Android程序中我们可以通过发送隐式Intent来启动系统默认的浏览器。 如果手机本身...

切切歆语 ⋅ 昨天 ⋅ 0

linux 安装docker

通过以下命令下载安装docker wget -qO- https://get.docker.com | sh 执行以上命令后输出以下内容说明安装成功,注意红框中的内容,docker安装成功后默认只有root能使用,红框中给出的提示是...

haoyuehong ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部