redis在开发者中所呈现的数据类型有五种,每种数据类型都是一个redisObject对象

1
2
3
4
5
6
7
8
typedef struct redisObject{
//对象类型
unsigned type:4;
//编码
unsigned encoding:4;、
//指向底层数据结构的指针
void *ptr;
}

type取值:REDIS_STRING,REDIS_LIST,REDIS_HASH,REDIS_SET,REDIS_ZSET;

encoding:每个redisObject对应多个不同的编码类型

REDIS_STRING:REDIS_ENCODING_INT(int),REDIS_ENCODING_EMBSTR(embstr),REDIS_ENCODING_RAW(raw)

REDIS_LIST:REDIS_ENCODING_ZIPLIST(ziplist),REDIS_ENCODING_LINKEDLIST(linkedlist)

REDIS_HASH:REDIS_ENCODING_ZIPLIST(ziplist),REDIS_ENCODING_HT(hashtable)

REDIS_SET:REDIS_ENCODING_INTSET(intset),REDIS_ENCODING_HT(hashtable)

REDIS_HSET:REDIS_ENCODING_ZIPLIST(ziplist),REDIS_ENCODING_SKIPLIST(skiplist)

REDIS_STRING

内部编码

  int:字符串保存值为可以用long类型表示的整数值

embstr:保存值为字符串,且长度小于等于39字节(存在意义:减少内存分配和释放次数)

raw:长度大于39字节

对象转换:int -> raw embstr -> raw

应用场景

1.数据缓存:当我们一个接口QPS很高的时候,会对数据库造成一定的压力,这个时候可以考虑使用缓存中间件储存一些时效性要求不是很高的数据,来缓解数据库压力

2.计数器:REDIS_STRING的incr和decr实现了原子的i++和i–操作

3.共享session:在分布式系统中,不同服务器之间session的共享成了难题,但是redis的出现可以很好的解决这个难题

4.限制访问次数:计数器功能可以限制客户端的访问次数

REDIS_LIST

内部编码

ziplist:所有字符串元素长度小于64字节,元素数量小于512个
linkedlist:条件与ziplist相反

应用场景

1.消息队列:REDIS_LIST的lpush和brpop命令组合可以实现阻塞队列,生产者使用lpush从列表左侧插入元素,多个消费客户端使用brpop命令阻塞式的抢列表元素

2.堆栈:lpush和lpop命令组合实现栈;lpush和rpop命令组合实现队列
3.有序列表:需要有序列表的地方均可用该结构

REDIS_HASH

内部编码

ziplist:所有字符串元素长度小于64字节,元素数量小于512个

hashtable:条件与ziplist相反

注:当编码为ziplist时key和value是挤在一起的

应用场景

在实际开发过程中,一般会在存储每个门店的订单以及其商品信息的时候用到该数据结构,

REDIS_SET

内部编码

intset:保存元素均为整数值且元素数量小于512个

hashtable:条件与insset相反

应用场景

标签社交等场景

REDIS_ZSET

内部编码

ziplist:所有字符串元素长度小于64字节,元素数量小于128个

skiplist与ziplist相反

应用场景

排行榜系统