目录
从 RedisObject 说起
在 Redis 中,任意数据类型的键和值都会被封装为一个 RedisObject ,也叫做Redis对象,源码如下
/*server.h*/
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
* LFU data (least significant 8 bits frequency
* and most significant 16 bits access time). */
int refcount;
void *ptr;
} robj;
我们来看一下这个结构体中的成员变量分别代表什么:
unsigned type:4:对象类型,分别是string hash list set zset,占 4 个 bit 位,如下所示
#define OBJ_STRING 0 /* String object. */ #define OBJ_LIST 1 /* List object. */ #define OBJ_SET 2 /* Set object. */ #define OBJ_ZSET 3 /* Sorted set object. */ #define OBJ_HASH 4 /* Hash object. */
unsigned encoding:4: 底层编码方式,共有 11 种,4 个 bit 位unsigned lru:LRU_BITS:该对象最后一次被访问的时间,占 24 个 bit ,在 Redis 内存回收中起到关键作用int refcount:对象引用计数器,计数器为 0 则说明对象无人引用,可以被回收void *ptr:指针,指向存放实际数据的空间
我们注意到,在 Redis 中有 5 中数据结构(用户使用的),但在底层却有 11 种编码方式,Redis 会根据存储的数据类型、存储数据的大小,选择不同的编码方式,以获得最优的性能。一种数据结构会对应多种数据结构,如下表所示。
| 数据类型 | 编码方式 |
|---|---|
| OBJ_STRING | int、embstr、raw |
| OBJ_LIST | LinkedList和ZipList(3.2以前)、QuickList(3.2以后) |
| OBJ_SET | intset、HT |
| OBJ_ZSET | ZipList、HT、SkipList |
| OBJ_HASH | ZipList、HT |
下面,我们现在介绍以下 String 数据类型,及其底层的编码方式。
Redis 数据结构 -- String
String 类型的基本介绍和命令
String 类型,也就是字符串类型,是Redis中最简单的存储类型。它可以存储字符串、整数或浮点数。下面是一些 String 类型常用的命令
SET key value:设置指定 key 的值为指定的字符串或数字。GET key:获取指定 key 的值。
本地虚拟机redis:0>set key01 value01
"OK"
本地虚拟机redis:0>get key01
"value01"
INCR key:将指定 key 的值加 1,如果该 key 不存在,则先将其设置为 0,再进行加 1 操作。DECR key:将指定 key 的值减 1,如果该 key 不存在,则先将其设置为 0,再进行减 1 操作。INCRBY key increment:将指定 key 的值增加指定的增量。DECRBY key decrement:将指定 key 的值减少指定的减量。APPEND key value:将指定的值追加到指定 key 的值的末尾。STRLEN key:返回指定 key 的值的长度。GETRANGE key start end:返回指定 key 的值的子字符串,根据起始位置和结束位置指定。SETRANGE key offset value:将指定 key 的值从指定偏移位置开始,替换为指定的字符串。MSET key1 value1 [key2 value2 ...]:同时设置多个 key 的值。(”[ ]” 中括号内表示可选)MGET key1 [key2 ...]:获取多个 key 的值。

