本篇是我们redis系列的最后一篇,整个系列其实是我学习<redis设计与实现>的笔记,这本书感觉不错,推荐使用redis的小伙伴都可以看看. 整个系列的文字都比较干,很多数据结构和C语言的东西,不过只有这么接近底层,我们才能知道redis为什么可以做到这么块. 类型检查与命令多态 redis中用于操作键的命令基本上可以分为两种类型. 其中一种命令可以对任何类型的键执行,比如说del命令.expire命令.rename命令.type命令.object命令等. 而另一种命令只能对特定类型的键执行…
前面几篇文章,我们一起学习了redis用到的所有主要数据结构,比如简单动态字符串(sds).双端链表.字典.压缩列表.整数集合等等. redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象.列表对象.哈希对象.集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种我们前面所介绍的数据结构. 通过这五种这五种不同类型的对象,redis可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令.使用对象的另一个好处…
链表简介 链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地跳转链表的长度. 作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用C语言并没有内置这种数据结构,所以Redis构建了自己的链表实现. 链表在Redis中的应用非常多,比如列表键的底层实现之一就是链表,发布与订阅.慢查询.监视器等功能也用到了链表,Redis服务器本身还是用链表来保存多个客户端的状态信息,以及使用链表来构建客户端输出缓冲区(output buffer). 链表和链…
redis是我们使用非常多的一种缓存技术,他的性能极高,读的速度是110000次/s,写的速度是81000次/s.这么高的性能背后,到底是怎么样的实现在支撑,这个系列的文章,我们一起去看看. redis的底层数据结构有以下7种,包括简单动态字符串(SDS),链表.字典.跳跃表.整数集合.压缩列表.对象.今天我们一起看下简单动态字符串(simple dynamic string),后面的文章以SDS简称. SDS简介 Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符串数组,以下简称…
字典,又称为符号表(symbol table).关联数组(associative array)或映射(map),是一种用于保存键值对的抽象数据结构. 字典经常作为一种数据结构内置在很多高级编程语言里面,但redis所使用的C语言并没有内置这种数据结构,因此Redis构建了自己的字典实现. 字典在redis中的应用相当广泛,比如redis的数据库就是使用字典来作为底层实现的,对数据库的增.删.查.改操作也是构建在对字典的操作之上的. 除了用来实现数据库之外,字典还是哈希键的底层实现之一,当一个哈希…
整数集合 整数集合(intset)是集合键的底层实现之一,当一个集合只包含 整数值元素,并且这个集合的元素数量不多时,Redis就会使用郑书记和作为集合键的底层实现. 整数集合的实现 整数集合是redis用于保存整数值的集合抽象数据结构,它可以可以保存类型位int16_t.int32_t.int64_t的整数值,并且保证集合中不会出现重复元素. intset.h/intset结构表示一个整数集合 typedef struct intset { uint32_t encoding;//编码方式 u…
一.  概述 对于前面的五章中,已清楚了数据对象的类型以及命令实现,其实还有一种数据对象为HyperLogLog,以后需要用到再了解.下面再了解类型检查,内存回收,对象共享,对象的空转时长. 1.1   类型检查与命令多态 redis中用于操作键的命令基本上可以分为两种类型,一种是可以对任何的键执行,如:del, expire,rename,type,object 这些命令等,对于这些命令属于多态命令.另一种命令只能针对特定类型的键执行,如: Set, get, append, strlen 等…
目前为止,我们介绍了 redis 中非常典型的五种数据结构,从 SDS 到 压缩列表,这都是 redis 最底层.最常用的数据结构,相信你也掌握的不错. 但 redis 实际存储键值对的时候,是基于对象这个基本单位的,并且往往一个对象下面对对应不同的底层数据结构实现以便于在不同的场景下切换底层实现提升效率.例如列表对象在元素不多情况话会使用压缩列表来实现以压缩内存,而在元素比较多的时候常规的双端链表进行实现. 下面我们就具体来看看 redis 中都有哪些对象,底层又对应哪些可供选择的数据结构.…
今天我们来看一下redis的数据类型.既然redis的键值对可以保存不同类型的值,那么很自然就需要对键值对的类型进行检查以及多态处理.下面我们将对redis所使用的对象系统进行了解,并分别观察字符串.哈希表.列表.集合和有序集类型的底层实现. 3.1 对象处理机制 在redis的命令中,用于对键进行处理的命令占了很大一部分,而对于键所保存的值的类型(键的类型),键能执行的命令又各不相同.如:LPUSH和LLEN只能用于列表键,而SADD和SRANDMEMBER只能用于集合键.又比如DEL.TTL…
redis底层数据结构 一.简单动态字符串(SDS) 定义: struct sdshdr{ int len;    //SDS所保存的字符串长度 int free //记录buf数组中为使用的字节数量,预留内存长度 char buf[] //字节数组,用于保存字符串 } SDS与C字符串的区别及特点: 1)获取字符串长度: C字符串:遍历整个字符串,直至遇到结束符为止,复杂度为O(n). SDS:在len中记录了本身的长度,所以获取一个SDS长度的复杂度为O(1). 2)杜绝缓存区溢出 C字符串…
上一篇说了Redis有五种数据类型,今天就来聊一下Redis底层的数据结构是什么样的.是这一周看了<redis设计与实现>一书,现来总结一下.(看书总是非常烦躁的!) Redis是由C语言所写,所以以下会有c语言的片段,不过都是一些定义,很好理解. Redis底层数据结构有六种: 1.简单动态字符串 2.链表 3.字典 4.跳跃表 5.整数集合 6.压缩列表 7.快速列表 接下来看一下每种数据结构到底是啥? 一.简单动态字符串 (1)Redis默认字符串底层存储结构,比如set k1 v1,键…
redis对象 redis中有五种常用对象 我们所说的对象的类型大多是值的类型,键的类型大多是字符串对象,值得类型大概有以下几种,但是无论哪种都是基于redisObject实现的 redisObject的结构如下 typedef struct redisObject { unsigned type:4; //类型 有五种,分别对应五种常见的值类型 unsigned encoding:4; // 编码,标明底层数据结构的类型 unsigned lru:LRU_BITS; /* LRU time (…
说明 用于分析redis底层数据结构以及内存情况 底层数据结构分析 1.查看key键的对象类型type key 本地:>sadd test1 本地:>type test1 set 2.查看key键对应redi对象类型的数据结构 sadd test1 本地:>ct encoding test1 intset 本地:>sadd test1 f 本地:>object encoding test1 hashtable 3.查看对应key值的引用计数(被共享而不是重复创建) 1919a…
redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.redis底层使用了多种数据结构来实现各种特性.对于Redis底层实现的了解,可以让我们对Redis工作原理更加清晰. 那么redis数据结构与内部编码,如下图: redis对象(redisObject) redis源码内部是有一个redisObject对象,redis的键值都是redisObject对象…
第一篇文章,思来想去,写一写Redis吧,最近在深入研究它. 一丶Redis底层结构 1. redis 存储结构 redis的存储结构从外层往内层依次是redisDb.dict.dictht.dictEntry. redis的Db默认情况下有16个,每个redisDb内部包含一个dict的数据结构. redis的dict内部包含dictht的数组,数组个数为2,主要用于hash扩容使用. dictht内部包含dictEntry的数组,可以理解就是hash的桶,然后如果冲突通过挂链法解决 redi…
redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数…
Redis 底层数据结构 版本:2.9 支持的数据类型: 字符串 散列 列表 集合 有序集合 字符串 Redis 利用原生的 c 字符串进行了一次封装.封装的字符串叫做简单动态字符串:SDS(simple dynamic string) Redis 使用的简单动态字符串比 c 语言原生的字符串有以下优点: 获取字符串长度的复杂度为O(1) 不存在缓存区溢出 修改字符串长度时,不需要频繁分配内存 空间预分配策略 惰性空间策略 二进制安全 二进制安全的意思是,可以将二进制数据使用 SDS 存储,而不…
引言 Redis中每个键值对都是由对象组成: 键总是一个字符串对象(string) 值可以是字符串对象(string).列表对象(list).哈希对象(hash).集合对象(set).有序集合对象(zset). 介绍 redis官方网站中对其数据类型的简单介绍: An introduction to Redis data types and abstractions 摘抄一段关于redis key的介绍: Redis keys Redis keys are binary safe, this m…
/* 样例1: class Parent{ int num = 3; } class Child extends Parent{ int num = 4; } */ /* 样例2: class Parent{ } class Child extends Parent{ int num = 4; } */ /* 样例3: class Parent{ void show(){ System.out.println("Parent Show!"); } } class Child exten…
1.介绍垃圾收集器 垃圾收集器(Garbage Collection,GC)就是用于回收方法区和堆区,其他程序计数器.虚拟机栈.本地方法栈这3个区域都是随线程而生,随线程而灭,栈中的栈帧会随着方法的进入和退出而有条不紊地执行着出栈和入栈操作.每一个栈帧中分配多少内存在类结构确定下来时就是已知的,因此这几个区域的内存分配和回收都是具备确定性,所以这3个区域不需要考虑回收,因为方法结束或线程结束时,内存自然就跟着回收了.而Java堆和方法区就不同,一个接口中的多个实现类需要的内存可能不一样,一个方法…
redis下操作hash对象 hash用于存储对象,对象的格式为键值对 命令 设置 设置单个属性 HSET key field value 设置多个属性 HMSET key field value [field value ...] 获取 获取一个属性的值 HGET key field 获取多个属性的值 HMGET key field [field ...] 获取所有属性和值 HGETALL key 获取所有的属性 HKEYS key 返回包含属性的个数 HLEN key 获取所有值 HVALS…
近期学习了redis底层框架,好多东西之前都没听说过,算是大开眼界了. 先梳理下redis正常的通讯流程吧 首先服务器启动都有主函数main,这个main函数就在redis.c里 首先是initserverconfig(),在这里初始化了redisserver基本的配置信息, 接着调用loadServerConfig(char *filename) 对 server 全局变量重新初始化. 然后是调用daemonize(),实现守护进程,脱离了控制台,是这个进程 成为独立的首领进程 接下来是ini…
在项目中,缓存以及mq消息队列可以说是不可或缺的2个重要技术.前者主要是为了减轻数据库压力,大幅度提升性能.后者主要是为了提高用户的体验度,我理解的是再后端做的一个ajax请求(异步),并且像ribbmitmq等消息队列有重试机制等功能.这里主要讲redis如何把对象,集合存入,并且取出. 1.在启动类上加入如下代码 private Jedis jedis; private JedisPoolConfig config; private JedisShardInfo sharInfo; @Bea…
垃圾回收(GC)是JVM的一大杀器,它使程序员可以更高效地专注于程序的开发设计,而不用过多地考虑对象的创建销毁等操作.但是这并不是说程序员不需要了解GC.GC只是Java编程中一项自动化工具,任何一个工具都有它适用的范围,当超出它的范围的时候,可能它将不是那么自动,而是需要人工去了解与适应地适用. 拥有一定工作年限的程序员,在工作期间肯定会经常碰到像内存溢出.内存泄露.高并发的场景.这时候在应对这些问题或场景时,如果对GC不了解,很可能会成为个人的发展瓶颈. 接下来的两文将详细学习下JVM中垃圾…
近期学习了redis底层框架,好多东西之前都没听说过,算是大开眼界了. 先梳理下redis正常的通讯流程吧 首先服务器启动都有主函数main,这个main函数就在redis.c里 首先是initserverconfig(),在这里初始化了redisserver基本的配置信息, 接着调用loadServerConfig(char *filename) 对 server 全局变量重新初始化. 然后是调用daemonize(),实现守护进程,脱离了控制台,是这个进程 成为独立的首领进程 接下来是ini…
Java存在垃圾回收机制,JVM会去回收垃圾,释放资源,而不是像C++一样有程序员去完成 垃圾回收机制的特点 垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(例如数据库连接.网络IO等资源) 程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候进行 在垃圾回收机制回收任何对象之前,总会先调用它的finalize()方法,该方法可能使该对象重新复活(让一个引用变量重新引用该对象),从而导致垃圾回收机制取消回收 对象在内存中的状态 根据引用变量所引用的状态,可分为以下三种: 可达状态…
•写在前面说起Java和C++,很容易想到让人疯狂的指针,Java使用了内存动态分配和垃圾回收技术,让我们从C++的各种指针问题中摆脱出来,更加专心于业务逻辑,不过如果我们需要深入了解java的JVM相关原理,我们必须要面对这些东西,深入了解JVM在内存动态分配和垃圾回收技术的原理知识,这篇文章就是来做一个先导,在jvm进行垃圾回收之前,它必须要知道回收的对象是否已“死”,这样才能保证程序的正常稳定. •对象的创建我们将回收对象前,先讲讲在虚拟机上,对象是怎么被创建的.在我们编写代码的角度(语言…
Redis底层函数详解 serverCron 函数 它负责管理服务器的资源,并维持服务器的正常运行.在执行 serverCron 函数的过程中会调用相关的子函数,如 trackOperationsPerSecond.SigtermHandler.clientsCron.databasesCron 等函数.默认情况下,每隔 100 毫秒执行一次 serverCron 函数 trackOperationsPerSecond 函数 是 serverCron 函数的一个子函数.采用抽样计算的方式,计算并…
作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/details/105173842 RDB方式:https://blog.csdn.net/ctwctw/article/details/105265689 对比:https://blog.csdn.net/ctwctw/article/details/105147277 准备工作 安装Redis,…
Gc如何判断对象可以被回收? 1 引用计数器 引用计数法的算法思路:给对象增加一个引用计数器,每当对象增加一个引用计数器+1,失去一个引用-1,所以当计数器是0的时候对象就没有引用了,就会被认为可回收垃圾 引用计数法,可能会出现A引用了B,B又引用了A,这时候就算他们都不再使用了,但因为他们相互引用,计数器=1,永远无法被回收,这是这种方法很大的劣势,但效率较高 在主流的JVM中没有选用引用计数法来管理内存(比如java),最主要的原因是引用计数法无法解决对象的循环引用问题. 在主流的JVM中没…