Redis高阶使用消息队列分布式锁排行榜等

news2024/11/18 19:43:07

一、前言

在大多数传统的web系统中,使用Redis一般都是作为缓存使用,在大数据查询时作为缓解性能的一种解决方案。博主的的系统中使用Redis也主要使用到缓存的作用,还有做了注册中心,分布式事务。其他的强大的功能,没有运用上。下面看一张图,看看Redis高阶还能用到哪些常见的场景。

二、Redis高阶用法 

  1. 消息队列:Redis的列表数据结构非常适合作为简单的消息队列。消息发布者可以使用LPUSH命令向队列中添加消息,而多个消息订阅者则可以通过阻塞线程使用BRPOP命令从队列中取出消息。需要注意的是,Redis官方并不提供可靠消费/发布的机制,因此需要自行实现故障转移、队列持久化、队列监控和流量控制等功能。
  2. Lua脚本:Redis支持使用Lua脚本在服务器端执行一系列命令。这有助于减少客户端与服务器之间的网络开销,并且可以实现复杂的原子操作。
  3. 事务:Redis支持事务,可以将一系列命令作为一个原子操作来执行。这通过MULTI、EXEC、DISCARD和WATCH等命令来实现,确保在事务执行期间,中间步骤不会被其他客户端打断。
  4. 分布式锁:Redis可以利用SET命令的NX(不覆盖)参数来实现分布式锁。获取锁的客户端可以执行临界区的代码,而其他客户端则需要等待锁的释放。
public String lock(String key, int timeOutSecond) {
    for (; ; ) {
        String stamp = String.valueOf(System.nanoTime());
        boolean exist = redisTemplate.opsForValue().setIfAbsent(key, stamp, timeOutSecond, TimeUnit.SECONDS);
        if (exist) {
            return stamp;
        }
    }
}
public void unlock(String key, String stamp) {
    redisTemplate.execute(script, Arrays.asList(key), stamp);
}
  1. 排行榜:Redis的有序集合数据结构(zset)非常适合用来实现排行榜功能。例如,可以通过zadd命令添加分数和成员,然后使用zrevrange命令获取排名最高的成员。
  2. HyperLogLog:这是Redis用于基数统计的算法。当输入元素的数量或体积非常大时,HyperLogLog所需的计算空间总是固定的且很小。通过pfadd命令添加元素,然后使用pfcount命令获取基数统计结果。
  3. 过期键管理:Redis可以为键设置过期时间,过期后键会自动被删除。这对于缓存系统特别有用,可以避免长时间占用内存。

redis的数据结构丰富,一般不会在功能性上造成困扰。但随着请求量的增加,SLA要求的提高,我们势必会对Redis进行一些改造和定制性开发。

 高可用挑战

redis提供了主从、哨兵、cluster等三种集群模式,其中cluster模式为目前大多数公司所采用的方式。

但是,redis的cluster模式,有不少的硬伤。redis cluster采用虚拟槽的概念,把所有的key映射到 0~16383个整数槽内,属于无中心化的架构。但它的维护成本较高,slave也不能够参与读取操作。

它的主要问题,在于一些批量操作的限制。由于key被hash到多台机器上,所以mget、hmset、sunion等操作就非常的不友好,经常发生性能问题。

redis的主从模式是最简单的模式,但无法做到自动failover,通常在主从切换后,还需要修改业务代码,这是不能忍受的。即使加上haproxy这样的负载均衡组件,复杂性也是非常高的。

哨兵模式在主从数量比较多的时候,能够显著的体现它的价值。一个哨兵集群,能够监控成百上千个集群,但是哨兵集群本身的维护是比较困难的。幸运的是,redis的文本协议非常简单,在netty中,甚至直接提供了redis的codec。自研一套哨兵系统,加强它的功能,是可行的。

冷热数据分离

redis的特点是,不管什么数据,都一股脑地搞到内存里做计算,这对于有时间序列概念,有冷热数据之分的业务,造成了非常大的成本考验。为什么大多数开发者喜欢把数据存放在MySQL中,而不是Redis中?除了事务性要求以外,很大原因是历史数据的问题。

通常,这种冷热数据的切换,是由中间件完成的。我们上面也谈到了,Redis是一个文本协议,非常简单。做一个中间件,或者做一个协议兼容的Redis模拟存储,是比较容易的。

比如我们Redis中,只保留最近一年的活跃用户。一个好几年不活跃的用户,突然间访问了系统,这时候我们获取数据的时候,就需要中间件进行转换,从容量更大,速度更慢的存储中查找。

这个时候,Redis的作用,更像是一个热库,更像是一个传统cache层做的事情,发生在业务已经上规模的时候。但是注意,直到此时,我们的业务层代码,一直都是操作的redis的api。它们使用这众多的函数指令,并不关心数据到底是真正存储在redis中,还是在ssdb中。

 功能性需求

redis还能玩很多花样。举个例子,全文搜索。很多人都会首选es,但redis生态就提供了一个模块:RediSearch,可以做查询,可以做filter。

但我们通常还会有更多的需求,比如统计类、搜索类、运营效果分析等。这类需求与大数据相关,即使是传统的DB也不能胜任。这时候,我们当然要把redis中的数据,导入到其他平台进行计算啦。

如果你选择的是redis数据库,那么dba打交道的,就是rdb,而不是binlog。有很多的rdb解析工具(比如redis-rdb-tools),能够定期把rdb解析成记录,导入到hadoop等其他平台。

此时,rdb成为所有团队的中枢,成为基本的数据交换格式。导入到其他db后的业务,该怎么玩怎么玩,完全不会因为业务系统选用了redis就无法运转。

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

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

相关文章

【微服务】以模块化单体架构开发微服务应用

目录 推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战我们知道,起初,单体应用有显著的优势:它们更容易开发和部署。从开发人员的角度来看,这种简单性是有益的。一切都是集中的,可以快速更新任何部分的业务逻辑并立即看到结果。这种开…

2024046期传足14场胜负前瞻

2024046期售止时间为3月26日(周二)19点30分,敬请留意: 本期深盘多,1.5以下赔率5场,1.5-2.0赔率4场,其他场次是平半盘、平盘。本期14场整体难度不大。以下为基础盘前瞻,大家可根据自身…

CSS3实现的分享图标按钮动画特效代码

CSS3分享图标按钮动画特效代码是一款社会分享图标动画特效,鼠标移上去会有一个胶囊闪动的效果。源码由HTMLCSSJS组成,适合绝大部分web网站,可以把它做成一个组件添加到网站的文章页下面,给网站添加一个文章分享功能,也…

私有化视频会议的重要性与优势,WorkPlus Meet助您安全高效沟通

高效的视频会议是推动沟通与协作的重要手段。而选择私有化视频会议平台,保障企业信息安全和会议效果则显得尤为重要。WorkPlus Meet以其卓越的性能和全面的功能,助力企业实现私有化视频会议,提升沟通效果与协作效率。 私有化视频会议的重要性…

关于Java发邮件提醒写周报实现(一)环境搭建

背景 由于公司每周都要写周报,而日常工作很忙,所以很容易忘记这件事件,因此开发一个写周报提醒的机器人,进行特定时间提醒是时候写周报了。 有一个大前提,本技术实现,本着不开通任何收费服务的态度去考察使…

Jackson 2.x 系列【2】生成器 JsonGenerator

有道无术,术尚可求,有术无道,止于术。 本系列Jackson 版本 2.17.0 源码地址:https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 案例演示2.1 创建 JsonFactory2.2 创建 JsonGenerator2.3 写入操作2.4 查…

亚马逊跨境电商为什么要多备几个店铺?多店铺运营技巧

在亚马逊,链接断货超过15天的话就会降权,之后想要把权重升回来是要下不少功夫的,如果这时候有一个备用店铺的话,就可以跟卖自己大号的链接,先保持出单,把权重稳住那么多店铺就需要多个信用卡进行扣店铺租金…

小车倒立摆系统极点配置,LQR闭环控制

在之前直流电机控制仿真里有讲过状态控制的基本架构,有兴趣的同学可以再回去看看,链接如下好玩的直流电机调速实验、PID、极点配置、LQR、观测器;不讲大道理_lqr控制器观测器-CSDN博客 在专栏的前三篇文章 小车倒立摆物理建模与simulink仿真…

【Nebula笔记】简介及安装

目录 一、简介 (一) 什么是图数据库 二、安装 (一) 原生安装 (二) Docker & Docker compose 1. Docker安装 Linux Window 2. 部署NebulaGraph (三) to MAC 三、Nebula Graph Studio (一) 版本兼容性 (二) 原生安装 (三) Docker compose (四) 连接Nebula Gra…

Git——IDEA中的使用详解

目录 Git1、IDEA中配置Git2、将本地项目推送到远程仓库2.1、创建项目远程仓库2.2、初始化本地仓库2.3、连接远程仓库2.4、提交到本地仓库2.5、推送到远程仓库 3、克隆远程仓库到本地4、基本操作4.1、代码提交到暂存区4.2、暂存区代码提交到本地库4.3、推送到远程仓库4.4、撤销本…

主干网络篇 | YOLOv8改进之在主干网络中引入密集连接卷积网络DenseNet

前言:Hello大家好,我是小哥谈。DenseNet(密集连接卷积网络)是一种深度学习神经网络架构,它在2017年由Gao Huang等人提出。DenseNet的核心思想是通过密集连接(dense connection)来促进信息的流动和共享。在传统的卷积神经网络中,每个层的输入只来自于前一层的输出。而在…

【CDA二级数据分析备考思维导图】

CDA二级数据分析备考思维导图 CDA二级复习备考资料共计七个章节,如需资料,请留言,概览如下图:一、数据采集与处理1.数据采集方法2.市场调研和数据录入3、数据探索与可视化4、数据预处理方法 总结:以上为自己学习数据分…

MySQL临时表:临时存储数据的灵活利器

MySQL临时表:临时存储数据的灵活利器 MySQL临时表是处理数据时非常有用的工具,它提供了临时存储数据的能力,使得复杂查询、排序、聚合以及数据筛选变得更加高效和简单。在本文中,我们将深入探讨MySQL临时表的概念以及何时需要使用…

VBA即用型代码手册:保护公式单元格和删除所有空白工作表的代码

我给VBA下的定义:VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率,而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想,积木编程最重要的是积木如何搭建…

25.6 MySQL 子查询

1. 子查询 子查询(Subquery): 是SQL查询语句中的一个重要概念, 它允许在一个查询语句(主查询)中嵌套另一个查询语句(子查询). 这意味着一个查询可以作为另一个查询的输入或条件, 子查询可以出现在SQL语句的多个位置, 例如SELECT, FROM, WHERE等子句中.子查询通常用于以下几种情…

get_ipython()函数使用

今天发现一个很有意思的函数, 在jupyter notebook中,我也可以用命令实现这些值 get_ipython().system(nvidia-smi)结果如下 get_ipython().system(pwd)

nodeJs中实现连表查询

nodeJs中实现连表查询 router.post(/getOrder, async function(req, res, next) {let userId req.body.phone;let sql select * from orders where userId?;let orders await new Promise((resolve, reject) > {connection.query(sql, [userId], function(error, resul…

《手把手教你》系列技巧篇(四十九)-java+ selenium自动化测试-隐藏元素定位与操作(详解教程)

1.简介 对于前端隐藏元素,一直是selenium自动化定位元素的隐形杀手,脚本跑到隐藏元素时位置时报各种各样的错误,可是这种隐藏的下拉菜单又没有办法避免,所以非常头痛,这一篇只为交流隐藏元素自动化定位处理方法以及宏哥…

HarmonyOS(鸿蒙)应用开发——(一)

目录 1 创建hellopro项目 2 了解ArkTS 3 了解ArkTS的组件 4 组件介绍 4.1 常用基础组件: 4.1.1 Text 4.1.2 Button 4.1.3 TextInput 4.2 容器组件 4.2.1 Column 4.2.2 Row 5 案例——实现一个简易登录页面 5.1 在实现预览效果之前,我们…

几个简单的参数,实现计算特征向量的余弦相似度(java实现,纯手撸)

几个简单的参数,实现计算特征向量的余弦相似度(java实现,纯手撸) 太狂喽!突然高级起来🧠🧠🧠🧠🧠🧠🧠🧠🧠&am…