【16】Redis 支持哪些数据结构?
mhr18 2024-11-22 17:37 21 浏览 0 评论
Redis 支持哪些数据结构?
- 「字符串」(string):字符串是 Redis 最基本的数据结构,它可以是普通的字符串或者二进制数据,最大长度为512MB。
- 「哈希」(hash):Redis哈希是一个键值对集合,其中键和值都是字符串类型。哈希适用于存储对象。
- 「列表」(list):Redis列表是一个链表,每个节点都包含了一个字符串,列表支持正反两个方向的遍历。
- 「集合」(set):Redis集合是字符串的无序集合,支持添加、删除、判断元素是否存在等基本操作,还支持交、并、差等操作。
- 「有序集合」(sorted set):Redis有序集合和集合类似,区别在于集合中的元素可以关联一个分数(score),根据分数进行排序。
img
redis数据结构的使用
接下来叙述常用的api和应用场景。
字符串
「常用操作」
- 存入字符串键值对:SET key value
- 批量存储字符串键值对:MSET key value [key value ...]
- 存入一个不存在的字符串键值对:SETNX key value
- 获取一个字符串键值:GET key
- 删除一个键:DEL key [key ...]
- 设置一个键的过期时间(秒):EXPIRE key seconds
「原子操作」
- 将key中储存的数字值加1:INCR key
- 将key中储存的数字值减1:DECR key
- 将key所储存的值加上i:INCRBY key i
- 将key所储存的值减去d:DECRBY key d
「应用场景」
- 对象缓存:
我们把user表的数据存储到redis中,(user:id)作为key:SET user:1001 value(user的JSON数据)。
也可以将(user:id :字段名)作为key:
SET user:1001:name 小明,
MSET user:1001:name 小明 user:1001:age 18。
- 分布式锁:
利用SETNX命令存入不存在的字符串值,如果key不存在,SETNX将key的值设置为value,然后返回1。如果key已经存在,SETNX不会改变任何内容,并返回0,获得锁后代码运行完毕,删除锁DEL 。
为了防止死锁现象一般设置锁超时时间。我们可以使用SET命令配合NX(如果不存在则设置)和EX(设置过期时间,单位为秒)选项来达到同样的效果,
SET user:1001 value NX EX 10
- 计数器
利用INCRBY原子加操作,可以对文章的阅读量技术。
INCRBY article:readCount:1001
- 分布式序列号
也是利用INCRBY去生成序列号。
哈希Hash
「常用操作」
它的结构大概是 key filed:value,两层,一个是key,一个是filed。
- 存储一个哈希表key的键值:HSET key field value
- 存储一个不存在的哈希表key的键值:HSETNX key field value
- 在一个哈希表key中存储多个键值对:HMSET key field value [field value ...]
- 获取哈希表key对应的field键值:HGET key field
- 批量获取哈希表key中多个field键值:HMGET key field [field ...]
- 删除哈希表key中的field键值:HDEL key field [field ...]
- 返回哈希表key中field的数量:HLEN key
- 返回哈希表key中所有的键值:HGETALL key
「原子操作」
- 为哈希表key中field键的值加上增量i:HINCRBY key field i
- 为哈希表key中field键的值减去d:DECRBY key field d
「应用场景」
- 对象缓存
HSET user 1001:name 小明 1001:age 18 1002:name 小红
HMGET user 1001:name 1001:age 1002:name
- 电商购物车
以(cart:用户ID)为key,商品id为filed,数量为value。
添加商品:
hset cart:1001 pro_100 1
增加数量:
HINCRBY cart:1001 pro_100 1
商品总数:
HLEN cart:1001
删除商品:
hdel cart:1001 pro_100
获取购物车所有商品:
HGETALL cart:1001
List
集合
「常用操作」
- 将一个或多个值value插入到key列表的表头(最左边):LPUSH key value [value ...]
- 将一个或多个值value插入到key列表的表尾(最右边):RPUSH key value [value ...]
- 移除并返回key列表的头元素:LPOP key
- 移除并返回key列表的尾元素:RPOP key
- 返回列表key中指定区间内的元素,区间以偏移量start和stop指定:LRANGE key start stop
- 从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待:BLPOP key [key ...] timeout
- 从key列表尾部弹出元素,若列表中没有元素阻塞等待:BRPOP key [key ...] timeout
list
「应用场景」
栈 先进后出 = LPUSH + LPOP
队列 先进先出 = LPUSH + RPOP
阻塞队列 = LPUSH + BLPOP
SET
不重复集合
「常用操作」
- 往集合key中存入元素,元素存在则忽略:SADD key member [member ...]
- 从集合key中删除元素:SREM key member [member ...]
- 获取集合key中所有元素:SMEMBERS key
- 获取集合key的元素个数:SCARD key
- 判断member元素是否存在于集合key中:SISMEMBER key member
- 从集合key中随机选出count个元素(默认是1个),元素不从key中删除:SRANDMEMBER key [count]
- 从集合key中随机选出count个元素(默认是1个),元素从key中删除:SPOP key [count]
「set运算操作」
交集运算:SINTER key [key ...]
交集运算
将交集结果存入新交集set3中:SINTERSTORE set3 key [key ..]
存放新交集set3中
并集运算:SUNION key [key ..]
将并集结果存入新集合set4中:SUNIONSTORE set4 key [key ...]
差集运算:SDIFF key [key ...]
将差集结果存入新集合set5中:SDIFFSTORE set5 key [key ...]
「应用场景」
- 抽奖:
添加用户:SADD key member
抽奖:SRANDMEMBER award:100 或者 SPOP award:100
- 朋友圈查看点赞
只能看见好友的点赞。
点赞:SADD userID:like:内容 用户id
取消点赞:SREM userID:like:内容 用户id
判断是否点赞过:SISMEMBER userID:like:内容 用户id
朋友看都有谁点赞了:SINTER userID:like:内容 自己的朋友ID
可能认识的人:SDIFF 朋友的朋友ids 我的朋友ids(属于朋友的朋友,但不属于我的朋友的集合)
ZSET
不重复有序集合
「常用操作」
每个值都有自己的分值,比如说 小明 80分,小红 70分,插入班级数学成绩集合。
score:80,70。member:小明,小红
- 往有序集合key中加入带分值元素:ZADD 数学成绩集合 80 小明 70 小红 [[score member]…]
- 从有序集合key中删除元素:ZREM key member [member …]
- 返回有序集合key中元素member的分值:ZSCORE key member
- 为有序集合key中元素member的分值加上i:ZINCRBY key i member
- 返回有序集合key中元素个数:ZCARD key
- 正序获取有序集合小到大key从start下标到stop下标的元素:ZRANGE key start stop [WITHSCORES] WITHSCORES:WITHSCORES 是一个可选参数,用于指定 Redis 命令的返回结果是否包含成员的分数值。 负数表示从后往前数。
- 倒序获取有序集合大到小key从start下标到stop下标的元素:ZREVRANGE key start stop [WITHSCORES]
「集合运算」
并集计算:
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
- destination 是存储结果的新的有序集合的名称。
- numkeys 是输入的有序集合的数量。
- key 是输入的有序集合的名称,可以指定多个。
- WEIGHTS 是一个可选参数,后面可以跟随一个或多个权重值,用于调整输入的有序集合的分数。如果指定了 WEIGHTS,其数量必须与输入的有序集合数量相同。默认情况下,所有的输入有序集合的权重都是 1。
- AGGREGATE 是一个可选参数,用于指定如何聚合相同元素的分数。可以是 SUM(默认值)、MIN 或 MAX。
WEIGHTS后跟num,那么对应的有序列表的值就需要乘以它。
AGGREGATE表示如果多个列表中有相同的元素,那么他们的值是相加、取最小、取最大。
ZUNIONSTORE zset3 2 zset1 zset2 WEIGHTS 2 3 AGGREGATE MIN
这段指令得意思是,zset1 zset2求交集,并将结果集覆盖到zset3集合里边(zset3如果有值也会被删除)。wergth:会把zset1的所有值乘2,zset2的所有值乘3。AGGREGATE MIN 如果键有重复,选取最小的那个,如图中的键aaa。
交集计算:
ZINTERSTORE destkey numkeys key [key …] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
- destkey 是存储结果的新的有序集合的名称。
- numkeys 是输入的有序集合的数量。
- key 是输入的有序集合的名称,可以指定多个。
「应用场景」
微博热搜:
新增一条新闻:ZADD news 0 news:20230623:101
点击新闻增加热度:ZINCRBY news 1 news:20230623:101
七日搜索榜单计算:ZUNIONSTORE hotNews:17-23 7 news:20230623:101 news:20230622:101 ... ...
展示七日排行前十:ZREVRANGE hotNews:17-23 0 9 WITHSCORES
往期回顾
- 上一篇:Redis集群监控方法
- 下一篇:轻松理解Redis的主从复制
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 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)