当前位置: 代码网 > it编程>数据库>Redis > Redis高阶使用消息队列分布式锁排行榜等(高阶用法)

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

2024年05月15日 Redis 我要评论
一、前言在大多数传统的web系统中,使用redis一般都是作为缓存使用,在大数据查询时作为缓解性能的一种解决方案。博主的的系统中使用redis也主要使用到缓存的作用,还有做了注册中心,分布式事务。其他

一、前言

在大多数传统的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);
}
  • 排行榜:redis的有序集合数据结构(zset)非常适合用来实现排行榜功能。例如,可以通过zadd命令添加分数和成员,然后使用zrevrange命令获取排名最高的成员。
  • hyperloglog:这是redis用于基数统计的算法。当输入元素的数量或体积非常大时,hyperloglog所需的计算空间总是固定的且很小。通过pfadd命令添加元素,然后使用pfcount命令获取基数统计结果。
  • 过期键管理: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就无法运转。

到此这篇关于redis高阶使用消息队列分布式锁排行榜等的文章就介绍到这了,更多相关redis消息队列内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • Redis分布式锁及安全问题解决

    一、为什么需要分布式锁单机锁: 多个线程同时改变一个变量时,需要对变量或者代码块做同步从而保证串行修改变量.多机系统: 存在多机器多请求同时对同一个共享资源进行修改,如果不加以限制…

    2024年05月15日 数据库
  • Redis Lua脚本的使用教程

    Redis Lua脚本的使用教程

    在redis的学习中,lua脚本是一项强大的高级特性,它允许用户在redis中执行复杂的操作,实现一些不易通过单一命令完成的任务。本篇博客将介绍如何使用lua脚... [阅读全文]
  • 利用redis lua脚本实现时间窗分布式限流

    利用redis lua脚本实现时间窗分布式限流

    需求背景:限制某sql在30秒内最多只能执行3次需求分析微服务分布式部署,既然是分布式限流,首先自然就想到了结合redis的zset数据结构来实现。分析对zse... [阅读全文]
  • Redis 有序集合的使用场景

    Redis 有序集合的使用场景

    在redis的学习中,有序集合(sorted sets)是一种非常实用的数据结构,它允许存储一组带有分数(score)的成员,并按照分数的大小进行排序。本篇博客... [阅读全文]
  • Redis中不同持久化方式的差异对比

    前言大家应该都知道,redis持久化方式主要有两种:rdb(redis database)和aof(append-only file)。但是他们各自存储了什么内容?有什么差异呢?今…

    2024年05月15日 数据库
  • Redis 过期键删除策略的实现示例

    Redis 过期键删除策略的实现示例

    (一)关于键的过期时间或生存时间我们知道,redis数据库是基于内存的,但是如果一些不用的键在内存中一直存在,那么久而久之,就有可能会发生oom的情况。所以,r... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com