首页 > TAG信息列表 > intset
redis set底层实现
所有元素都为整数时,集合会以 intset 结构进行(数据)存储。 当发生以下两种情况时,会导致集合类型使用 hashtable 而非 intset 存储: 1)当元素的个数超过一定数量时,默认是 512 个,该值可通过命令 set-max-intset-entries xxx 来配置。 2)当元素为非整数时,集合将会使用 hashtable高效压缩位图在推荐系统中的应用
作者:vivo互联网技术-Ke Jiachen 一、背景 用户在浏览游戏中心/应用商店的某些模块内容时,会进行一系列滑屏操作并多次请求游戏推荐业务来进行游戏推荐展示,这段时间我们称之为一个用户session。 一个session内用户一般会进行十几次滑屏操作,每次滑屏操作都会请求推荐业务,所以在这个redis之intset整数集合,还是内存优化?
文章目录 前言一、整数集合?1. 背景2. 应用 二、原理分析1. 基本使用2. 数据存储2.1 升级2.2 为何不降级? 3. 效率3.1 时间复杂度:3.2 节省空间? 三、源码分析1. 数据结构2. 常用API3. 基本操作3.1 查询元素3.2 添加元素3.3 删除元素 总结 前言 整数集合(intset)是一个有序Redis原理再学习05:数据结构-整数集合intset
intset介绍 intset 整数集合,当一个集合只有整数元素,且元素数量不多时,Redis 就会用整数集合作为集合键的底层实现。 redis> SADD numbers 1 3 5 7 9 (integer 5) redis> OBJECT ENCODING numbers (intset) 为什么要用 intset? 集合键的另外一种实现是值为空的散列表(hash table),当元漫话Redis源码之五十六
对intset的更新和扩容,不是关键核心的代码: /* Upgrades the intset to a larger encoding and inserts the given integer. */ static intset *intsetUpgradeAndAdd(intset *is, int64_t value) { uint8_t curenc = intrev32ifbe(is->encoding); uint8_t newenc = _intseRedis源码 - Set(集合)
通常我们把Redis Set结构称为无序集合,这在一定程度上是有道理的。为什么是一定程度上呢,因为通过源码的实现过程我们发现了一些小细节。从sadd命令开始入手: sadd先按照redis的一贯套路 检查key是否存在,不存在就创建,存在就直接添加值。只是在sadd在创建key的时候它动了一点Redis数据结构(五)-整数集合(intset)
整数集合-intset 概述整数集合的实现整数集合的升级升级之后新元素的摆放位置升级的好处提升灵活性节约内存 整数集合的降级整数集合API 概述 整数集合(intset)是 集合键 的 底层实现之一 当一个集合 只包含 整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合Redis源码学习 - 1.8 - 有序集合
源码位置:intset.h 和 intset.c 8.1 数据结构 /* Note that these encodings are ordered, so: * INTSET_ENC_INT16 < INTSET_ENC_INT32 < INTSET_ENC_INT64. */ #define INTSET_ENC_INT16 (sizeof(int16_t)) #define INTSET_ENC_INT32 (sizeof(int32_t)) #define INTSET_ERedis源码学习之 整数集合
intset应用 Redis在这种小数据量的条件下,会使用内存映射来代替内部数据结构。这就使得整数集合(intset)和压缩(ziplist)这两类节省内存的数据结构应运而生了整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis 就会使用整数集合作为集集合对象 - 《Redis设计与实现》读书笔记
集合对象的编码可以是intset或者hashtable intset编码的集合对象使用整数集合作为底层实现 集合对象包含的所有元素都被保存在整数集合里面 hashtable编码的集合对象使用字典作为底层实现 字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素 字典的每个值都【redis】为什么整数集升级后不能在进行降级操作 | intset位升级频率
前言 整数集合相信有的同学没有听说过,因为redis对外提供的只有封装的五大对象!而我们本系列主旨是学习redis内部结构。内部结构是redis五大结构重要支撑! 前面我们分别从redis内部结构分析了redis的List、Hash、Zset三种数据结构了。今天我们再来分析set数据结构内部是如何存储的【redis】为什么整数集升级后不能在进行降级操作 | intset位升级频率
前言 整数集合相信有的同学没有听说过,因为redis对外提供的只有封装的五大对象!而我们本系列主旨是学习redis内部结构。内部结构是redis五大结构重要支撑! 前面我们分别从redis内部结构分析了redis的List、Hash、Zset三种数据结构了。今天我们再来分析set数据结构内部是如何存储Redis源码浅析(3)跳跃表skiplist和整数集合intset
跳跃表 跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。 跳跃表支持平均O(log N)、最快O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。在大部分情况下,跳跃表的效率和平衡树相媲美,并且因为跳跃表的实redis数据结构-intset
整数集合是纯整数时set的底层实现 typedef struct intset { uint32_t encoding; uint32_t length; int8_t contents[]; } intset; encoding表示数组内的变量的类型,一共三个枚举值(int16,int32,int64) length表示集合中元素个数 contents存放数据 整数集合的特点 有用bit数组构建集合
用bit位来构建集合,查找插入重复数据效率都非常高。 type IntSet struct { words []uint64 } // Has reports whether the set contains the non-negative value x. func (s *IntSet) Has(x int) bool { word, bit := x/64, uint(x%64) return word < len(s.words) &redis基础结构-INTSET
INTSET intset是集合键的底层实现之一, 保存的元素是有序的。可作为集合键底层实现, 如果一个集合满足以下两个条件: 保存可转化为long long类型的元素 元素数量不多 结构定义 typedef struct intset { //保存元素所使用类型的长度 uint32_t encoding; //保存元素的个Redis(七):set/sadd/sismember/sinter/sdiffstore 命令源码解析
上两篇我们讲了hash和list数据类型相关的主要实现方法,同时加上前面对框架服务和string相关的功能介绍,已揭开了大部分redis的实用面纱。 现在还剩下两种数据类型: set, zset. 本篇咱们继续来看redis中的数据类型的实现: set 相关操作实现。 研究过jdk的hashmap