前言
Redis 是Remote Dictionary Service的简称;也是远程字典服务 Redis 是内存数据库,KV数据库,数据结构数据库一、Value的编码
Redis查找方式: key经过几次hash后得到数组中的位置,从而找到value,value中有不同的编码格式,下面将逐一介绍:string
-
说明:字符数组,动态,加倍扩容(超过1M只扩1M),最大长度512M,二进制安全字符串
-
存储结构:
- 字符串小于等于20且能转成整数,则使用int存储
- 字符串长度小于等于44,则使用embstr存储
- 字符串长度大于44,则使用raw存储
-
应用:对象存储 累加器 分布式锁 位运算
-
基础命令:
#设置key的value值
SET key val
#获取key的value值
GET key
#执行原子加一操作
INCR key
#执行原子加一个整数的操作
INCRBY key increment
#执行原子减一的操作
DECR key
#执行原子建一个整数的操作
DECRBY key decrement
#如果key不存在,这种情况下等同SET命令.当key存在时,什么也不做
SETNX key value
#删除key val键值对
DEL key
#设置或者清空key的value(字符串)在offset处的bit值
SETBIT key offset value
#返回key对应的string在offset处的bit值
GETBIT key offset
#统计字符串被设置为1的bit数
BITCOUNT key
list
- 说明:双向链表,队列首尾操作时间复杂度O(1);查找中间元素时间复杂度为O(n);
- 应用:栈 队列 阻塞队列 异步消息队列 获得固定窗口记录
- list元素是否压缩依据:(压缩为ziplist)
- 元素长度小于48,不压缩
- 元素压缩前后长度不超过8,不压缩
- 存储结构:如下代码
typedef struct quicklistNode{
struct quicklistNode *prev;
struct quicklistNode *next;
unsigned char *zl;//
unsigned int sz; // ziplist size in bytes
unsigned int count:16; // count if item in ziplist
unsigned int encoding:2; // RAW==1 or LZF==2
unsigned int container:2; // NONE==1 or ZIPLIST==2
unsigned int recompress:1;// was this node previous compressed
unsigned int attempted_compress:1;// node can't compressl too small
unsigned int extra:10;// for future usage
}quicklistNode;
typedef struct quicklist{
quicklist *head;
quicklist *tail;
unsigned long count;
unsigned long len;
int fill:QL_FILL_BITS;
unsigned int compress:QL_COMP_BITS;
unsigned int bookmark_count:QL_BM_BITS;
quicklistBookmark bookmarks[];
}quicklist;
- 基础命令:
#从队列的左侧入队一个或者多个元素
LPUSH key value [value ...]
#从队列的左侧弹出一个元素
LPOP key
#从队列的右侧入队一个或者多个元素
RPUSH key value [value ...]
#从队列的右侧弹出一个元素
RPOP key
#返回从队列的start和end之间的元素
LRANGE key 0 -1
#从存于key的列表里移除前count次出现的值为value的元素
LREM key count value
#它是RPOP的阻塞版本,因为这个命令会在给定list无法弹出任何元素的时候阻塞连接
BRPOP key timeout
hash
- 说明:散列表 通过key快速查找value
- 应用:存储对象 购物车
- 存储结构:
- 节点数量小于等于512且有一个字符串长度小于64,则使用ziplist实现
- 节点数量大于512或者所有字符串长度大于64,则使用dict实现
- 基础命令:
#获取key对应hash中的field对应的值
HGET key field
#设置key对应hash中的field对应的值
HSET key field value
#设置多个hash键值对
HMSET key field1 value1 field2 value1 ... fieldn valuen
#获取多个field的值
HMGET key field1 field2 ... fieldn
#给key对应hash中的field的对应值加一个整数值
HINCRBY key field increment
#获取key对应的hash有多少个键值对
HLEN key
#删除key对应的hash的键值对,该键为field
HDEL key field
set
- 说明:集合 用来存储唯一性字段,不要求有序
- 应用:抽奖 共同关注 推荐好友
- 存储结构:
- 元素都为整数且节点数量小于等于512,则使用整数数组存储(intset)
- 元素当中有一个不是整数或者节点数量大于512,则使用字典存储(dict)
- 基础命令:
#添加一个或多个指定的member元素到集合key中
SADD key member [member ...]
#计算集合元素个数
SCARED key
#SMEMBERS key
SMEMBERS key
#返回成员member是否是存储的集合key的成员
SISMEMBERS key member
# 随机返回key的集合中移除并返回一个或多个随机元素
SRANDMEMBER key [count]
# 从存储在key的集合中移除并返回一个或多个随机元素
SPOP key [count]
#返回一个集合与给定集合的差集的元素
SDIFF key [key ...]
#返回指定所有的集合的成员的交集
SINTER key [key ...]
#返回给定的多个集合的并集中的所有成员
SUNION key [key ...]
zset
- 说明:有序集合
- 应用:排行榜 热搜 延时队列 分布式定时器 时间窗口限流
- 存储结构:
- 节点数量小于等于128且所有字符串长度小于等于64,则使用ziplist存储
- 节点数量大于128或者有一个字符串长度大于64,则使用跳表
- 基础命令:
#添加到键为key有序集合(sorted set)里面
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
#从键为key有序集合中删除member的键值对
ZREM key member [member]
#返回有序集key中,成员member的score值
ZSCORE key member
#为有序集key的成员member的socre值加上增量increment
ZINCRBY key increment member
#返回key的有序集元素个数
ZCARD key
#返回有序集key中成员member的排名
ZRANK key member
#返回存储在有序集合key中的指定范围的元素
ZRANGE key 0 -1 [WITHSCORES]
#返回有序集key中,指定区间内的成员(逆序)
ZREVRANGE key 0 -1 [WITHSCORES]