速度与激情:Redis如何以核心数据结构驱动极致性能

关注微信公众号 “程序员小胖” 每日技术干货,第一时间送达!

引言

Redis是一个开源的内存数据结构存储系统,它支持多种类型的数据结构,如字符串、散列、列表、集合、有序集合等。Redis以其出色的性能和低延迟特性而闻名,这主要得益于其核心数据结构的设计和实现,以及其高性能的存储和访问机制。

核心数据结构

Redis的数据结构设计非常灵活,它不仅支持基本的数据类型,还支持复杂的数据类型,并且提供了丰富的操作命令。

字符串(String)

字符串是Redis中最基本的数据结构,它允许用户将字符串值设置、获取、删除等。

使用场景:

  • 缓存数据(如HTML页面、JSON序列化的对象)
SET  key  value 			//存入字符串键值对
MSET  key  value [key value ...] 	//批量存储字符串键值对
SETNX  key  value 		//存入一个不存在的字符串键值对
GET  key 			//获取一个字符串键值
MGET  key  [key ...]	 	//批量获取字符串键值
DEL  key  [key ...] 		//删除一个键
EXPIRE  key  seconds 		//设置一个键的过期时间(秒)
  • 计数器(如微博点赞数、视频播放次数)
INCR  key 			//将key中储存的数字值加1
DECR  key 			//将key中储存的数字值减1
INCRBY  key  increment 		//将key所储存的值加上increment
DECRBY  key  decrement 	//将key所储存的值减去decrement
  • 分布式锁
SETNX  product:10001  true 		//返回1代表获取锁成功
SETNX  product:10001  true 		//返回0代表获取锁失败
DEL  product:10001			//执行完业务释放锁
SET product:10001 true  ex  10  nx	//防止程序意外终止导致死锁

优点:

  • 简单易用
  • 可以用于简单的缓存和计数场景

缺点:

  • 不适合存储复杂的数据结构

哈希(Hash)

集合是一个无序集合,它通过哈希表实现,具有快速添加、删除和查找操作的特点。

使用场景:

  • 存储用户信息
  • 记录对象属性(用户信息)
  • 缓存关系型数据库的行数据
HMSET  user  1:name  zhangsan  1:age  18
HMSET  user  2:name  lisi      1:age  19
HMGET  user  1:name  1:age  

命令执行结果:

idnameage
1zhangsan18
2lisi19

优点:

  • 可以存储复杂的数据结构
  • 访问和更新效率高
  • 同类数据归类整合储存,方便数据管理

缺点:

  • 不适合存储大量数据,因为所有数据都在一个键下
  • 过期功能不能使用在field上,只能用在key上
  • Redis集群架构下不适合大规模使用

列表(List)

列表是简单的字符串链表,支持从两端插入和删除元素,常用于消息队列等场景。

使用场景:

  • 消息队列
Blocking MQ(阻塞队列)= LPUSH + BRPOP
Queue(队列)= LPUSH + RPOP

# 从列表左侧插入元素
LPUSH tasks "process_video"
# 从列表右侧弹出元素
BPOP tasks

  • 朋友圈时间线
LPUSH message:{用户id} 1
LPUSH message:{用户id} 2
LPUSH message:{用户id} 3
LPUSH message:{用户id} 4

LRANGE message:{用户id} 0 3

优点:

  • 支持双向操作(从头部或尾部添加/移除元素)
  • 可以用作队列或栈

缺点:

  • 元素数量较多时,访问中间元素较慢
  • 列表尾部添加和移除操作很快,但头部操作较慢

集合(Set)

集合是一个无序集合,它通过哈希表实现,具有快速添加、删除和查找操作的特点。

使用场景:

  • 微信微博点赞/收藏
1) 点赞
SADD  like:{消息ID}  {用户ID}
2) 取消点赞
SREM like:{消息ID}  {用户ID}
3) 检查用户是否点过赞
SISMEMBER  like:{消息ID}  {用户ID}
4) 获取点赞的用户列表
SMEMBERS like:{消息ID}
5) 获取点赞用户数 
SCARD like:{消息ID}

  • 好友关系(共同关注)

SINTER set1 set2 set3  { c }
SUNION set1 set2 set3  { a,b,c,d,e }
SDIFF set1 set2 set3  { a }
  • 抽奖活动(随机选取中奖者)
1)点击参与抽奖加入集合
SADD key {userlD}
2)查看参与抽奖所有用户
SMEMBERS key	  
3)抽取count名中奖者
SRANDMEMBER key [count] / SPOP key [count]

优点:

  • 元素唯一,不会重复
  • 支持集合间的操作,如并集、交集

缺点:

  • 不支持排序
  • 不能直接获取集合中的元素

有序集合(Sorted Set)

有序集合是将集合和散列表结合起来,给每个元素设置一个分数,然后根据分数进行排序。

使用场景:

  • 排行榜系统
//展示当日排行前十
ZREVRANGE  hotNews:20190819  0  9  WITHSCORES 

高性能原理

  1. Redis 为什么快?

因为它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性能损耗问题。正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些耗时的指令(比如keys),一定要谨慎使用,一不小心就可能会导致 Redis 卡顿。

  1. Redis线程形式

Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。
Redis有也有多线程的功能,比如持久化、异步删除、集群数据同步等

  1. redis支持高并发

Redis的IO多路复用:redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器。

结语

Redis之所以能够提供高性能的数据存储和访问,主要得益于其内存存储、单线程模型、高效的数据结构设计以及持久化机制等。了解Redis的核心数据结构和高性能原理,对于我们更好地使用Redis、优化应用性能具有重要意义。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最小质数对-第12届蓝桥杯国赛Python真题解析

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第63讲。 最小质数对&#…

【软考】模拟考卷错题本2024-05-14

1 活动图-计算时间差 审题,第几天~选的3、10是结束了上一次的活动并未开始呢 !所以记得按照正常的语序表达哦! 2 队列-算长度 代入法,设计一个开始为0,结尾为9 ,容量为10即M的队列;带入计算当前…

【车载开发系列】AutoSar中的Port

【车载开发系列】AutoSar中的Port 一. Port概念 AutoSAR 接口定义了 SWC 之间、BSW 模块之间以及 SWC 和 BSW 模块之间交互的信息。AutoSAR 接口通过 SWC 和/或 BSW 模块端口(Port)的形式实现。通过这些端口,SWC 和 BSW 模块之间实现了数据…

MYSQL SQL3

1.DCL:Global level 所有库,所有表的权限 Database level:某个数据库中所有表的权限 Table level: 库中某个表的权限 Column level:表中的某个字段的权限 管理:创建用户create user 用户名localhost(ip地址,“%”除了本机登录其他的都可以登录…

iOS ------ 多线程基础

一,进程和线程 1,进程 定义: 进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专有的且受保护的内存进程是系统进行资源分配和调度的一个独立单位 补充:iOS系统是相对封闭的系统&a…

(C语言)队列实现与用队列实现栈

目录 1.队列 1.1队列的概念及结构 1.2 队列的实际应用联想 1.3队列的实现 2. 队列应用——队列实现栈 主要思路 1.队列 1.1队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进…

内网渗透瑞士军刀-impacket工具解析(二)

impacket工具解析之Kerberos认证协议 上一期我们介绍了impacket中ntlm协议的实现,在Windows认证中除了使用ntlm认证,还支持Kerberos认证协议,Kerberos认证也是Windows 活动目录中占比最高的认证方式。 什么是Kerberos协议? Kerb…

什么?你设计接口什么都不考虑?

如果让你设计一个接口,你会考虑哪些问题? 1.接口参数校验 接口的入参和返回值都需要进行校验。 入参是否不能为空,入参的长度限制是多少,入参的格式限制,如邮箱格式限制 返回值是否为空,如果为空的时候是…

第 397 场 LeetCode 周赛题解

A 两个字符串的排列差 模拟&#xff1a;遍历 s s s 记录各字符出现的位置&#xff0c;然后遍历 t t t 计算排列差 class Solution {public:int findPermutationDifference(string s, string t) {int n s.size();vector<int> loc(26);for (int i 0; i < n; i)loc[s…

红黑树底层封装map、set C++

目录 一、框架思考 三个问题 问题1的解决 问题2的解决&#xff1a; 问题3的解决&#xff1a; 二、泛型编程 1、仿函数的泛型编程 2、迭代器的泛型编程 3、typename&#xff1a; 4、/--重载 三、原码 红黑树 map set 一、框架思考 map和set都是使用红黑树底层&…

半监督的GCN:Semi-Supervised Classification With Graph Convolutional Networks

Semi-Supervised Classification With Graph Convolutional Networks -Theophilus Siameh-2017(2023) 思路 使用可扩展方法对图进行半监督学习,其中CNN应用在图数据上,得到GCN。 这种方法是在图的边的数量上进行线性的缩放模型,并学习包含局部图结构和图节点的几个隐藏层…

DiskANN数据布局

_mem.index.data&#xff1a;和sift_base.fbin一模一样。0-3字节是总向量数&#xff0c;4-7是每个向量的特征数。后面就是依次放置的每个向量。 _disk.index&#xff1a;是存储的图&#xff0c;但是不光包含图也包含原始向量。前4KB不知道存的是啥。从第0x1000开始存放的是原始…

【Python大数据】PySpark

CSDN不支持多个资源绑定&#xff0c;另外两个数据文件下载&#xff1a; 订单数据-json.zip search-log.zip Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎 简单来说&#xff0c;Spark是一款分布式的计算框架&#xff0c;用于调度成百上千的服…

【Unity之FairyGUI】你了解FGUI吗,跨平台多功能高效UI插件

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

动手学深度学习19 卷积层

动手学深度学习19 卷积层 1. 从全连接到卷积2. 卷积层3. 代码4. QA 1. 从全连接到卷积 视频&#xff1a; https://www.bilibili.com/video/BV1L64y1m7Nh/?spm_id_from333.999.0.0&vd_sourceeb04c9a33e87ceba9c9a2e5f09752ef8 3.6B元素 36亿元素–模型参数&#xff0c;存储…

JSP技术

三、JSP指令 1、page指令 在JSP页面中&#xff0c;经常需要对页面的某些特性进行描述&#xff0c;例如&#xff0c;页面的编码方式&#xff0c;JSP页面采用的语言等&#xff0c;这些特性的描述可以通过page指令实现。page指令的具体语法格式如下所示&#xff1a; <% page…

震撼发布!GPT-4o 上线!

5 月 14日凌晨一点&#xff0c;OpenAI 发布了 GPT-4o&#xff01; 新模型的功能简单概括就是&#xff1a;更快、更智能、更像人类。 秉承着持续更新的态度&#xff0c;Hulu AI 快速接入 GPT-4o 啦&#xff01; 继 5 月份上线 Suno 之后&#xff0c;这次是 Hulu AI 的又一重大…

机器学习入门介绍

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 目录 三大方向机器学习产生的原因机器如何学习…

2024年第十届中西部外语翻译大赛

2024年第十届中西部外语翻译大赛 竞赛信息 “由中西部翻译协会共同体指导发起&#xff0c;各省市译协共建学术指导委员会&#xff0c;2024年第十届中西部外语翻译大赛由中西部翻译协会共同体秘书处&#xff08;武汉公仪网络科技有限公司&#xff09;承办。” - 获奖证书样图 -…

springSecurity快速入门

1. 介绍 springsecurity是安全框架&#xff0c;准确来说是安全管理框架。相比与另外一个安全框架Shiro&#xff0c;springsecurity提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富 springsecurity框架用于Web应用的需要进行认证和授权 认证&#xff1a;验证当前访问系统…