说到redis的Dict(字典),虽说算法上跟市面上一般的Dict实现没有什么区别,但是redis的Dict有2个特殊的地方那就是它的rehash(重新散列)和它的字典节点单向链表. 以下是dict用到的结构: typedef struct dictEntry {//字典的节点 void *key; union {//使用的联合体 void *val; uint64_t u64;//这两个参数很有用 int64_t s64; } v; struct dictEntry *next;//下一个节点…
本文及后续文章,Redis版本均是v3.2.8 上篇文章<Redis 数据结构之dict>,我们对dict的结构有了大致的印象.此篇文章对dict是如何维护数据结构的做个详细的理解. 老规矩还是打开Redis的源码,文件dict.c 一.dict数据结构的维护 1.dictCreate - 创建一个新的哈希表 /* Reset a hash table already initialized with ht_init(). * NOTE: This function should only b…
redis虽说是用C语言开发的,但是redis考虑了性能.安全性.效率性.功能等要,redis底层存储字符串实现,自己实现了名为简单动态字符串(Simple dynamic string)简称SDS的结构来存储字符串,这个结构有int len(当前字符串长度), int free(未使用的字符串长度可以说是缓冲), char buf[](存储的字符串数组)这几个变量. 接下来我们开始分析C语言默认字符串和SDS字符串的区别以及redis为什么要使用SDS. 1.C语言的字符串存储并不能记录自身字…
上篇文章<Redis数据结构概述>中,了解了常用数据结构.我们知道Redis以高效的方式实现了多种数据结构,因此把Redis看做为数据结构服务器也未尝不可.研究Redis的数据结构和正确.高效使用,对我们的应用程序会大有裨益.接下来的文章中我们逐个深入理解Redis的数据结构和使用场景. Redis数据结构,我们从Redis暴露给外部使用的数据结构和内部实现的两个角度来学习. 1.暴露给外部使用的数据结构 string list hash set sort set 2.内部实现基础结构即底层数…
redis里拥有一个灵活扩展且获取表头表尾复杂度为O(1)的双端列表,分为list和listNode2部分组成. list: typedef struct list {//链表 listNode *head;//链表头 listNode *tail;//链表尾 void *(*dup)(void *ptr); //复制函数指针 void (*free)(void *ptr); //释放内存函数指针 int (*match)(void *ptr, void *key); //比较函数指针 unsi…
什么样的数据适合放入Redis? sql执行耗时特别久,且结果不频繁变动的数据,适合放入Redis. Redis是单线程的,为什么会这么快? 纯内存操作 单线程操作,避免频繁的上下文切换 采用了非阻塞I/O多路复用机制 Redis数据类型及使用场景 Redis只能存5G数据,可你写了10G,如何删除多余的5G数据? Redis采用定期删除+惰性删除策略: 定期删除,redis每过一段时间(默认100ms)进行随机抽取检查,有过期key则删除: 惰性删除,放任过期键不管,在每次获取键时检查是否过期…
redis数据结构介绍 我们已经知道redis是一个基于key-value数据存储的数据结构数据库,这里的key指的是string类型,而对应的value则可以是多样的数据结构.其中包括下面五种类型: 1.string 字符串 string字符串类型是redis最基础的数据存储类型.string是最基础的一种数据类型,其可以拓展为某种特定类型,例如普通文本,json字符串,二进制数据等等.就本质上来说,接下来要介绍的hash,list,set等其内部最基础的组成单位依然是string,只不过re…
目录 Redis数据结构-链表与字典 链表 Redis链表节点的结构 Redis链表的表示 Redis链表用在哪 字典 Redis字典结构总览 Redis字典结构分解 哈希算法 解决键冲突 rehash 渐进式rehash Redis数据结构-链表与字典 大家好,我是白泽.今天我们来聊一聊Redis中的链表与字典 链表 关于链表的基础概念其实你在学习Redis之前一定积累了不少,所以本文将默认你已经掌握了链表相关的基础知识,而Redis的链表其实也就是普通的链表~ 因为Redis是使用C语言编写…
redis作为目前最流行的nosql缓存数据库,凭借其优异的性能.丰富的数据结构已成为大部分场景下首选的缓存工具. 由于redis是一个纯内存的数据库,在存放大量数据时,内存的占用将会非常可观.那么在一些场景下,通过选用合适数据结构来存储,可以大幅减少内存的占用,甚至于可以减少80%-99%的内存占用. ​ 利用zipList来替代大量的Key-Value 先来看一下场景,在Dsp广告系统.海量用户系统经常会碰到这样的需求,要求根据用户的某个唯一标识迅速查到该用户id.譬如根据mac地址或uui…
Redis数据结构 Redis数据结构详解(一)   前言 Redis和Memcached最大的区别,Redis 除啦支持数据持久化之外,还支持更多的数据类型而不仅仅是简单key-value结构的数据记录.Redis还支持对这些数据类型做更多的服务端操作,从而也能减少网路的IO次数与数据体积,这里也比Memcached要方便与高效,只针对这一点啊,想喷的左上角群喷.上篇吹牛逼20分钟教你做memcached大神 Redis主要支持的数据类型有5种:String ,Hash ,List ,Set…
18-1 字符串的一些基本命令 18-1 :配置Spring关于Redis字符串的运行环境 <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="50"></property> <property name="maxTotal&quo…
Redis混合存储产品是阿里云自主研发的完全兼容Redis协议和特性的混合存储产品. 通过将部分冷数据存储到磁盘,在保证绝大部分访问性能不下降的基础上,大大降低了用户成本并突破了内存对Redis单实例数据量的限制. 其中,对冷热数据的识别和交换是混合存储产品性能的关键因素. 在Redis混合存储中,内存和磁盘的比例是用户可以自由选择的: Redis混合存储实例将所有的Key都认为是热数据,以少量的内存为代价保证所有Key的访问请求的性能是高效且一致的.而对于Value部分,在内存不足的情况下,实…
1.redis是什么 2.redis的作者何许人也 3.谁在使用redis 4.学会安装redis 5.学会启动redis 6.使用redis客户端 7.redis数据结构 – 简介 8.redis数据结构 – strings 9.redis数据结构 – lists 10.redis数据结构 – 集合 11.redis数据结构 – 有序集合 12.redis数据结构 – 哈希 13.聊聊redis持久化 – 两种方式 14.聊聊redis持久化 – RDB 15.聊聊redis持久化 – AOF…
一.REDIS_INCODING_HT (dict字典,hashtable) dict是一个用于维护key和value映射关系的数据结构.redis的一个database中所有的key到value的映射,就是使用一个dict来维护的.不过,他在redis被使用的地方还很多,比如,一个redis hash结构,当它的field较多的时候,便会采用dict来存储.再比如,redis配合使用dict和skiplist来共同维护一个zset. 在redis中,dict也是一个基于哈希表的算法.和传统的哈…
redis是一个K-V NoSql非关系型数据库,redis有物种数据类型,分别是String,Hash,list,set,zset:这五种类型都是针对K-V中的V设计的. 1.总体介绍:关于redis数据存储的细节,设计到内存分配器(如jemalloc).简单动态字符串(SDS).五种对象类型的内部编码.redisObject. 1).dictEntry:redis时Key-Value数据库,因此每一个键值对都会有一个dictEnry,里面存储了指向key和value的指针和只想下一个dict…
目录 前言 1. Redis对象概述 1.1 对象的定义 2. 字符串对象 3. 列表对象 3.1 quicklist 快速链表 4. 哈希对象 5. 集合对象 6. 有序集合对象 7. Redis对象的特点 7.1 类型检查与命令多态 7.2 内存回收 7.3 对象共享 7.4 对象的空转时长 最后 前言 参考资料:<Redis设计与实现 第二版>: 本篇笔记按照书里的脉络,将知识点分为四个部分.其中第一部分数据结构与对象分为上中下篇,上篇包括:SDS.链表和字典:中篇包括跳跃表.整数集合和…
1 引言 Redis作为基于内存的非关系型的K-V数据库.因读写响应快速.原子操作.提供了多种数据类型String.List.Hash.Set.Sorted Set.在项目中有着广泛的使用,今天我们来探讨下下Redis的数据结构是如何实现的. 2 数据存储 2.1 RedisDB Redis将数据存储在redisDb中,默认0~15共16个db.每个库都是独立的空间,不必担心key冲突问题,可通过select命令切换db.集群模式使用db0 typedef struct redisDb { di…
前提知识 字典,又被称为符号表(symbol table)或映射(map),其实简单地可以理解为键值对key-value. 比如Java的常见集合类HashMap,就是用来存储键值对的. 字典中的键(key)都是唯一的,由于这个特性,我们可以根据键(key)查找到对应的值(value),又或者进行更新和删除操作. 字典dict的实现 Redis的字典使用了哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,每个节点也保存了对应的键值对. Redis的字典dict结构如下: typedef s…
Redis 数据结构与内存管理策略(上) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.List.Hash.Set.Zset 案例:沪江团购系统大促 hot-top 接口 cache 设计 Redis 内存数据结构与编码 OBJECT encoding key.DEBUG OBJECT key 简单动态字符串(simple dynamic string) 链表(linked list) 字…
大家好,我是小林. Redis 为什么那么快? 除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis 能高效的处理. 因此,这次我们就来好好聊一下 Redis 数据结构,这个在面试中太常问了. 注意,Redis 数据结构并不是指 String(字符串)对象.List(列表)对象.Hash(哈希)对象.Set(集合)对象和 Zset(有序集合)对象,因为这些是 Redis 键值对中值的数据类型,也就是数据的保存形式,…
摘要:本文把Redis新旧版本的数据结构说图解一遍,共有 9 种数据结构:SDS.双向链表.压缩列表.哈希表.跳表.整数集合.quicklist.listpack. 本文分享自华为云社区<为了拿捏 Redis 数据结构,我画了 40 张图(完整版)>,作者: 小林coding. Redis 为什么那么快? 除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis 能高效的处理. 因此,这次我们就来好好聊一下 Redi…
Redis的内存存储结构是个大的字典存储,也就是我们通常说的哈希表.Redis小到能够存储几万记录的CACHE,大到能够存储几千万甚至上亿的记录(看内存而定),这充分说明Redis作为缓冲的强大.Redis的核心数据结构就是字典(dict),dict在数据量不断增大的过程中.会遇到HASH(key)碰撞的问题,假设DICT不够大,碰撞的概率增大,这样单个hash 桶存储的元素会越来愈多,查询效率就会变慢.假设数据量从几千万变成几万,不断减小的过程.DICT内存却会造成不必要的浪费.Redis的d…
Redis数据结构底层总结 本篇文章是基于作者黄建宏写的书Redis设计与实现而做的笔记 数据结构与对象 Redis中数据结构的底层实现包括以下对象: 对象 解释 简单动态字符串 字符串的底层实现 链表 列表的底层实现 字典 运用在多个方面,包括Hash的实现等 跳跃表 有序集合的底层实现 整数集合 集合的底层实现之一 压缩字典 列表键和哈希键的底层实现之一 String Redis中并没有直接使用C语言中的字符串,而是在其基础之上实现了字符串的数据结构,叫做简单动态字符串(SDS). 其内部的…
Redis 数据结构与内存管理策略(下) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.List.Hash.Set.Zset 案例:沪江团购系统大促 hot-top 接口 cache 设计 Redis 内存数据结构与编码 OBJECT encoding key.DEBUG OBJECT key 简单动态字符串(simple dynamic string) 链表(linked list) 字…
上一篇博客我们介绍了 redis的五大数据类型详细用法,但是在 Redis 中,这几种数据类型底层是由什么数据结构构造的呢?本篇博客我们就来详细介绍Redis中五大数据类型的底层实现. 1.演示数据类型的实现 上篇博客我们在介绍 key 相关命令的时候,介绍了如下命令: OBJECT ENCODING key 该命令是用来显示那五大数据类型的底层数据结构. 比如对于 string 数据类型: 我们可以看到实现string数据类型的数据结构有 embstr 以及 int. 再比如 list 数据类…
本文及后续文章,Redis版本均是v3.2.8 上文我们说到intset整型集合的数据结构定义即元素的添加和查询操作,本文我们来看下Redis暴露给外面使用的Set集合,先通过一些基本的命令回顾下set 一.set底层数据结构 我们查阅Redis Set命令文档知道: sadd用于分别向集合 myset和myset2中添加元素.添加的元素既有数字,也有非数字(”a”和”b”). sismember用于判断指定的元素是否在集合内存在. sinter, sunion和sdiff分别用于计算集合的交集…
本文及后续文章,Redis版本均是v3.2.8 上篇文章<Redis数据结构之robj>,我们说到redis object数据结构,其有5中数据类型:OBJ_STRING,OBJ_LIST, OBJ_SET,OBJ_ZSET,OBJ_HASH.集合对象set有着广泛的实际业务应用场景,它包含的元素无序并且不能重复及集合间的交.并.差等基础的操作.本篇就来说说Redis暴露给我们使用的set集合对象的底层实现-intset. 其实,可以理解为有序整型集合 intset是一个由整数组成的有序集合,…
前言 上篇文章Redis闲谈(1):构建知识图谱介绍了redis的基本概念.优缺点以及它的内存淘汰机制,相信大家对redis有了初步的认识.互联网的很多应用场景都有着Redis的身影,它能做的事情远远超出了我们的想像.Redis的底层数据结构到底是什么样的呢,为什么它能做这么多的事情?本文将探秘Redis的底层数据结构以及常用的命令. 本文知识脑图如下: 一.Redis的数据模型 用 键值对 name:"小明"来展示Redis的数据模型如下: dictEntry: 在一些编程语言中,键…
本文出自「掘金社区」,欢迎戳「阅读原文」链接和作者进行技术交流 ?? 作者简介 世宇,一个喜欢吉他.MDD 摄影.自走棋的工程师,属于饿了么上海物流研发部.目前负责的是网格商圈.代理商基础产线,平时喜欢专研技术,主攻 Java. redis 对于团队中的同学们来说是非常熟悉的存在了,我们常用它来做缓存.或是实现分布式锁等等.对于其 api 中提供的几种数据结构,大家也使用得得心应手. api 中的数据结构有如下几种: 的字符数组来表示长度为 N 的字符串, 并且字符数组的最后一个元素总是空字符…
导语 | 缓存+存储的系统架构是目前常见的系统架构,缓存层负责加速访问,存储层负责存储数据.这样的架构需要业务层或者是中间件去实现缓存和存储的双写.冷热数据的交换,同时还面临着缓存失效.缓存刷脏.数据不一致等问题.本文是对腾讯云数据库高级产品经理邹鹏老师在「云加社区沙龙online」的分享整理,希望与大家一同交流 点击此链接,查看完整直播回放 一.前言 在互联网和移动互联网两波浪潮的推动下,存储技术有了飞速发展.移动互联网用户在过去十年增长了10倍,用户的增长带动了数据量的指数级增长,因为激烈的…