百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis常用数据结构和使用场景(redis的数据结构有哪些)

mhr18 2024-10-30 02:39 19 浏览 0 评论

Redis默认为16个库,在配置文件中可以修改,从0开始,每个库互相隔离,库中存储的是key,vaule键值对。value分为五种数据结构,分别是string、hash、list、set、sortedSet。

String

String结构又存在3种类型,分别是字符串、数值、bitmap。

  • 字符串

set k1 hello nx 只能新增,只有当k1不存在时才能设置成功。

set k1 hello xx 只能修改,只有当k1存在时才能设置成功。

getset 指令相比于先`get`再`set`而言,少了一次IO。

使用场景:分布式锁

  • 数值

set k1 999 type为string,而encoding为int,这样做`incr`操作的时候不需要判断类型,直接计算即可。

redis是二进制安全的,从socket中读取的是字节流,并不对字节流中的数据进行编码,保证了数据不会被破坏。比如说,如果编码后存储,两个客户端的编码解码不一致,A存储一个字符为两个字节,而B解析出来是四个字节,可能会造成溢出。

使用场景:在一些系统中看似不是很重要的统计,抢购,秒杀,详情页中数据统计,点赞,评论等。可以规避并发情况下对数据库的事务操作,完全由redis内存操作代替。

  • bitmap

setbit k1 1 1 将k1对应的bit位设置为1

使用场景:用户签到、在线用户统计、统计活跃用户。比如统计活跃用户:一个用户系统,要求统计用户登录天数,且窗口随机(某天到某天的数)。常规mysql:存储在表中,每个用户每天登录即为一行数据,每行数据至少需要id,日期等,在8个字节左右,当用户量特别大的时候,查询效率会很慢。会有磁盘IO,读取出来的数据进行解码,再做计算。利用redis的bitmap:一年固定有365天或366天,这样可以用366个二进制位,即最多50个字节就可以记录每个用户一年的登录情况。某天登录把对应的二进制位改为1即可,当查询时,使用bitcount计算即可。即节省了空间,又提高了效率。假如说有1000W用户,500M空间存储足以。

String常用命令

  • SET key value [EX seconds] [PX milliseconds] [NX|XX]: 将 key 和 value 关联
  • GET key: 获取key 关联的 value
  • GETSET key value: 将 key 和 value 关联,如果 key 已经存在返回旧值
  • STRLEN key: 获取 key 关联的 value 长度
  • APPEND key value: 将 value 追加到 key 已经关联的 value 末尾
  • SETRANGE key offset value: 从 offset 开始,用 value 覆 盖 key 已经关联的 value
  • GETRANGE key start end: 获取 key 关联的 value 从 start 到 end 的字符串INCR key: 将 key 已经存储的数字值加一
  • INCRBY key increment: 为 key 存储的数字值加上 increment 增量
  • INCRBYFLOAT key increment: 为 key 存储的数字值加上 increment 浮点数增量
  • DECR key: 将 key 已经存储的数字值减一
  • DECRBY key decrement: 为 key 存储的数字值减去 decrement 减量
  • MSET key value [key value ...]: 同时设置多个 key-value,该操 作为原子操作
  • MSETNX key value [key value ...]: 当所有 key 都不存在时设置 多个 key-value,该操作为原子操作
  • MGET key [key ...]: 获取多个 key 的 value 值

位图常用命令:

  • SETBIT key offset value: 对字符串 key 在 offset 位置处设置位
  • GETBIT key offset: 获取字符串 key 在 offset 的位置
  • BITCOUNT key [start] [end]: 获取区间内位值设为1的数量
  • BITPOS key bit [start] [end]: 获取区间内第一个位置设为 bit 的位 置
  • BITOP operation destkey key [key...]: 对一个或者多个 key 进行 位元操作(AND/OR/XOR/NOT)并将结果保存到 destkey
  • BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WARP|SAT|FAIL]: 对 key 进 行相关的位域操作

List

同向命令 lpush+lpop 或者 rpush+rpop

反向命令 push+rpop 或者 rpush+lpop

lindex 、lset 对索引进行操作

blpop、brpop 如果有十个客户端阻塞着,当有数据之后,先服务先到的,剩下的继续阻塞。

使用场景:

  • 队列,比如:关注队列、粉丝队列
  • 消息队列

常用命令

  • LPUSH key value [value...]: 将多个 value 依次插入 list 的表头
  • LPUSHX key value: 将 value 插入已经存在的 list 的表头
  • RPUSH key value [value...]: 将多个 value 依次插入 list 的表尾
  • RPUSHX key value: 将 value 插入已经存在的 list 的表尾
  • LPOP key: 移除并返回 list 的表头元素 RPOP key: 移除并返回 list 的表尾元素
  • BLPOP key [key...] timeout: 弹出第一个非空 list 的头元素,否则 阻塞等待 timeout 秒
  • BRPOP key [key...] timeout: 弹出第一个非空 list 的尾元素,否则 阻塞等待 timeout 秒
  • RPOPLPUSH source destination: 将 source 的尾元素弹出并插入 到 destination 的头部,同时返回该元素
  • BRPOPLPUSH source destination timeout: 将 source 的尾元素 弹出并插入到 destination 的头部,同时返回该元素;若 source 为空,则阻塞等待 timeout 秒
  • LREM key count value: 根据 count 值,移除 list 中值为 value 的 元素
  • LLEN key: 返回 list 长度
  • LINDEX key index: 返回 list 下标为 index 的元素
  • LINSERT key BEFORE|AFTER pivot value: 在值为 pivot 元素的之 前/之后插入 value
  • LSET key index value: 设置 list 下标为 index 的元素值为 value
  • LRANGE key start stop: 返回 list 指定区间内的元素
  • LTRIM key start stop: 删除 list 指定区间外的元素

Hash

相当于Java中的HashMap。可以对field进行数值计算,与文档型存储的区别是,value是个hash类型,但hash中的value不能再嵌套,只能是单一类型。

使用场景:点赞、收藏、详情页等

常用命令:

  • HSET hash field value: 将 hash 的 field 字段值设置为 value
  • HSETNX hash field value: 如果 field 字段不存在则设置为 value
  • HMSET key field value [field value ...]: 给 hash 设置多个 field- value 对
  • HDEL key field [field ...]: 删除 hash 的多个 field
  • HGET hash field: 获取 hash 的 field 字段值
  • HMGET hash field [field ...]: 获取 hash 多个 field 值
  • HEXISTS hash field: 判断 hash 是否存在 field 域 HKEYS key : 获取 hash 所有的 field 域
  • HVALS key : 获取 hash 所有 value 值
  • HGETALL key : 获取 hash 所有的域值对
  • HLEN key: 获取 hash 的 field 数量
  • HSTRLEN hash field: 获取 hash 的 field 的 value 长度
  • HINCRBY key field increment: 将 hash 的 field 的值加上增量 increment
  • HINCRBYFLOAT key field increment: 将 hash 的 field 的值加上 浮点数增量 increment

Set

  • 无序去重
  • 集合操作:交集、并集等,并提供存储到目标`key`的方法。
  • 随机事件

使用场景

  • 关注集合:共同关注、二度好友
  • 点赞集合
  • 抽奖集合
  • 用户标签

常用命令

  • SADD key member [member...]: 将多个元素放入 set 中
  • SISMEMBER key member: 判断 member 是否在 set 中
  • SPOP key: 移除并返回 set 中随机一个元素 SRANDMEMBER key [count]: 返回 set 中随机数组
  • SMEMBERS key: 返回 set 所有元素
  • SREM key member [member...]: 移除 set 中多个元素
  • SMOVE source destination member: 将 member 从 source 移动到 destination
  • SCARD key: 返回 set 的元素数量(集合的基数)
  • SINTER key [key...]: 返回多个 set 的交集
  • SINTERSTORE destination key [key...]: 将多个 set 的交集覆盖destination
  • SUNION key [key...]: 返回多个 set 的并集
  • SUNIONSTORE destination key [key...]: 将多个 set 的并集覆盖 destination
  • SDIFF key [key...]: 返回多个 set 的差集
  • SDIFFSTORE destination key [key...]: 将多个 set 的差集覆盖 destination

Sorted Set

维护顺序,按score值从小到大,且不随命令而改变。用于排序的值叫做score,实际存储的值叫做member。ZINCRBY 可以对数值进行计算,且改变score后自动维护顺序。使用ZREVRANGE倒序获取

集合操作:交集、并集。带权重/聚合指令

排序实现:ziplist 压缩链表 + skip list 跳跃表


使用场景

  • 排行榜
  • 时间轴
  • 优先级队列

常用命令:

  • ZADD key score member [[score member]...]: 将多个 member 元素 和 score 值设置到 sorted set 中
  • ZSCORE key member: 返回 member 元素的 score 值 ZINCRBY key increment member: 将 member 元素的 score 值加上 increment 增量
  • ZCARD key: 返回元素数目(集合基数)
  • ZCOUNT key min max: 返回 score 值在区间内的元素数目
  • ZRANGE key start stop [WITHSCORES]: 返回排名在区间内的元 素(以及 score 值),并按 score 值从小到大排列,相同 score 值按字典序排列
  • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]: (指定起始位置和数量)返回 score 值在区间内的元素 (以及 score 值),并按 score 值从小到大排列,相同 score 值 按字典序排列
  • ZRANGEBYLEX key min max [LIMIT offset count]: (指定起始位 值和数量)返回按字典序在区间内的元素,要求所有元素必须有 相同 score 值
  • ZREVRANGE key start stop [WITHSCORES]: 返回排名在区间内 的元素(以及 score 值),按 score 值从大到小排列,相同 score 值按字典序逆序排列
  • ZREVRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]: (指定起始位置和数量)返回 score 值在区间内的 元素(以及 score 值),并按 score 值从大到小排列,相同 score 值按字典序逆序排列;
  • ZRANK key member: 返回 member 元素的排名(按 score 值从 小到大排)
  • ZREVRANK key member: 返回 member 元素的排名(按 score 值从大到小排)
  • ZREM key member [member...]: 移除 sorted set 的多个元素
  • ZREMRANGEBYRANK key start stop: 移除排名在区间内的所有 元素
  • ZREMRANGEBYSCORE key min max: 移除 score 值在区间内的 所有元素
  • ZREMRANGEBYLEX key min max: 移除按字典序在区间内的所有 元素,要求所有元素有相同 score 值
  • ZLEXCOUNT key start stop: 计算字典序在区间内的元素数量,要 求所有元素有相同 score 值
  • ZINTERSTORE destination numkeys key [key...] [WEIGHTS weight [weight...]] [AGGREGATE SUM|MIN|MAX]: (指定 score 值的乘法因子)(相同元素按照 score 值之和/最小/最大)计算 多个 sorted set 的交集并覆盖 destination
  • ZUNIONSTORE destination numkeys key [key...] [WEIGHTS weight [weight...]] [AGGREGATE SUM|MIN|MAX]: (指定 score 值的乘法因子)(相同元素按照 score 值之和/最小/最大)计算 多个 sorted set 的并集并覆盖 destination

不断分享开发过程用到的技术和面试经常被问到的问题,如果您也对IT技术比较感兴趣可以「关注」我

相关推荐

Redis合集-使用benchmark性能测试

采用开源Redis的redis-benchmark工具进行压测,它是Redis官方的性能测试工具,可以有效地测试Redis服务的性能。本次测试使用Redis官方最新的代码进行编译,详情请参见Redis...

Java简历总被已读不回?面试挂到怀疑人生?这几点你可能真没做好

最近看了几十份简历,发现大部分人不是技术差,而是不会“卖自己”——一、简历死穴:你写的不是经验,是岗位说明书!反面教材:ד使用SpringBoot开发项目”ד负责用户模块功能实现”救命写法:...

redission YYDS(redission官网)

每天分享一个架构知识Redission是一个基于Redis的分布式Java锁框架,它提供了各种锁实现,包括可重入锁、公平锁、读写锁等。使用Redission可以方便地实现分布式锁。red...

从数据库行锁到分布式事务:电商库存防超卖的九重劫难与破局之道

2023年6月18日我们维护的电商平台在零点刚过3秒就遭遇了严重事故。监控大屏显示某爆款手机SKU_IPHONE13_PRO_MAX在库存仅剩500台时,订单系统却产生了1200笔有效订单。事故复盘发...

SpringBoot系列——实战11:接口幂等性的形而上思...

欢迎关注、点赞、收藏。幂等性不仅是一种技术需求,更是数字文明对确定性追求的体现。在充满不确定性的网络世界中,它为我们建立起可依赖的存在秩序,这或许正是技术哲学最深刻的价值所在。幂等性的本质困境在支付系...

如何优化系统架构设计缓解流量压力提升并发性能?Java实战分享

如何优化系统架构设计缓解流量压力提升并发性能?Java实战分享在高流量场景下。首先,我需要回忆一下常见的优化策略,比如负载均衡、缓存、数据库优化、微服务拆分这些。不过,可能还需要考虑用户的具体情况,比...

Java面试题: 项目开发中的有哪些成长?该如何回答

在Java面试中,当被问到“项目中的成长点”时,面试官不仅想了解你的技术能力,更希望看到你的问题解决能力、学习迭代意识以及对项目的深度思考。以下是回答的策略和示例,帮助你清晰、有说服力地展示成长点:一...

互联网大厂后端必看!Spring Boot 如何实现高并发抢券逻辑?

你有没有遇到过这样的情况?在电商大促时,系统上线了抢券活动,结果活动刚一开始,服务器就不堪重负,出现超卖、系统崩溃等问题。又或者用户疯狂点击抢券按钮,最后却被告知无券可抢,体验极差。作为互联网大厂的后...

每日一题 |10W QPS高并发限流方案设计(含真实代码)

面试场景还原面试官:“如果系统要承载10WQPS的高并发流量,你会如何设计限流方案?”你:“(稳住,我要从限流算法到分布式架构全盘分析)…”一、为什么需要限流?核心矛盾:系统资源(CPU/内存/数据...

Java面试题:服务雪崩如何解决?90%人栽了

服务雪崩是指微服务架构中,由于某个服务出现故障,导致故障在服务之间不断传递和扩散,最终造成整个系统崩溃的现象。以下是一些解决服务雪崩问题的常见方法:限流限制请求速率:通过限流算法(如令牌桶算法、漏桶算...

面试题官:高并发经验有吗,并发量多少,如何回复?

一、有实际高并发经验(建议结构)直接量化"在XX项目中,系统日活用户约XX万,核心接口峰值QPS达到XX,TPS处理能力为XX/秒。通过压力测试验证过XX并发线程下的稳定性。"技术方案...

瞬时流量高并发“保命指南”:这样做系统稳如泰山,老板跪求加薪

“系统崩了,用户骂了,年终奖飞了!”——这是多少程序员在瞬时大流量下的真实噩梦?双11秒杀、春运抢票、直播带货……每秒百万请求的冲击,你的代码扛得住吗?2025年了,为什么你的系统一遇高并发就“躺平”...

其实很多Java工程师不是能力不够,是没找到展示自己的正确姿势。

其实很多Java工程师不是能力不够,是没找到展示自己的正确姿势。比如上周有个小伙伴找我,五年经验但简历全是'参与系统设计''优化接口性能'这种空话。我就问他:你做的秒杀...

PHP技能评测(php等级考试)

公司出了一些自我评测的PHP题目,现将题目和答案记录于此,以方便记忆。1.魔术函数有哪些,分别在什么时候调用?__construct(),类的构造函数__destruct(),类的析构函数__cal...

你的简历在HR眼里是青铜还是王者?

你的简历在HR眼里是青铜还是王者?兄弟,简历投了100份没反应?面试总在第三轮被刷?别急着怀疑人生,你可能只是踩了这些"隐形求职雷"。帮3630+程序员改简历+面试指导和处理空窗期时间...

取消回复欢迎 发表评论: