Redis案例 - 事件提醒

场景

任务是 当 redis set 中有新元素时及时处理 需要在set有新元素后自动得到通知,省得使用轮询的方式来查看是否有新元素 相当于对set做一个事件提醒

实现

如果能使用阻塞版命令就非常简单了,例如list的pop操作有阻塞版的brpop

阻塞版的意思就是:当key中为空时就等着,有新元素后就马上获取

非阻塞版命令则不等,直接返回了

获取set元素的命令spop是没有阻塞版本的,但可以把他俩一起使用,使用brpop来完成这个任务 新元素的事件处理,相当于消费者 示例代码

LOOP forever WHILE SPOP(key) returns elements ... 逻辑处理 ... END BRPOP helper_key END 向set中添加新元素时就触发了事件,相当于生产者 示例代码 MULTI SADD key element LPUSH helper_key x EXEC 生产者向set中添加元素,同时向list中也添加了元素,并把这两个动作放到一个事务中,保证原子性

消费者阻塞等待list,阻塞解除后,从set中获取元素进行逻辑处理,当生产者向list中添加新元素时,阻塞就解除了,也就说明set中有了新元素

这个list只是一个帮助角色,用来实现阻塞通知功能,不是业务角色

通过对list阻塞方式的结合,巧妙的实现了阻塞版的set 使用阻塞版list操作,可以实现更丰富的阻塞原语 此示例来自redis官网,很有趣的用法

原文发布于微信公众号 - 性能与架构(yogoup)

原文发表时间:2016-03-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏移动开发面面观

Android并发备忘录

2363
来自专栏Android群英传

看ASM在代码中的强势插入

4373
来自专栏阿杜的世界

Redis学习札记

Redis支持两种持久化方式,一种是RDB方式(快照:根据指定的规则“定时”将内存中的数据存储在硬盘上),另一种是AOF方式(在每次执行命令后都将命令本身记录下...

1313
来自专栏Seebug漏洞平台

从补丁到漏洞分析——记一次joomla漏洞应急

2018年1月30日,joomla更新了3.8.4版本,这次更新修复了4个安全漏洞,以及上百个bug修复。

4248
来自专栏人工智能LeadAI

今天不如来复习下Python基础

01 python是什么? Python是一种解释型语言。这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需要编译。其他解释型语言还包括PH...

4175
来自专栏IT技术精选文摘

Java多线程知识小抄集(三)

51. SimpleDateFormat非线程安全 当多个线程共享一个SimpleDateFormat实例的时候,就会出现难以预料的异常。 主要原因是parse...

2246
来自专栏Golang语言社区

Go语言基于共享变量的并发

一个特定类型的方法和操作函数是并发安全的,那么所有它的访问方法和操作都是并发安全的。导出包级别的函数一般情况下都是并发安全的,package级的变量没法被限制在...

41811
来自专栏架构师小秘圈

分布式之缓存击穿

1695
来自专栏架构师之旅

JVM内存管理------JAVA语言的内存管理概述

引言 内存管理一直是Java语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑。不过世界上不存在十全十...

1947
来自专栏菜鸟计划

Ajax详解

一、ajax定义 ajax 的全称是Asynchronous JavaScript and XML,其中,Asynchronous 是异步的意思,它有别于传统w...

3915

扫码关注云+社区

领取腾讯云代金券