首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我是如何用Redis做实时订阅推送的

作者:浮云骑士LIN 前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的。...推送的实效性的问题:当用户在领劵中心订阅了某个劵的领取提醒后,在后台就会生成一条用户的订阅提醒记录,里面记录了在哪个时间点给用户发送推送信息。所以问题就变成了系统如何快速实时选出哪些要推送的记录!...架构很简单:我们把用户的订阅推送记录存储到redis集群的sortedSet队列里面,并且以提醒用户提醒时间戳作为score值,然后在我们个每业务server里面起一个定时器频率是秒级,我的设定就是1s...这里解析一下为什么用redis? 第一redis 可以作为一个高性能的存储db,性能要比MySQL好很多,并且支持持久化,稳定性好。...第二redis SortedSet队列天然支持以时间作为条件排序,完美满足我们选出要推送的记录。 ok~既然方案已经有了那如何在一天时间内把这个方案落地呢?

91530

我是如何用Redis做实时订阅推送的

作者:浮云骑士LIN 前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的。...推送的实效性的问题:当用户在领劵中心订阅了某个劵的领取提醒后,在后台就会生成一条用户的订阅提醒记录,里面记录了在哪个时间点给用户发送推送信息。所以问题就变成了系统如何快速实时选出哪些要推送的记录!...架构很简单:我们把用户的订阅推送记录存储到redis集群的sortedSet队列里面,并且以提醒用户提醒时间戳作为score值,然后在我们个每业务server里面起一个定时器频率是秒级,我的设定就是1s...这里解析一下为什么用redis? 第一redis 可以作为一个高性能的存储db,性能要比MySQL好很多,并且支持持久化,稳定性好。...第二redis SortedSet队列天然支持以时间作为条件排序,完美满足我们选出要推送的记录。 ok~既然方案已经有了那如何在一天时间内把这个方案落地呢?

1.1K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    天生强大的Redis是如何做实时订阅推送的

    前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的。 先说一下领劵中心的项目吧,这个项目就类似京东app的领劵中心,当然图是截取京东的,公司的就不截了。。。...推送的实效性的问题:当用户在领劵中心订阅了某个劵的领取提醒后,在后台就会生成一条用户的订阅提醒记录,里面记录了在哪个时间点给用户发送推送信息。所以问题就变成了系统如何快速实时选出哪些要推送的记录!...架构很简单:我们把用户的订阅推送记录存储到redis集群的sortedSet队列里面,并且以提醒用户提醒时间戳作为score值,然后在我们个每业务server里面起一个定时器频率是秒级,我的设定就是1s...这里解析一下为什么用redis? 第一redis 可以作为一个高性能的存储db,性能要比MySQL好很多,并且支持持久化,稳定性好。...第二redis SortedSet队列天然支持以时间作为条件排序,完美满足我们选出要推送的记录。 ok~既然方案已经有了那如何在一天时间内把这个方案落地呢?

    74520

    数据结构-Redis(二)

    前面介绍了redis的String和哈希,接下来看看其他的数据结构 一、List LPUSH:左边放入 RPUSH:右边放入 LPOP:取出左边第一个数,并且移除 RPOP:取出右边第一个数,并且移除...同理如果选择使用LPUSH 和 RPOP,这时候 则先进先出,符合队列原则。...LRANGE key 0 5,则可以实际作用于微信公众号和微博推送,按顺序推送前五个发消息给你的文章显示出来,这种redis实现比数据库实现效率高很多。...因为后面两个并集是 bcde 然后第一个集合减去 abc - bcde 结果留下第一个集合还剩下的元素 所以剩下a 3、朋友圈查看同时关注的人 而这个处理集合最常用的场景就是 朋友圈看互相点赞的功能。...如何展示这些点击数呢? ZREVRANGE hotNews:20230608 0 3 WITHSCORES 后面的代表数值也一起展示出来。 那么我们现在计算的20230608的,我们如何计算三天呢?

    15230

    Redis 中如何实现的消息队列?实现的方式有几种?

    本课时我们将重点来看一下 Redis 是如何实现消息队列的。 我们本课时的面试题是,在 Redis 中实现消息队列的方式有几种?...lpush、rpop 存入和读取实现消息队列的,如下图所示: lpush 可以把最新的消息存储到消息队列(List 集合)的首部,而 rpop 可以读取消息队列的尾部,这样就实现了先进先出,如下图所示...#推送消息 msg (integer) 2 127.0.0.1:6379> rpop mq #接收到消息 java "java" 127.0.0.1:6379> rpop mq #接收到消息 msg...和此知识点相关的面试题还有以下几个: 在 Java 代码中使用 List 实现消息队列会有什么问题?应该如何解决? 在程序中如何使用 Stream 来实现消息队列?...此时我们可以借助 Redis 中的阻塞读来替代 rpop 的方法就可以解决此问题,具体实现代码如下: import redis.clients.jedis.Jedis; public class ListMQExample

    8.5K61

    关于Redis的入门 2:Redis的基本操作

    关于Redis的入门 2:Redis的基本操作在上一篇文章中,我们学习了如何安装并配置Redis。...今天,我们将重点介绍Redis的基本操作,包括如何使用Redis存储和管理数据,以及如何利用Redis的不同数据结构来实现不同的应用需求。...结果:mykey的值变为 "Hello, Redis! It's great!"自增自减: Redis还支持对字符串进行自增和自减操作,非常适合处理计数器等场景。...命令获取列表的一部分或全部: LRANGE mylist 0 -1 # 获取整个列表弹出元素: 使用LPOP和RPOP命令分别从左侧和右侧弹出元素: LPOP mylist # 弹出左侧的元素...Redis的发布/订阅Redis的发布/订阅(Pub/Sub)模式非常适合用于消息推送系统。客户端可以订阅某个频道,当该频道发布消息时,所有订阅者都会接收到消息。

    9510

    Redis API——List功能实践与性能测试【Go版】

    前文提到Go语言Redis API基本功能实践,以及后续的学习实践计划,由于总总原因耽搁了许久。...终究是计划赶不上变化,学完Go语言操作Redis的常用功能之后,我打算把API实践、封装、简单性能测试场景放在一起写。...今天分享一下Redis list常用操作API的实践和性能测试,API的封装会放在文末。 常用API实践 LPush、LPush、LPush、LPush 关于API的功能,看名字就能够明白八九不离十。...两组变量:左和右,推送和获取。 下面是我写了一个测试用例,均测试通过。...// @Description: 从列表的右边删除第一个数据,并返回删除的数据 // @receiver r // @param key // @param second // @return

    46630

    【Redis】五大常见的数据类型之 List

    64 字节(默认值,可由 list-max-ziplist-value 配置),Redis 会使用压缩列表作为 List 类型的底层数据结构; 如果列表的元素不满足上面的条件,Redis 会使用双端链表作为...1、如何满足消息保序需求? List 本身就是按先进先出的顺序对数据进行存取的,所以,如果使用 List 作为消息队列保存消息的话,就已经能满足消息保序的需求了。...如果有新消息写入,RPOP 命令就会返回结果,否则,RPOP 命令返回空值,再继续循环。...和消费者程序自己不停地调用 RPOP 命令相比,这种方式能节省 CPU 开销。 2、如何处理重复的消息? 消费者要实现重复消息的判断,需要 2 个方面的要求: 每个消息都有一个全局的 ID。...integer) 1 3、如何保证消息可靠性?

    20120

    Redis 应用实践-消息队列

    Redis是一个功能强大的内存缓存系统,同时也支持一些高级功能,例如发布/订阅、事务、Lua脚本等。其中,Redis也可以作为消息队列使用,以支持异步处理和解耦系统组件。...使用列表实现消息队列在Redis中,可以使用列表数据类型实现消息队列。假设有两个客户端,一个客户端向列表中推送消息,另一个客户端从列表中获取消息。...推送消息的客户端代码:import redisr = redis.Redis(host='localhost', port=6379, db=0)r.lpush('message_queue', 'message1...redis.Redis(host='localhost', port=6379, db=0)while True: message = r.rpop('message_queue') if...message: print(message)在此示例中,客户端向名为message_queue的列表中推送消息,另一个客户端从列表中获取消息。

    39630

    田哥 手把手教 你用 Redis 做延迟消息队列

    Redis如何实现消息队列? 大家都知道,Redis的五种数据类型,其中有一种类型是list。并且提供了相应的进入list的命令lpush和rpush ,以及弹出list的命令lpop和rpop。...如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令...移除并返回列表 key 的头元素。如果key不存在,返回nil。 使用案例: ? rpop 使用方式:rpop key,移除并返回列表 key 的尾元素。当 key 不存在时,返回 nil 。...到此,使用Redis实现消息队列就成功了。 但是,搞了半天只是使用Redis实现 了消息队列,那延迟呢? 上面并没有提到延迟队列的实现方式,下面我们来看看Redis中是如何实现此功能的。...4.可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。 注意:该选项自 Redis 2.0 版本起可用。

    3.6K21

    Redis 使用 List 实现消息队列的利与弊

    Redis 如何实现消息队列?是否满足存取需求?...今天,码哥结合消息队列的特点一步步带大家分析使用 Redis 的 List 作为消息队列的实现原理,并分享如何把 SpringBoot 与 Redission 整合运用到项目中。...List 实现消息队列 Redis 的列表(List)是一种线性的有序结构,可以按照元素被推入列表中的顺序来存储元素,能满足「先进先出」的需求,这些元素既可以是文字数据,又可以是二进制数据。...程序需要不断轮询并判断是否为空再执行消费逻辑,这就会导致即使没有新消息写入到队列,消费者也要不停地调用 RPOP 命令占用 CPU 资源。 ❝65 哥:要如何避免循环调用导致的 CPU 性能损耗呢?...其实这就是幂等,对于同一条消息,消费者收到后处理一次的结果和多次的结果是一致的。

    1.8K30

    Redis 竟然能用 List 实现消息队列

    Redis 如何实现消息队列?是否满足存取需求?...今天,码哥结合消息队列的特点一步步带大家分析使用 Redis 的 List 作为消息队列的实现原理,并分享如何把 SpringBoot 与 Redission 整合运用到项目中。...List 实现消息队列 Redis 的列表(List)是一种线性的有序结构,可以按照元素被推入列表中的顺序来存储元素,能满足「先进先出」的需求,这些元素既可以是文字数据,又可以是二进制数据。...程序需要不断轮询并判断是否为空再执行消费逻辑,这就会导致即使没有新消息写入到队列,消费者也要不停地调用 RPOP 命令占用 CPU 资源。 65 哥:要如何避免循环调用导致的 CPU 性能损耗呢?...其实这就是幂等,对于同一条消息,消费者收到后处理一次的结果和多次的结果是一致的。

    2K20

    【Redis】Redis常用命令

    中情况: 值不是整数,返回错误; 值是整数,返回自增后的结果; 键不存在,按照值为0自增,返回结果为1。...mylist 1 3 获取列表中第2个到第4个元素 (2)获取列表指定下标的元素 lindex key index (3)获取列表长度 llen key 3、删除 (1)从列表右侧弹出元素 rpop...返回结果为删除成功的元素个数 3、计算元素个数 Scard key scard的时间复杂度为O(1),直接用redis内部的变量 4、判断元素是否在集合中 Sismember key element...返回结果为添加成功的元素个数 2、计算成员个数 zcard key scard的时间复杂度为O(1),直接用redis内部的变量 3、计算某个成员分数 zsore key member 4、计算成员的排名...八、Transaction(事务) 8.1 discard , 取消执行事务块内的所有命令 8.2 exec

    1.1K20

    Python 源代码里的算法——如何合并多个有序列表并使得结果依然有序?

    摄影:产品经理 朝闻道,晚上喝酒 去年的一篇文章《一日一技:在 Python 里面如何合并多个有序列表并使得结果依然有序?》,我很自不量力地提到了“多个有序列表”。...但实际上,那篇文章仅仅是合并两个有序列表而已。真正要合并多个有序列表并使结果依然有序,会难得多。...先把 A、B 列表的元素合并,得到 X;再把 C、D列表的元素合并得到 Y、然后 XY 合并得到 Z;最后把 Z 与 E 合并得到最终结果。...有什么办法能够让每个列表都只遍历一次呢? 要解决这个问题,就要用到我们的另一篇文章:一日一技:在Python里面如何获取列表的最大n个元素或最小n个元素?...把堆顶元素取出来,放入结果列表中。接下来从这个被取出来的堆顶元素原来所在的列表中,取最小的元素,继续放入堆中…… 一开始有5个列表,所以堆中始终保持5个元素。

    1.9K10

    Redis进阶-如何从海量的 key 中找出特定的key列表 & Scan详解

    ---- 需求 假设你需要从 Redis 实例成千上万的 key 中找出特定前缀的 key 列表来手动处理数据,可能是修改它的值,也可能是删除 key。...那该如何从海量的 key 中找出满足特定前缀的 key 列表来?...; 提供 limit 参数,可以控制每次返回结果的最大条数,limit 只是一个 hint,返回的结果可多可少; 同 keys 一样,它也提供模式匹配功能; 服务器不需要为游标保存状态,游标的唯一状态就是...scan 返回给客户端的游标整数; 返回的结果可能会有重复,需要客户端去重复,这点非常重要; 遍历的过程中如果有数据修改,改动后的数据能不能遍历到是不确定的; 单次返回的结果是空的并不意味着遍历结束,...因为这个 limit 不是限定返回结果的数量,而是限定服务器单次遍历的字典槽位数量(约等于)。 如果将 limit 设置为 10,你会发现返回结果是空的,但是游标值不为零,意味着遍历还没结束。

    4.6K30

    Redis Keyspace Notifications(Redis键空间通知)

    无论如何 K 或者 E 应该以字符串存在, 否则不管字符串其余部分是什么, 都不会传递任何事件. 例如, 仅启用列表的键空间事件, 配置参数必须设置为Kl, 依此类推....如果结果列表为空, 且配置了STORE属性, 并且存在了那个名称的键, 那么会把那个键删除, 因此这种情况下还会生成一个del 事件....RPOP 生成一个rpop 事件. 另外因为列表最后一个元素被弹出, 所以键被移除, 会生成一个del事件. LPOP 生成一个lpop 事件....LREM 生成一个lrem 事件, 另外如果结果列表为空以及键被移除, 会生成一个del事件. LTRIM生成一个ltrim事件, 另外如果结果列表为空以及键被移除, 会生成一个del事件....如果不确定给定的命令如何生成事件, 那么最简单的方法就是自己去观察: $ redis-cli config set notify-keyspace-events KEA $ redis-cli --csv

    2.5K20

    PHP与redis队列实现电商订单自动确认收货

    $redis->RPOP('auto_recevice_order'); file_put_contents('./autoToken/fail_log.txt', $txt ....同时如果没有达到收货的时间,而且与收货时间间距比较大的时候,可以让php脚本休眠sleep一定的时间数,这个时间数自己调节设计,获取出来的未达到时间要求的订单,需要重新推送到redis队列中去,而且还是队列的顶端...($redis->RPOP('auto_recevice_order')); $id = (int)$data->id;//将数据转化为整形 $deliver_time...的相关文章 用Redis实现购物车增删改与清空(基础) 购物车管理包含功能提交商品到购物车显示购物车列表删除购物车里商品修改购物车清空购物车等等购物车的实现方式可以把购物......如何使用Redis接管文件存储 前言php默认使用文件存储session,如果并发量大,效率会非常低。而redis对高并发的支持非常好,可以利用r...

    74930

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券