【Redis技术探索】「底层架构原理」探索分析服务核心数据结构介绍和案例

news2024/11/22 11:43:58

Redis常用存储类型

Redis底层提供了5种数据结构:字符串、哈希、列表、集合、有序集合

下图非常形象的表示了数据结构:

字符串String

常用命令

  • EX seconds:设置失效时长,单位秒
  • PX milliseconds:设置失效时长,单位毫秒
  • NX:key不存在时设置value,成功返回OK,失败返回(nil)
  • XX:key存在时设置value,成功返回OK,失败返回(nil)

SET key value [EX seconds] [PX milliseconds] [NX|XX]

批量存储字符串键值对

MSET key value [key value...]

设置一个不存在的key

SETNX key value

获取key对应的value

GET key

批量获取字符串键值

MGET key [key...]

删除一个键

DEL key [key...]

设置一个键的过期时间(秒)

EXPIRE key seconds

原子操作

将key中储存的数字值加1
INCR key
将key中储存的数字值减1
DECR key
将key中储存的数字值加increment
INCRBY key increment
将key中储存的数字值减decrement
INCRBY key decrement

String应用场景

单值存储

SET sentinel:status 1
GET sentinel:status

对象存储

JSON格式

SET user:1001 {"userId":1001, "userName":"张三", "age":28}
GET user:1001
MSET user:1001:name 张三 user:1001:age 28
MGET user:1001:name user:1001:age

分布式锁

返回1表示获取锁成功,返回0表示获取锁失败

SET lock:product:100001 1 EX 30 NX

处理成功后释放锁

DEL lock:product:100001

计数器

INCR article:readcount:18021 // 文章id为18021阅读数量+1
GET article:readcount:18021  // 查询文章id为18021阅读数量
DECR product:count:100001  // 产品id为100001库存-1
GET product:count:100001    // 查询产品id为100001库存

Web集群Session共享

SET sessionId  {"userId":1001,"name":"张三","auth":""}

分布式全局主键id

INCRBY order:ids 1000   // 给订单服务生成1000个主键id

哈希Hash

存储一个哈希表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,整个hash表全部删除

DEL key

为哈希表key中field键的值加上增量increment

HINCRBY key field increment

hash应用场景

存储对象

hmset userinfo id:1001:name 张三 id:1001:age 28
hmget userinfo id:1001:name id:1001:age
hmset user:1001 id 1001 name 张三 age 28
expire user:1001 30
hgetall user:1001

电商购物车

用户id为key,商品id为field,商品数量为value

添加商品
hset cart:user:1001 10088 1
hset cart:user:1001 10072 1
hset cart:user:1001 10192 1
商品增加数量
hincrby cart:user:1001 10088 1
获取商品总数
hlen cart:user:1001
删除商品
hdel cart:user:1001 10072
查询商品列表
hgetall cart:user:1001

hash优缺点

优点

同类数据归类整合储存,方便数据管理,相比string操作消耗内存与cpu更小,相比string储存更节省空间

缺点

过期功能只能设置在key上,无法对field单独设置key,一个key不能存太多的field

List集合

常用操作

list列表左边依次插入一个或多个value

LPUSH list value [value ...]

list列表右边依次插入一个或多个value

RPUSH list value [value ...]

移除list列表最左边的元素并返回

LPOP list

移除list列表最右边的元素并返回

RPOP list

返回列表list中指定区间内的元素,区间以偏移量start和stop指定

LRANGE list start stop

从list列表中弹出最左边的元素,如果list为空则阻塞timeout秒

BLPOP list [timeout]

从list列表中弹出最右边的元素,如果list为空则阻塞timeout秒

BRPOP list [timeout]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9UYjlSrn-1671096099930)(null)]

list实现数据结构

  • 栈(FILO):LPUSH + LPOP 或 RPUSH + RPOP
  • 队列(FIFO):LPUSH + RPOP 或 RPUSH + LPOP
  • 阻塞队列:LPUSH + BRPOPRPUSH+BLPOP

list应用场景

消息队列

利用list的LPUSH + BRPOP实现一个消息队列,故而可以实现一个简单的点对点消息队列

点赞用户列表

利用RPUSH + LRANGE组合实现点赞用户列表功能

消息推送

利用LPUSH + LRANGE组合实现消息推送功能

Set集合

常用操作

往集合key中存入一个或多个元素,元素存在则忽略,元素不存在则存入

SADD key [member] [member...]

从集合key中移除一个或多个元素,不存在的元素则忽略

SREM key [member] [member...]

获取集合key中所有元素

SMEMBERS key

获取集合key总个数

SCARD key

判断member元素在key集合中是否存在

SISMEMBER key member

从集合key中随机选择出count个元素,元素不从集合key中删除

SRANDMEMBER key [count]

从集合key中移除随机count个元素

SPOP key [count]

多个集合求交集

SINTER key [key...]

将交集结果存入destination集合中

SINTERSTORE destination key1 [key2] 

将交集结果存入destination集合中

SUNION key1 [key2] 

将并集结果存入destination集合中

SUNIONSTORE destination key1 [key2]

差集运算

SDIFF key1 [key2] 

将差果存入destination集合中

SDIFFSTORE destination key1 [key2]

应用场景

抽奖小程序

奖品id为1001的抽奖添加10293用户
SADD draw:prizes:1001 10293
查看所有参与抽奖用户
SMEMBERS draw:prizes:1001
抽奖
SPOP draw:prizes:1001
SPOP draw:prizes:1001 N
点赞、收藏功能
收藏
  • 用户id为29102收藏了文章id为1001
SADD collect:article:1001 29102
取消收藏
  • 用户id为29102取消收藏文章id为1001
SREM collect:article:1001 29102
检查用户是否收藏
SISMEMBER collect:article:1001 29102
获取收藏的用户列表
SMEMBERS collect:article:1001
获取收藏用户数
SCARD collect:article:1001

ZSet有序集合

常用操作

向有序集合添加一个或多个成员,或者更新已存在成员的分数

ZADD key score1 member1 [score2 member2] 

从有序集合key中删除key

ZREM key member [member...]

返回有序集合key中元素member的分值

ZSCORE key member

为有序集合key中元素member的分值加上increment

ZINCRBY key increment member 

返回有序集合key中元素个数

ZCARD key 

正序获取有序集合key从start下标到stop下标的元素

ZRANGE key start stop [WITHSCORES] 

倒序获取有序集合key从start下标到stop下标的元素

ZREVRANGE key start stop [WITHSCORES] 

并集计算

ZUNIONSTORE destkey numkeys key [key ...]  

交集计算

ZINTERSTORE destkey numkeys key [key ...] 

应用场景

排行榜功能

文章id10001在20210426日被点击一次
ZINCRBY hotnews:20210426 1 10001 
展示当天热点前十新闻
ZREVRANGE hotnews:20210426 0 10 WITHSCORES
七日搜索榜单计算
ZUNIONSTORE hotnews:20210426-20210502 hotnews:20210426 hotnews:20210427 ... hotnews:20210502
展示七日排行前十
ZREVRANGE hotnews:20210426-20210502 0 10 WITHSCORES

Redis为什么每秒支持10w并发

  • 单线程设计,避免线程上下文切换
  • 基于内存操作运算
  • 使用IO多路复用技术实现对多个并发请求的响应

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

过滤器工厂详解

内置过滤器 1 AddRequestHeader GatewayFilter Factory 添加请求头 2 AddRequestParameter GatewayFilter Factory 3 AddResponseHeader GatewayFilter Factory 4 DedupeResponseHeader GatewayFilter Factory 5 Hystrix GatewayFilter Factory 6 FallbackHeaders GatewayFil…

答对这 9 题你就超越了 83.3% 的图数据库 NebulaGraph 用户

熟悉 NebulaGraph 社区的小伙伴可能都知道一个技能认证叫做:NGCP,全称 NebulaGraph Certified Professional。用户在考试认证期间在 1 个小时内回答 100 道题目,并获得 60 分,便是 NebulaGraph 认证过的 NGCP 用户。NGCP 用户除了…

二、Node.js 模块基础 1.0

模块、模块化 在讲Node.js当中的模块之前先来简单了解什么是模块、模块化、以及模块化编程的演变过程;模块通常指的是编程语言提供的代码组织机制,利用此机制可将程序拆解位独立且通用的代码单元,表意文绉绉,你可以理解为能够组装…

Docker+Jenkins+Gitlab+SpringBoot 自动化部署项目

我这边Docker、Jenkins、Gitlab 都已准备完毕,Jenkins和GItlab 都是用Docker起的 我们先进入Jenkins,插件什么的按他推荐的装就可以了,另外使用gitlab,还需要额外安装下面的插件 然后我们开始在Jenkins上创建项目 然后点保存,接下…

行业说 | 建筑业面临失宠,越来越留不住年轻人?原因在这

大家好,这里是建模助手。 不知道大家有没有发现,现在建筑行业存在着一种现象,就是:年轻人建筑行业“不想去”&“留不住”。 在这种情况下,行业的老龄化趋势便愈发明显,据数据显示: 2021年…

跬智信息(Kyligence)荣登「甲子20」中国数据智能领域最具商业潜力科技企业榜

近日,为表彰中国科技产业与数字经济领域的杰出贡献者,中国科技产业智库甲子光年在 2022「甲子引力」年终盛典上公布多项榜单。凭借在数据智能领域的核心技术优势与高成长性的商业价值表现,跬智信息(Kyligence)最终荣登…

【C++11】三大神器之——包装器和绑定器

前言 如果你还不知道 C 11 引入的包装器和绑定器是什么,可以读读这篇文章,看看有什么 启发;如果你已经对包装器和绑定器了如指掌,也可以读读这篇文章,看看有什么 补充。欢迎交流~😏 可调用对象 C中存在【…

PCB叠层当中的“假八层”是什么意思呢?

大家在进行PCB设计的时候都是需要对我们的板子选择叠层方案的,一个好的层叠方案能使我们的信号质量变好,板子性能也会更稳定等等,大家可能或多或少的接触过多层板,也就是两层往上的板子,那么大家在做六层板的时候是否有…

Servlet:狂神Response源码分析【文件下载 + 动态图形验证码 + 重定向】

目录web.xmlindex.jspRequestTestlogin测试FileServlet文件下载测试动态图形验证码Servlet动态图形验证码测试总结web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi&quo…

15-16-17 - 保护模式中的特权级

---- 整理自狄泰软件唐佐林老师课程 文章目录1. 保护模式小结1.1 使用选择子访问段描述符表时&#xff0c;索引值的合法性检测1.2 内存段类型合法性检测1.3 实例分析2. 问题一3. 保护模式中的特权级3.1 特权级的表现形式3.2 初探特权级3.2.1 CPL和DPL的关系3.2.2 段描述符中的D…

手把手教你Spring Cloud Alibaba教程:使用nacos实现服务注册与发现

我们在上一篇&#xff1a;手把手教你Spring Cloud Alibaba教程:nacos安装 接下来我们来实现下基本的服务注册和发现 版本确认 我们需要确认spring Cloud Alibaba version对应的nacso version 主要如下 版本说明 alibaba/spring-cloud-alibaba Wiki Spring Cloud Alibaba Ve…

图解:基于HyperWorks螺纹升角的六面体划分攻略

导读&#xff1a;在实际工程应用中&#xff0c;基于HyperWorks六面体工程命令&#xff0c;对工程师朋友来说比较繁琐&#xff0c;甚至不容易掌握。于是经常参加一些线下培训&#xff0c;用以提升自己业务技能。今天&#xff0c;笔者从一个企业资深培训讲师的角度&#xff0c;结…

Docker安装Oracle

Docker安装Oracle 本次使用的系统是centOS7 &#xff08;文章部分参考&#xff1a;地址&#xff09; 安装Docker docker安装要求&#xff1a;CentOS内核版本高于3.10&#xff0c;可以通过命令 uname -r查看当前内核版本 下载工具 yum install -y yum-utils设置阿里云镜像 …

【MySQL】使用C语言连接数据库

文章目录下载Mysql的C接口库程序中引入Mysql头文件和库文件**Mysql接口介绍**创建句柄链接数据库设置字符编码执行SQL语句关闭链接mysql.ops.cc下载Mysql的C接口库 要使用C语言连接mysql,需要使用mysql官网提供的库,大家可以官网下载,实际上连接数据库的功能在mysql 8.0版本之…

(十五)Vue之过滤器

文章目录计算属性实现methods实现过滤器实现局部过滤器不传参传参多个过滤器使用全局过滤器Vue学习目录 上一篇&#xff1a;&#xff08;十四&#xff09;Vue之收集表单数据 先看一个需求&#xff1a;给一个时间戳&#xff0c;然后把时间戳格式化显示出来 时间戳数据&#xf…

哈希表题目:相交链表

文章目录题目标题和出处难度题目描述要求示例数据范围进阶解法一思路和算法代码复杂度分析解法二思路和算法证明代码复杂度分析题目 标题和出处 标题&#xff1a;相交链表 出处&#xff1a;160. 相交链表 难度 2 级 题目描述 要求 给你两个单链表的头结点 headA\texttt…

web网页设计期末课程大作业 基于HTML+CSS仿苹果商城电商项目的设计与实现

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

Thread类和线程状态

目录 Thread 的常见构造方法 Thread 的几个常见属性 经典面试题&#xff1a;start和run的区别 interrupt 线程中断 join 线程等待 currentThread 获得当前这个线程对应的 Thread 对象的引用。 sleep 置顶休眠的时间(阻塞一会) sleep(1000)&#xff0c;真的只是休眠1000…

使用 MindStudio进行基于 MindX SDK 辅助驾驶项目的开发

视频链接&#xff1a;https://www.bilibili.com/video/BV1K8411p7Cm/ 1 任务介绍 ASSISTED-DRIVING的中文含义为辅助驾驶&#xff0c;其先采用了yolov3模型将图片中的交通标志检测出来&#xff0c;然后利用resnet18模型获对检测出来的交通标志进行分类&#xff1b;在道路线分…

0-1规划下的数独问题

数独显然是一个0-1规划问题.虽然这个什么凸分析还是啥的分析有这个优化的方法,但是,你DFS也不是完全一点不可能的对吧.嗯,既然这样的话,我们就要去解决这样一个更细致的问题了.数独这个问题他的解的存在性,唯一性怎么样.当然,已经有结论了,一个9*9的数独至少要给出17个值才能约…