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
;