Reids---基础数据结构及编码

本文深入解析Redis中的五大数据类型:String、List、Hash、Set和ZSet(有序集合)。讲解了每种类型的存储结构、应用场景及常用命令,如String的原子操作、List的队列操作、Hash的键值存储、Set的唯一成员管理以及ZSet的排序特性。通过对这些数据结构的理解,有助于更好地利用Redis进行数据存储和处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值