Redis有
内存数据库的赞誉,其支持一下几种数据结构:
1.
String
2.
Hashes
3.
List
4.
Set
本文从源代码角度来分析各种数据结构在
Redis
内部是如何存储和读取的。
在介绍各种数据结构之前,首先来介绍下
redisObject
这个
Struct
,
String
,
Hash
,
List
和
Set
在
Redis
内部都是以
redisObject
来存储的
/* A redis object, that is a type able to hold a string / list / set */
/* The actual Redis Object */
#define REDIS_LRU_CLOCK_MAX ((1<<21)-1) /* Max value of obj->lru */
#define REDIS_LRU_CLOCK_RESOLUTION 10 /* LRU clock resolution in seconds */
typedef struct redisObject {
unsigned type:4;
unsigned storage:2; /* REDIS_VM_MEMORY or REDIS_VM_SWAPPING */
unsigned encoding:4;
unsigned lru:22; /* lru time (relative to server.lruclock) */
int refcount;
void *ptr;
/* VM fields are only allocated if VM is active, otherwise the
* object allocation function will just allocate
* sizeof(redisObjct) minus sizeof(redisObjectVM), so using
* Redis without VM active will not have any overhead. */
} robj;
type:String, Hash,List,Set,Sorted set;
storage:
这个参数只是在VM
开启后才能用到,当VM
有很大的性能问题,基本不建议开启;
encoding:
编码方式: raw/int/ht/zmap/linkedlist/ziplist/intset
;
lru
:LRU
期限,Redis
默认的LRU
时间是1.5
年,所有基本不需要考虑key
被LRU
掉的问题
refcount:
被引用的次数,因为Redis
有shareObject
的概念,目前只支持共享StringObject
。Redis
的共享对象有两大类比:第一类:Redis server
的各种操作需要经常用到的各类对象,如:Redis Command
的分隔符 "\r\n",
用于Redis command
的reply
的"+OK\r\n"
或者"-ERR\r\n"
等对象,因为在Redis
的各种操作这类对象要被频繁使用,所以就在启动 Redis
的时候创建好,然后共用这些对象,减少时间成本和空间成本;第二,类的共享对象就是对应于数字的StringObject
,如:Set "olylakers1" 1234;
Set "olylakes2" 1234;
在Redis
内部,"olylakers1"
和"olylakers2"
这两个key
都指向由数字1234
转化的StringObject
。这
样在海量数据和特定存储内容下,可以节省大量的内存空间。可用通过REDIS_SHARED_INTEGERS
这个参数来指定Redis
启动的时候创建多 少个第二类共享对象,默认的参数是10000
,即创建的StrongObject
个取值范围是0-9999
之间。
Ptr
:对象数据;
redisObjects
都是存放在redisDb
里面的,Redis
默认的是创建16
个db
:
typedef struct redisDb {
dict *dict; /* The keyspace for this DB */
dict *expires; /* Timeout of keys with a timeout set */
dict *blocking_keys; /* Keys with clients waiting for data (BLPOP) */
dict *io_keys; /* Keys with clients waiting for VM I/O */
dict *watched_keys; /* WATCHED keys for MULTI/EXEC CAS */
int id;
} redisDb;
redisDb
维护了各种dict
,所以说redis
内部基本的数据存储结构就是一个dict
,dict
就是一个字典的数据结构,比较特殊的就是每个dict
含有两个table
,即两个dictht
,这是为了实现增量rehashe
准备的,当redis
的dict
在进行rehashe
的时候,新的数据插将被添加到dictht ht[1]
当中,反之则添加到ht[0]
中
typedef struct dict {
dictType *type;
void *privdata;
dictht ht[2];
int rehashidx; /* rehashing not in progress if rehashidx == -1 */
int iterators; /* number of iterators currently running */
} dict;
typedef struct dictht {
dictEntry **table;
unsigned long size;
unsigned long sizemask;
unsigned long used;
} dictht;
Redis
在响应各种命令的时候,把接收到的命令参数(key
和value
等)都转化成type=
REDIS_STRING
的redisObject
,最终执行命令将key
和value
存储到redisDb
的dict
的时候,存储的形式和内容是不相同的:在dict
里面,key
存储的是redisObject
里面的prt
所指向的数据,而value
存储的则是和命令对应的redisObject
,如执行list
的命令lpush listname content
,redisDb
里面,存放的一条记录key
为内容listname
的字符串,而value
(此value
不是命令对应的value
)存储的则是一个redisObject
(type= REDIS_ENCODING_ZIPLIST
, prt=ziplist
),然后把content
对应的内容add
到ziplist
上。
最后通过一张图来展示Redis内部DB的实现和其支持的各种data types在redis DB内的存储方式
Redis DB & data types
- 大小: 172 KB
分享到:
相关推荐
针对Redis的高级数据结构PPT。该PPT一共14页,介绍了Zset的数据结构类型,以及跳表的数据结构。简单阐述了BitMap,HLL,Bloom Filter的原理以及一些常用的指令。针对Bloom Filter有一些自己的见解以及分析
在【大学生 C/C++/JAVA/Python数据结构学习笔记和资料大全】中,你可以找到更多关于数据结构和算法的知识,这些是理解和使用Redis数据结构的基础。通过深入学习和实践,你不仅可以掌握Redis的使用,还能提升自己的...
详细分析redis设计及实现原理 详细分析redis设计及实现原理
总结,Redis流量分析涉及到多个层面,包括数据结构的选择、操作频率的监控、内存管理、持久化策略、网络优化以及使用适当的监控工具。通过对这些方面的深入了解和细致调整,可以有效控制和优化Redis的流量,确保系统...
2. **数据类型丰富**:除了基本的键值对存储,Redis还支持更复杂的数据结构,如列表、集合、有序集合和哈希表,这些数据结构可以满足多种业务需求。 3. **持久化机制**:虽然Redis的主要工作方式是在内存中存储数据...
通过以上分析,我们可以了解到 Redis 的底层数据模型和数据结构是如何设计的,包括 `redisObject` 和 `redisDb` 的细节。这些结构的设计考虑到了内存高效利用、数据访问性能优化以及复杂命令的实现等方面的需求。...
使用场景及目标:本资源适用于想要理解Redis数据结构优化手段及其高级特性的技术人员。有助于更好地进行故障排除和优化Redis应用程序。 使用说明:阅读此内容是为了获得对Redis设计及其实现的理解,从而提高解决实际...
链表是Redis中最基本的数据结构,由adlist.h和adlist.c定义。基本数据结构listNode是最基本的结构,标示链表中的一个结点。结点有向前(next)和向后(prev)两个指针,链表是双向链表。保存的值是void*类型。 链表通过...
通过cpp-RCT,你可以得到关于Redis数据的详细信息,包括键的类型、过期时间、占用的内存大小等,这对于优化Redis的性能和内存管理至关重要。 在cpp-RCT中,有以下几个核心功能: 1. **RDB文件解析**:cpp-RCT能够...
### Redis内存存储结构分析 #### 一、Redis内存存储总体结构概述 Redis是一种高性能的键值存储系统,它将所有数据存储在内存中,从而实现了非常快的数据读写速度。然而,这种设计也有其局限性,例如对于拥有大量...
3. **内存分析**:了解 Redis 数据结构(如 String、Hash、List、Set 和 Sorted Set)的内存占用情况,以及如何通过 Redis 命令获取相关统计信息。 4. **数据收集和排序**:收集每个 Key 的内存占用数据,根据大小...
在面试中,Redis的数据结构是考察候选人技术深度的重要部分。以下将详细介绍Redis中的主要数据结构及其应用。 1. 字符串(String) Redis中的字符串是最基本的数据类型,可以存储任何可打印的字符序列,包括整数和...
墨墨导读:本文节选自《Redis 5设计与源码分析》,主要为读者分析Redis高性能内幕,重点从源码层次讲解了Redis事件模型,网络IO事件重在使用IO复用模型,时间事件重在...系统讲解Redis 5设计、数据结构、底层命令实现,
Redis支持多种数据结构,如字符串(String)、哈希表(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这些数据结构在源码中由不同的C结构体实现,例如`sds`用于表示字符串,`dict`表示哈希表,`list`...
Redis数据结构、原理分析、应用实战 什么是Redis Redis的作用 Redis的存储结构 Redis的安装 Redis的数据类型 字符串类型 列表类型 hash类型 集合类型 有序集合 Redis原理分析 过期时间设置 过期删除的原理 发布订阅 ...
以上是Redis源代码分析中关于基本数据结构的部分总结,通过这些数据结构的支持,Redis能够提供强大的功能和优异的性能。后续章节将进一步探讨Redis的服务器模型、虚拟内存、备份机制等高级特性。
Redis中的跳跃列表(skiplist)是一种高效的数据结构,用于实现有序集合(sorted set)。它是一种概率性数据结构,通过随机概率控制层数,从而在平均情况下提供接近于对数时间复杂度的查找、插入和删除操作。skiplist...