Redis基本数据类型,源码解析

redis常用基本数据类型:String、Hash、List 、Set、ZSet

redis不常用数据类型:、Hyperloglog、Geo、Streams

1.String 字符类型

可以用来存储字符串、整数、浮点数
数据结构如下: dictEntry 、redisObject
typedef struct dictEntry {
void * key ; /* key 关键字定义 */
union {
void * val ;
uint64_t u64 ; /* value 定义 */
int64_t s64 ;
double d ;
} v ;
struct dictEntry * next ; /* 指向下一个键值对节点 */
} dictEntry
typedef struct redisObject {
unsigned type : 4 ; /* 对象的类型,包括: OBJ_STRING OBJ_LIST OBJ_HASH OBJ_SET OBJ_ZSET */
unsigned encoding : 4 ; /* 具体的数据结构 */
unsigned lru : LRU_BITS ; /* 24 位,对象最后一次被命令程序访问的时间,与内存回收有关 */
int refcount ; /* 引用计数。当 refcount 0 的时候,表示该对象已经不被任何对象引用,则可以进行垃圾回收了
*/
void * ptr ; /* 指向对象实际的数据结构 */
} robj ;
底层字符串存储类型是redis自定义的数据类型:
1.int 8个字节长度  2^63-1
2. embstr 存储小于44字节的字符串(SDS字符串)
3.raw存储大于44字节的字符串 (3.2版本之前是 39)
应用场景:
1)缓存:热点数据缓存(例如报表,明星出轨),对象缓存,全页缓存
2)分布式服务数据共享
3)分布式锁
4)全局ID
5) 计数器 incr 
6)限流 incr
7)位统计

2.Hash哈希类型

typedef struct dictEntry {
void * key ; /* key 关键字定义 */
union {
void * val ;
uint64_t u64 ; /* value 定义 */
int64_t s64 ;
double d ;
} v ;
struct dictEntry * next ; /* 指向下一个键值对节点 */
} dictEntry ;
typedef struct dictht {
dictEntry ** table ; /* 哈希表数组 */
unsigned long size ; /* 哈希表大小 */
unsigned long sizemask ; /* 掩码大小,用于计算索引值。总是等于 size-1 */
unsigned long used ; /* 已有节点数 */
} dictht ;
typedef struct dict {
dictType * type ; /*
字典类型
*/
void * privdata ; /*
私有数据
*/
dictht ht [ 2 ]; /* 一个字典有两个哈希表 */
long rehashidx ; /* rehash 索引 */
unsigned long iterators ; /* 当前正在使用的迭代器数量 */
} dict ;
dictEntry——>dictht——>dict

3.List类型

quicklist(快速列表)是 ziplist 和 linkedlist 的结合体

typedef struct quicklist { 

quicklistNode *head; /* 指向双向列表的表头 */ 
quicklistNode *tail; /* 指向双向列表的表尾 */ 
unsigned long count; /* 所有的 ziplist 中一共存了多少个元素 */ 
unsigned long len; /* 双向链表的长度,node 的数量 */ 
int fill : 16; /* fill factor for individual nodes */ 
unsigned int compress : 16; /* 压缩深度,0:不压缩; */ 
} quicklist;

4.Set类型(无序)

使用hashtable  使用hash类型的key

5.ZSet类型(有序)

ziplist skiplist 实现

typedef struct zskiplistNode {
sds ele ; /* zset 的元素
*/
double score ; /* 分值
*/
struct zskiplistNode * backward ; /* 后退指针 */
struct zskiplistLevel {
struct zskiplistNode * forward ; /* 前进指针,对应 level 的下一个节点 */
unsigned long span ; /* 从当前节点到下一个节点的跨度(跨越的节点数) */
} level []; /* */
} zskiplistNode ;
typedef struct zskiplist {
struct zskiplistNode * header , * tail ; /* 指向跳跃表的头结点和尾节点 */
unsigned long length ; /*
跳跃表的节点数 */
int level ; /* 最大的层数
*/
} zskiplist ;
typedef struct zset { 咕泡出品,必属精品 www.gupaoedu.com
41
dict * dict ;
zskiplist * zsl ;
} zset ;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值