共计 5185 个字符,预计需要花费 13 分钟才能阅读完成。
自动写代码机器人,免费开通
这篇文章主要介绍 redis 中的常用基础对象有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
一:前言
redis 中有几种常用的基础对象,如 string、hash、list、set、zset 等,下面我们就来介绍下他们的底层实现数据结构与常见应用场景和特点。
二:redisobject
源码位置位于 server.h 文件中 605 行开始
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS;
int refcount;
void *ptr;
} robj;
2.1 type
redis 中实际的对象类型, 分为 5 种 0 - 4 声明。位于文件 server.h 中 466 行
#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. */
2.2 encoding
redis 五种对象 string、list、hash、set、zset 会用到的八种编码格式, 每一种编码都对应一个数据结构
#define OBJ_ENCODING_RAW 0
#define OBJ_ENCODING_INT 1
#define OBJ_ENCODING_HT 2
#define OBJ_ENCODING_ZIPLIST 5
#define OBJ_ENCODING_INTSET 6
#define OBJ_ENCODING_SKIPLIST 7
#define OBJ_ENCODING_EMBSTR 8
#define OBJ_ENCODING_QUICKLIST 9
2.3 refcount
redis 中内存的回收采用了比较简单的引用计数法进行, 每个对象引用就 refcount + 1, 当这个引用计数减少为 0 时内存就会被回收
三:string
3.1 常用场景
分布式锁:分布式锁的实现基础就是采用 string 的命令 setnx 用户信息:很多时候用户信息都会序列化后存到 redis 中缓存, 但是这里可以考虑下 hash。如果仅仅使用用户数据部分信息, 毕竟序列化与反序列化也是一笔开销
3.2 编码格式
int:当字符串中全是数字时会采用 int 编码, 这是真正的二进制数据存储 embstr:内存地址连续, 内存一次申请。字符串长度小于 44raw:底层采用 sds 实现, 相对于 embstr 差别在于 sds 的创建与 redisobject 的创建分两次实现
3.3 常用命令
# 存储
set key value
# 互斥存储
# 已存在的 key 再次存入数据不会更改缓存
setnx key value
# 过期存储, 单位秒
# 设定 key 过期时间, 到期自动删除
setex key seconds value
# 过期存储, 单位毫秒
psetex key milliseconds value
# 批量存储
mset key value [key value ...]
# 取值
get key
# 批量取值
mget key [key ...]
# 追加
append key value
# 长度
strlen key
# 自增, 只能是 int 编码的字符串
incr key
# 自定义步长自增
incrby key increment
# 自减, 只能是 int 编码的字符串
# 这个可以减到负数, 秒杀扣减库存啥的想想能不能用这个命令
decr key
# 自定义步长自减
decrby key increment
四:list
4.1 常用场景
消息队列:一般不怎么用, 毕竟各种 MQ、Kafka 都已经很成熟了。而且 redis 实现消息队列并不保证数据的安全排行榜计算:这种仅仅适用于定时计算更新, 不能用于实时更新排行。比如美团每天计算区域入驻商家排行点赞列表:比如微信中的点赞(不知道咋做的, 猜一下)
4.2 编码格式
quicklist:快速列表, 之前版本有使用 linkedlist 和 ziplist。目前使用的 quicklist 为两者结合体, 详情可以查看 Redis(一) — 浅谈 Redis 中的数据结构
4.3 相关参数配置
配置参数位置位于 redis.con 文件中 1083 行和 1099 行
list-max-ziplist-size:配置单个 ziplist 大小 list-compress-depth:配置 LZF 压缩算法开始节点
4.4 常用命令
# 创建 list 并压入节点
# 压入节点位于链表头
lpush key value
# 压入节点位于链表尾
rpush key value
# 弹出 list 头节点
lpop key
# 弹出 list 尾节点
rpop key
# 删除节点
# count 0 从左开始搜索删除 count 数量的 value
# count 0 从右开始搜索删除 |count| 数量的 value
# count = 0 删除 list 中所有 value
lrem key count value
# 范围保留
# -1 表示列表最后一个元素
# -2 表示倒数第二个, 以此类推
ltrim key start stop
# 计算长度
llen key
# 索引查询节点
# index 0 从右开始搜索
# index 0 从左开始搜索
lindex key index
# 范围查询
# stop = -1 表示所有
lrange key start stop
# 阻塞弹出
# 队列中没有节点时会一直等待
# 多个 key 时表示挨着顺序依次检查, 知道找到非空列表为止
# timeout 可以设置等待时间,0 表示一直等待
blpop key [key...] timeout
brpop key [key...] timeout
五:Hash
5.1 常用场景
商品对象、用户对象。这个场景需要验证性对待, 如果商品对象、用户对象信息每次都需要全量的话不妨存 string, 但是仅仅部分使用就可以考虑使用 hash 结构 SKU 等信息, 这个场景下 hash 就比较合适了。一个 hash 结构中存储某个商品所有 sku
5.2 编码格式
ziplist:使用 ziplist 存储 hash 结构时一个数据会使用相邻两个 ziplistEntry 存储 field 和 valuehashtable:当数据存储超过参数限制后就会将其底层结构由 ziplist 转换为 dict 进行存储
5.3 相关参数配置
hash-max-ziplist-entries:默认 512, 即 ziplist 节点为 1024。当节点数量超过该值限制后底层数据结构转为 dicthash-max-ziplist-value:默认 64, 当 hash 中插入任意一个长度超过该限制的 value 后底层数据结构转换为 dict
5.4 常用命令
# 存储
hset key field value
# 不允许更改存储
# 若 field 值存在则本次存储不会覆盖原有 value 值
hsetnx key field value
# 批量存储
hmset key field value [field value ...]
# 查询
hget key field
# 批量查询
hmget key field [field ...]
# 全量查询
hgetall key
# 全量查询 field 值
hkeys key
# 全量查询 value 值
hvals key
# 删除 field
hdel key field [field ...]
# 计算键值对数量
hlen key
# field 存在判断
hexists key field
# 增量式迭代
# cursor 表示迭代开始的游标
# count 表示迭代返回数据数量
# pattern 表示正则匹配结果限制
hscan key cursor [Count count] [Match pattern]
六:Set
6.1 常用场景
推荐:通过 sinter 命令计算交集, 比如美团给你推荐附近外卖时就可以根据你的外卖记录与附近商家计算交集推送安全提示:微信群成员保存在一个 set 中, 用户好友也保存在 set 中。当用户加入群聊时可以提醒非好友用户注意安全
6.2 编码格式
intset:整数集合, 用于存储 set 集合中所有 value 都是整数的数据 hashtable:field 用于存储 set 集合值
6.3 相关参数配置
set-max-inset-entries:默认 512, 表示当元素数量超过限定以后转换为 hashtable 编码
6.4 常用命令
# 存储
sadd member [member ...]
# 弹出元素并返回
spop key count
# 查询所有元素
smembers key [count]
# 计算元素数量
scard key
# 删除指定元素
srem key member [member ...]
# 判断元素存在
sismember key member
# 计算给定集合与后续集合差集
# 返回计算结果
sdiff key [key ...]
# 计算给定集合与后续集合差集
# 存储结果到 destination 并返回
sdiffstore destination key [key ...]
# 计算给定集合与后续集合交集
# 返回计算结果
sinter key [key ...]
# 计算给定集合与后续集合差集
# 存储结果到 destination 并返回
sinterstore destination key [key ...]
# 计算给定集合与后续集合差集
# 返回计算结果
sunion key [key ...]
# 计算给定集合与后续集合差集
# 存储结果到 destination 并返回
sunionstore destination key [key ...]
七:Zset
7.1 常用场景
排行榜:美团要做一个销量排行榜, 就可以使用店家的订单做 score, 这个查询出来的结果就是有序的权重队列:score 作为优先级, 这样取出来的数据权重都是最大优先执行的延时任务:score 作为任务启动执行时间, 取值时判断该值执行即可
7.2 编码格式
ziplist:与 hash 有异曲同工之妙, 都是使用相邻两个节点存储 score 和 memberskiplist:跳跃表结构, 可以查看 Redis(一) — 浅谈 Redis 中的数据结构
7.3 相关参数配置
zset-max-ziplist-entries:默认值 128, 指定 ziplist 存储元素最多 128 个。超过转换为 skiplistzset-max-ziplist-value:默认值 64, 存储数据值最大 64 字节, 超过转换为 skiplist
7.4 常用命令
# 存储
# xx 表示当 zset 中存在本次插入的 member 时才存储
# nx 表示当 zset 中不存在本次插入的 member 时才存储
zadd key [nx|xx] score member [score member ...]
# 查询排序指定 [start,stop] 范围内元素
# withscores 查询结果顺带返回元素分数
zrange key start stop [withscores]
# 查询指定元素分数
zscore key member
# 元素数量统计
zcard key
# 返回 score 位于 [min,max] 区间的元素数量
zcount key min max
# 对指定元素分数增加 incrment 值
zincrby key incrment member
# 返回指定分数区间范围内元素
# withscores 返回时携带分数一起返回
# limit offset count 表示跳过 offset 数量结果再返回 count 数量结果
zrangebyscore key min max [withscores] [limit offset count]
# 倒序返回指定分数区间范围内元素
# withscores 返回时携带分数一起返回
# limit offset count 表示跳过 offset 数量结果再返回 count 数量结果
zrevrangebyscore key max min [withrescores] [limit offset count]
# 删除指定分数范围 [min,max] 内元素
zremrangebyscore key min max
# 移除指定元素
zrem key member
以上是“redis 中的常用基础对象有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!
向 AI 问一下细节