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+程序员改简历+面试指导和处理空窗期时间...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)