redis基础数据结构

ぃ、小莉子 提交于 2019-12-02 13:38:54

string

string相当于Java的String

常用命令

INCR/DECR INCRBY/DECRBY
GET/SET MGET/MSET GETSET APPEND

SET 赋值操作 O(1)

SET key value [EX seconds] [PX milliseconds] [NX|XX]

  • EX 过期参数单位为秒
  • PX 过期参数单位为毫秒
  • NX key不存在时赋值
  • XX key存在时赋值
对已存在的key执行SET会使原key的ttl失效

使用场景

简单缓存 计数器 分布式锁

内部结构

redis的字符串实现称为SDS(Simple Dynamic String,简单动态字符串)

相比于C字符串的优点:SDS获取字符串长度的时间复杂度为O(1);字符串不会溢出;减少修改字符串长度时的内存分配次数;二进制安全(可以保存各种格式的编码);兼容sting.h …

// SDS实现 --sds.h
struct __attribute__ ((__packed__)) sdshdr8 {
    uint8_t len;            /* buf[]已使用的长度,也就是字符串长度 */
    uint8_t alloc;          /* buf[]的大小 */
    unsigned char flags;    /* 标志位,定义sdshdr类型 */
    char buf[];             /* 存储字符串的数组 */
};

list

list相当于Java的LinkedList,一般当做队列(右进左出)或栈(右进右出)使用

常用命令

LPUSH/RPUSH LPOP/RPOP/BLPOP/BRPOP RPOPLPUSH/BRPOPLPUSH LRANGE LREM LLEN

LPUSH 将一个或多个元素element放至列表key的头部 O(1) 阻塞版BLPUSH

LPUSH key element [element ...]

RPOP 将列表key的尾部元素取出并返回 O(1) 阻塞版BRPOP

RPOP key

RPOPLPUSH 将列表source的尾元素放至列表destination的头部,并返回该列表 O(1)

RPOPLPUSH source destination

LRANGE 返回列表key中[start,stop]区间内的元素 O(s+n) s为start,n为区间内元素数量

LRANGE key start stop

start/stop值得说明:0表示第一个元素 1表示第二个元素 -1表示最后一个元素 -2表示最后第二个元素。故获取list所有元素就是LRANGE key 0 -1。start/stop超出list范围不会引起错误

使用场景

消息队列 监视器

内部结构

redis的list实现称为quicklist(快速列表)

ziplist没有被定义为struct,而是char[],内存利用率高

// ziplist定义 --ziplist.c
/*
 * <zlbytes-ziplist占用字节数> <zltail-尾元素的位置> <zllen-元素个数> <entry-元素> <entry-元素> ... <entry-元素> <zlend-结束标志>
 */

quickList也可以看作是ziplist的链表

// quicklist定义 --quicklist.h
typedef struct quicklist {
    quicklistNode *head;        /* 头节点指针 */
    quicklistNode *tail;        /* 尾节点指针 */
    unsigned long count;        /* 元素总数(所有ziplist中的所有元素) */
    unsigned long len;          /* quicklist节点数 */
    int fill : 16;              /* 节点填充因子 */
    unsigned int compress : 16; /* LZF算法的压缩深度; 0=off */
} quicklist;
// quicklist节点定义 --quicklist.h
typedef struct quicklistNode {
    struct quicklistNode *prev;     /* 前驱节点指针 */
    struct quicklistNode *next;     /* 后驱节点指针 */
    unsigned char *zl;              /* ziplist */
    unsigned int sz;                /* ziplist的bytes大小*/
    unsigned int count : 16;        /* ziplist中的元素数量 */
    unsigned int encoding : 2;      /* 是否进行LZF压缩 RAW==1 or LZF==2 */
    unsigned int container : 2;     /* 是否包含ziplist NONE==1 or ZIPLIST==2 */
    unsigned int recompress : 1;    /* 是否曾被压缩 */
    unsigned int attempted_compress : 1; /* 测试使用字段 */
    unsigned int extra : 10;        /* 预留内存空间 */
} quicklistNode;
// 经过LZF压缩的quicklist节点定义 --quicklist.h
typedef struct quicklistLZF {
    unsigned int sz;        /* 压缩后的char[]大小 */
    char compressed[];      /* 存储压缩后内容的数组 */
} quicklistLZF;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!