今天在使用StackExchange Redis客户端时。我想要使用BRPOP,但是我发现StackExchange Redis并没有提供API,没办法只好找资料看文档了。

原来StackExchange Redis使用的是Multiplexing(多路复用),也就是说它只跟redis server维持单个连接。当有并发请求时,它会自动使用管道(pipeline)发送每个请求,每个请求都需要等待直到先前的请求执行完毕。基于这个原因,StackExchange Redis不提供BRPOP/BLPOP相应的api, 因为这两个操作很有可能会阻塞整个Mulitplexer。

那么,有什么方法来实现BRPOP/BLPOP操作呢。文档中给出了答案,使用pub/sub:

sub.Subscribe(channel, () => {
    string work = db.ListRightPop(key);
    if (work != null) Process(work);
});
//...
db.ListLeftPush(key, newWork, flags: CommandFlags.FireAndForget);
sub.Publish(channel, "");

注:1.这种实现方式中数据并不是真正通过pub/sub传递的,pub/sub仅仅是通知,也就是说当有数据加入到队列中时,就去通知订阅者,让订阅者从列表中取出数据。

      2.当有多个消费者订阅时,只有一个消费者能取到该值

      3.如果没有消费者订阅时,数据将一直存在列表中

      4.当你的消费者因为重启没收到加入新数据的通知时,你需要确保消费者能够处理这种积压的数据(这个似乎比较麻烦..)

 

参考资料:https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/PipelinesMultiplexers.md

 

posted @ 2015-05-07 23:20 浩GE 阅读(2478) 评论(2) 推荐(2) 编辑
摘要: 今天在遇到这么个问题,项目上有一部分功能需要访问web api, 这个api请求和相应的数据格式都是使用JSON,JSON中的field命名方式是以下划线分割的,比如"project_name", "account_id"等等。但是在C#中命名方式一般都为Camel-Case,这样如果使用Json.... 阅读全文
posted @ 2015-01-16 21:43 浩GE 阅读(5045) 评论(2) 推荐(0) 编辑
摘要: 今天在工作上遇到这么个需求:需要获取对象上所有属性的值,但并事先并不知道对象的类型。 我的第一反应就是使用反射,但是这个操作会进行多次,大量的反射肯定会有性能影响。虽然对我这个项目无关紧要,但我还是选择了另外一种解决方案:构建表达式树,再生成委托,然后将委托缓存在字典里。代码如下:首先构建表达式树(... 阅读全文
posted @ 2014-12-23 21:36 浩GE 阅读(3458) 评论(48) 推荐(0) 编辑
摘要: 在不改变现有网站代码的前提下加入验证功能: 1.假设现有网站后端nodejs,端口3000,nginx配置如下 server { listen 80; server_name localhost; location /{ ... 阅读全文
posted @ 2013-12-16 21:24 浩GE 阅读(3552) 评论(1) 推荐(0) 编辑
摘要: Backbone.js是前端的MVC框架,它通过提供模型Models、集合Collection、视图Veiew赋予了Web应用程序分层结构。从源码中可以知道,Backbone主要分了以下几个模块: (function(root) { Backbone.Events //自定义事件机... 阅读全文
posted @ 2013-11-26 23:14 浩GE 阅读(2041) 评论(1) 推荐(1) 编辑
摘要: 在JavaScript中this关键字的用法很灵活也很强大,但也往往给概念不清的初学者带来混淆,如果在一个function中你不知道this代表什么,那么你也很难理解这个function的作用了。 在JavaScript中this代表了当前执行的上下文,它是动态绑定的,也就是说只有到了functio... 阅读全文
posted @ 2013-11-04 20:09 浩GE 阅读(960) 评论(5) 推荐(1) 编辑
摘要: 在很早以前就听说过表达式树了,但并没有去了解它。虽然自己用过linq to sql和linq to entity,但也就用着就用着,并没有去深究c#代码怎么会生成sql代码而不是IL。废话不多说了,开写吧! .net里表达式树核心概念就是:将代码作为数据。它将一些代码表示为一个对象树,树中的每个节... 阅读全文
posted @ 2013-09-09 21:22 浩GE 阅读(6711) 评论(0) 推荐(5) 编辑
摘要: 在网页中,我们经常需要引用大量的javascript和css文件,在加上许多javascript库都包含debug版和经过压缩的release版(比如jquery),不仅麻烦还很容易引起混乱,所以ASP.NET MVC4引入了Bundles特性,使得我们可以方便的管理javascript和css文件... 阅读全文
posted @ 2013-09-05 20:59 浩GE 阅读(3416) 评论(3) 推荐(4) 编辑
摘要: 我们都知道在ASP.NET MVC中自带了Razor View Engine,Razor十分的强大,可以满足我们绝大部分的需要。但是ASP.NET MVC的高度可扩展性,使我们可以使用自定义的View Engine,以满足我们自己的特殊需要。 首先,实现自定义的View Engine需要实现IVie... 阅读全文
posted @ 2013-08-30 20:16 浩GE 阅读(700) 评论(0) 推荐(0) 编辑
摘要: 还是这张图: 当ControllerFactory生成Controller实例后,这时就需要使用ActionInvoker来选择调用一个合适的Action执行。ASP.NET MVC提供的基类Controller已经实现了ActionInvoker的功能。但是我们可以实现自定义的ActionInv... 阅读全文
posted @ 2013-08-27 23:27 浩GE 阅读(2886) 评论(0) 推荐(2) 编辑
点击右上角即可分享
微信分享提示