浅析Redis中String数据类型及其底层编码

来自:网络
时间:2023-07-24
阅读:
免费资源网 - https://freexyz.cn/
目录

从 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_STRINGint、embstr、raw
OBJ_LISTLinkedList和ZipList(3.2以前)、QuickList(3.2以后)
OBJ_SETintset、HT
OBJ_ZSETZipList、HT、SkipList
OBJ_HASHZipList、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 的值。

免费资源网 - https://freexyz.cn/
返回顶部
顶部