0 概述
Redis(http://redis.io)是一个开源的Key-Value存储引擎。它的value支持string、list、hash、set和sorted set等多种值类型,值得说明的是:对redis来说,所有的key(键)都是字符串。
1 五大数据结构
2 String
- 基本操作命令:get 、 set 、 del 、 incr、 decr 等
- 实战场景:缓存、分布式session、计数器、分布式锁
- 原理分析
简单动态字符串(simple dynamic string)是redis基本数据结构之一,其是二进制安全的。什么是二进制安全?在C语言中,用"\0"表示字符串结束,如何字符串本身就有"\0"字符,字符串就会被截断,即非二进制安全。redis 底层在设计时从存储空间考虑,sdshdr5、sdshdr8、sdshdr16、sdshdr32、sdshdr64 来分别存储不同长度的字符串,1)其中flags 低三位表示是上面的哪种类型,对于sdshdr5 这种情况,flags高5位表示长度;2)alloc 表示buf 中已经分配的字节数3)len 表示buf 中已经占用的字节数。
#define SDS_TYPE_5 0
#define SDS_TYPE_8 1
#define SDS_TYPE_16 2
#define SDS_TYPE_32 3
#define SDS_TYPE_64 4
* However is here to document the layout of type 5 SDS strings. */
struct __attribute__ ((__packed__)) sdshdr5 {
unsigned char flags; /* 3 lsb of type, and 5 msb of string length */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr8 {
uint8_t len; /* used */
uint8_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr16 {
uint16_t len; /* used */
uint16_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {
uint32_t len; /* used */
uint32_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {
uint64_t len; /* used */
uint64_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
3 list
- list 是单值多value 场景使用 基本操作命令 lpush(left)、rpush(right)、lpop、rpop、lrange、lindex等
实战场景:redis list 可以模拟堆栈等场景。比如该商品最新下单的用户信息。
4 hash
- Hash (哈希),value 变成一个键值对。常见的命令:hset、hget 、hdel、hgeall等都是以h开头的。
- 实战场景:hash 底层是hash表,hash比较适合存储后续修改的对象。日常使用大部分可能会把对象转成字符串存储到redis中。
5 set
set 和list类似也是value变成多个元素,但是和list 不同的是1) 不允许有重复的元素,2)集合中的元素是无序的,不能通过索引下标获取元素,3)支持集合间的操作,可以取多个集合取交集、并集、差集。
- 常见的操作命令:sadd、scard、smembers、sismember等
6 Zset
- zset (有序集合)在set 基础上加了一个score值用于排序。
常见的操作命令:zadd、zrange、zrangebyscore、zrem
参考文献
[1] https://www.cnblogs.com/haoprogrammer/p/11065461.html
[2]https://www.cnblogs.com/xiaohaigui/p/10976105.html