目录
从 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 的值。