准备将之前攒下的书先看一遍,主要是有个大概的了解,以后用的时候也知道在哪里找.所以准备开几篇共读的帖子,激励自己多看一些书. Redis 基于 简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合等基础的数据结构,创建了一个对象系统,这个对象系统包含:字符串对象(String).列表对象(List).集合对象(Set).有序集合对象(Zset).哈希对象(Hash) 5种数据对象类型.但是这5种对象类型,其内部的基础的存储结构 并不是 一对一的一种,而是每一种包含了至少两种数据结构. 我…
上一章我们讲了 redis 基本类型的数据结构 和 对象系统 ,这篇来说一下单机redis 的知识点. 一.数据库 一个数据库在redis中就有一个结构体,而数据库的结构体是由redisServer这个结构体持有. 也就是redis服务器对应一个redisService 结构体,一个redisServer结构体持有多个redisDB数组,并且存储了数组的大小. struct redisServer { ... // 一个数组保存服务器所有的数据库 redisDb *db; // 服务器的数据库的…
前言     Redis链表为双向无环链表!     图解Redis之数据结构篇--简单动态字符串SDS提到Redis使用了简单动态字符串,链表,字典(散列表),跳跃表,整数集合,压缩列表这些数据结构来操作内存,并且简单介绍了Redis简单动态字符串.本篇文章我们继续来分析链表.     链表是一种非常常见的数据结构,在Redis中使用非常广泛,列表对象的底层实现之一就是链表.其它如慢查询,发布订阅,监视器等功能也用到了链表. 系列文章 图解Redis之数据结构篇--简单动态字符串SDS 图解R…
图解Redis之数据结构篇--简单动态字符串SDS 前言     相信用过Redis的人都知道,Redis提供了一个逻辑上的对象系统构建了一个键值对数据库以供客户端用户使用.这个对象系统包括字符串对象,哈希对象,列表对象,集合对象,有序集合对象等.但是Redis面向内存并没有直接使用这些对象.而是使用了简单动态字符串,链表,字典(散列表),跳跃表,整数集合,压缩列表这些数据结构来操作内存. 系列文章 图解Redis之数据结构篇--简单动态字符串SDS 图解Redis之数据结构篇--链表 图解Re…
前言     字典在Redis中的应用非常广泛,数据库与哈希对象的底层实现就是字典. 系列文章 图解Redis之数据结构篇--简单动态字符串SDS 图解Redis之数据结构篇--链表 图解Redis之数据结构篇--字典 一.复习散列表 1.1 散列表     散列表(哈希表),其思想主要是基于数组支持按照下标随机访问数据时间复杂度为O(1)的特性.可是说是数组的一种扩展.假设,我们为了方便记录某高校数学专业的所有学生的信息.要求可以按照学号(学号格式为:入学时间+年级+专业+专业内自增序号,如2…
前言       跳跃表是一种有序的数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的.这么说,我们可能很难理解,我们可以先回忆一下链表. 一.复习跳跃表 1.1 什么是跳跃表     对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表.这样查找效率就会很低,时间复杂度会很高,是 O(n).     如果我们想要提高其查找效率,可以考虑在链表上建索引的方式.每两个结点提取一个结点到上一级,我们把抽出来的那一级叫…
前言     同整数集合一样压缩列表也不是基础数据结构,而是 Redis 自己设计的一种数据存储结构.它有点儿类似数组,通过一片连续的内存空间,来存储数据.不过,它跟数组不同的一点是,它允许存储的数据大小不同. 一.压缩列表     听到"压缩"两个字,直观的反应就是节省内存.之所以说这种存储结构节省内存,是相较于数组的存储思路而言的.我们知道,数组要求每个元素的大小相同,如果我们要存储不同长度的字符串,那我们就需要用最大长度的字符串大小作为元素的大小(假设是20个字节).存储小于 2…
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com 本文是微信公众号[Java技术江湖]的<探索Redis设计与实现>其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有…
数据持久化 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 RDB持久化 RDB 持久化功能所生成的 RDB 文件是一个经过压缩的二进制文件,通过该文件可以还原生成 RDB 文件时的数据库状态. 基本使用 另外,由于AOF文件更新更频繁,所以: 优先使用AOF进行还原 只有AOF关闭时才会进行RDB备份 BGSAVE 虽然是非阻塞的,但是在进行时会拒绝掉 SAVE.BGSAVE命令,BGREWRITEAOF 会被推迟到执行完再执行. 而如果 BGREWRITEAOF…
前言     整数集合(intset)并不是一个基础的数据结构,而是Redis自己设计的一种存储结构,是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时, Redis i就会使用整数集合作为集合键的底层实现. 一.整数集合实现     整数集合(intset)是Redis用于保存整数值的集合抽象数据结构,它可以保存类型为int16_t.int32_t或者int64_t的整数值,并且保证集合中不会出现重复元素. //每个intset结构表示一个整数集合 typedef…
学完MySQL InnoDB之后,又开始学习和研究Redis. 首先介绍下书:<Redis设计与实现>第二版 黄健宏著,机械工业出版社,388页,基于redis3.0版本.版本有点低,这个影响不大,基本面变化不大,而变化的部分网上查资料可以弥补. 一.概述 Redis服务器是一个键值对(key-value pair)类型数据库服务器,属于NoSQL.Redis源码使用ANSI C语言编写而成. 它最大的特点数据全部放缓存,主要用于读写操作频繁的,如秒杀系统.我联想的是我们监控系统中的秒级回放,…
<Redis设计与实现>读书笔记 很喜欢这本书的创作过程,以开源的方式,托管到Git上进行创作: 作者通读了Redis源码,并分享了详细的带注释的源码,让学习Redis的朋友轻松不少: 阅读优秀的源码作品能快速的提升编码内功,而像Redis这样代码量不大(2万多行)却句句精致的作品,当然不能错过: 有兴趣的朋友当好好享用: 源码:https://github.com/huangz1990/annotated_redis_source 以下是这本书重点环节的读书笔记: Redis的内部字符串实现…
本文转自:https://blog.csdn.net/wellway/article/details/76176760 在之前的这篇文章 在ExpressJS(NodeJS)中设置二级域名跨域共享Cookie 中提及将Session存放到Mongodb中,其中有很多讲解的不是很详细. 我们为什么要把Session存放到数据中,以及又为什么要在子域名间跨域共享Cookie呢? Session与Cookie的关系 客户端与服务会使用一个Sessionid的Cookie值来进行客户端和服务器端会话的匹…
菜鸟nginx源代码剖析数据结构篇(六) 哈希表 ngx_hash_t(上) Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 Date:October 31h, 2014 1.哈希表ngx_hash_t的优势和特点 哈希表是一种典型的以空间换取时间的数据结构.在没有冲突的情况下,对随意元素的插入.索引.删除的时间复杂度都是O(1).这样优秀的时间复杂度是通过将元素的key值以ha…
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com 本文是微信公众号[Java技术江湖]的<探索Redis设计与实现>其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有…
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com 本文是微信公众号[Java技术江湖]的<探索Redis设计与实现>其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有…
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com 本文是微信公众号[Java技术江湖]的<探索Redis设计与实现>其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有…
菜鸟nginx源码剖析数据结构篇(六) 哈希表 ngx_hash_t(上) Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 Date:October 31h, 2014 1.哈希表ngx_hash_t的优势和特点 哈希表是一种典型的以空间换取时间的数据结构,在没有冲突的情况下,对任意元素的插入.索引.删除的时间复杂度都是O(1).这样优秀的时间复杂度是通过将元素的key值以has…
引言 今天周末,我在家坐着掐指一算,马上又要到一年一度的金九银十招聘季了,国内今年上半年受到 YQ 冲击,金三银四泡汤了,这就直接导致很多今年毕业的同学会和明年毕业的同学一起参加今年下半年的秋招,这个竞争就比较激烈了. 最近后台有一些朋友给我留言,希望我能写写招聘相关的内容,毕竟虽然说是金九银十,但是很多大公司的校招从 7 . 8 月份就开始了. 本来是想写点面试技巧和简历技巧的,但我转念一想,大家都是搞技术的,问题的核心还是技术能力要过关,面试技巧这东西最多只能用作锦上添花,而技术能力过不去,…
列表对象有 3 种编码:ziplist.linkedlist.quicklist. ziplist 和 linkedlist 是 3.2 版本之前的编码. quicklist 是 3.2 版本新增的编码,ziplist 和 linkedlist 在 3.2 版本及后续版本将不再是列表对象的编码. 编码定义如下(server.h): #define OBJ_ENCODING_LINKEDLIST 4 #define OBJ_ENCODING_ZIPLIST 5 #define OBJ_ENCODI…
目录 前言 1. 命令请求的执行过程 1.1 发送命令请求 1.2 读取命令请求 1.3 命令执行器(1):查找命令实现 1.4 命令执行器(2):执行预备操作 1.5 命令执行器(3):调用命令的实现函数 1.6 命令执行器(4):执行后续工作 1.7 将命令回复发送给客户端 1.8 客户端接收并打印命令回复 2. serverCron 函数 3. 初始化服务器 3.1 初始化服务器状态结构 3.2 载入配置选项 3.3 初始化服务器数据结构 3.4 还原数据库状态 3.5 执行事件循环 最后…
Redis 中数据的持久化 前言 AOF 持久化 什么是 AOF 持久化 为什么要后记录日志呢 AOF 的潜在风险 AOF 文件的写入和同步 AOF 文件重写机制 AOF 的数据还原 RDB 持久化 什么是 RDB 持久化 RDB 如何做内存快照 快照时发生数据修改 多久做一次快照 过期的键如何持久化 总结 参考 Redis 中数据的持久化 前言 我们知道 Redis 是内存数据库,所有操作都在内存上完成.内存的话,服务器断电,内存上面的数据就会丢失了.这个问题显然是需要解决的. Redis 中…
简述Redis设计与实现 Redis是一个高性能的key-value的非关系型数据库,Redis是运行在内存中的一种数据库,但是它也可以持久化到磁盘中,Redis的实现有着更为复杂的数据结构并且提供对他们的原子性操作. Redis的优势 Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,以便redis服务器重启的时候再次加载使用. Redis不仅仅支持简单的key-value类型数据的存储,同时还提供了其它的数据结构存储例如:list.set.zset.hash等. Redis支持三种…
数据库和事件 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 数据库 数据库的结构定义在 redis.h/redisServer 这个结构体中,这个结构体有许多的字段用以记录 Redis 数据库的状态.学习数据库的过程中会慢慢地接触这里面的各种字段. struct redisServer { //... } 不同的数据库 在上述结构中, int dbnum 保存了数据库的数量,默认为16:redisDb *db 指向了服务器中所有的数据库(如下 1 处) 而客户端…
1 介绍 从上一篇的 <深刻理解高性能Redis的本质> 中可以知道, 我们经常在数据库层上加一层缓存(如Redis),来保证数据的访问效率. 这样性能确实也有了大幅度的提升,但是本身Redis也是一层服务,也存在宕机.故障的可能性. 一旦服务挂起,可能生产的后果包括如下几方面: 1.Redis的数据是存在内存中的,所以一旦挂起,内存中的数据会全部丢失. 2.I/O从内存层级迁移到磁盘层级,性能极速下降. 3.原本访问缓存的请求会透过缓存层直接投向数据库,给数据库带来极大的压力,甚至导致雪崩.…
Redis设计与实现(一~五整合版) by @飘过的小牛 一 前言 项目中用到了redis,但用到的都是最最基本的功能,比如简单的slave机制,数据结构只使用了字符串.但是一直听说redis是一个很牛的开源项目,很多公司都在用.于是我就比较奇怪,这玩意不就和 memcache 差不多吗?仅仅是因为memcache是内存级别的,没有持久化功能.而redis支持持久化?难道这就是它的必杀技? 带着这个疑问,我在网上搜了一圈.发现有个叫做huangz的程序员针对redis写了一本书叫做<redis设…
菜鸟nginx源代码剖析数据结构篇(一)动态数组ngx_array_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 Date:October 20h, 2014 1.ngx_array优势和特点 ngx_array _t是一个顺序容器.支持达到数组容量上限时动态改变数组的大小,类似于STL中vector.具有下面特性: 下标直接索引.訪问速度快 动态增长 由slab内存池统一…
nginx源代码分析数据结构篇(两) 双链表ngx_queue_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 Date:October 20h, 2014 1.ngx_queue优势和特点 ngx_queue作为顺序容器链表.它优势在于其能够高效地运行插入.删除.合并操作,在插入删除的过程中,仅仅须要改动指针指向.而不须要拷贝数据,因此.对于频繁改动的容器非常适合. 此外,…
重读了一遍redis设计与实现,这次收获也不错,把之前还有些疑惑的点:redis跳跃表的原理.redis持久化的方法.redis复制.redis sentinel.redis集群等,都重新熟悉了一遍,多了一些理解,其实技术书就是这样,一定是需要读几遍才能彻底吃透的. 简单总结一下: 跳跃表:其实是空间换时间的做法,通过增加多余的节点提高查找的速度,同时保留了链表的插入.删除的高效率的特点. redis持久化分为两种:rdb.aof,以aof为先,rdb就是直接把数据库的内容dump一份到磁盘上的…
目录 redis设计关系数据库 前言 设计用户信息表结构 hash存储记录 set存储id 图示 索引/查询: 1.select 查询所有记录 : 类似sql的select from table_name 2.根据主键查询记录 3.其他列索引 c++ 实现 小结 redis设计关系数据库 前言 最近需要一张用户信息表,因为数据量并不大,想先放在内存中,等需求变更了,再移到磁盘上,或者往mysql塞,那么问题来了,怎么用redis的数据类型设计一个关系数据库呢. redis只有key-value这…