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;