在工作中,时常会有用到队列的场景,比较常见的用rabbitMQ这些专业的组件,官网地址是:http://www.rabbitmq.com,重要的是官方有.net的客户端,但是如果对rabbitMQ不熟悉的话,建议使用第三方封装好的 EasyNetQ,rabbitMQ比较适合对安全性,稳定性要求较高的地方,但有时我们也会有对这方面要求不是很高的场景,比如:文章阅读数,实时性要求不是很高的地方,所以我想到了用redis来做队列。

redis 的List结构本身就是一个链表 (双向链表),所以符合我们的队列先进先出的要求。

我用的是StackExchange.Redis 这个组件来操作redis,以前一直用 Service.Stack.Redis,后来该类库升级后对个人使用有次数限制,需要付费使用才能没有调用限制.

操作redis简单封装如下:

  1. public static class RedisHelper
  2. {
  3. public static int i = 0;
  4. private static string redisConnectionString = ConfigurationManager.AppSettings["RedisConnectionString"].ToString();
  5.  
  6. private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
  7. {
  8. i++;
  9. return ConnectionMultiplexer.Connect(redisConnectionString);
  10. });
  11.  
  12. public static ConnectionMultiplexer Instance
  13. {
  14. get
  15. {
  16. return lazyConnection.Value;
  17. }
  18. }
  19. }

 有了这个操作类后,我们就可以操作redis了,简单的对 list 的操作如下:

  1. /// <summary>
  2. /// 简单 redis 队列
  3. /// </summary>
  4. public class SimpleRedisQueue
  5. {
  6. public void LeftPush(string key, string value)
  7. {
  8. var redis = RedisHelper.Instance.GetDatabase();
  9. redis.ListLeftPush(key, value);
  10. }
  11.  
  12. public string RightPop(string key)
  13. {
  14. var redis = RedisHelper.Instance.GetDatabase();
  15. return redis.ListRightPop(key);
  16. }
  17. }

  

测试代码如下:

首先需要一个生产数据的程序

  1. static void Main(string[] args)
  2. {
  3. System.Threading.Tasks.Task.Factory.StartNew(() =>
  4. {
  5. for (var i = 0; i < 99999999; i++)
  6. {
  7. new WLX.SimpleUtil.Redis.SimpleRedisQueue().LeftPush("test1", "a_" + i.ToString());
  8. }
  9. });
  10.  
  11. System.Threading.Tasks.Task.Factory.StartNew(() =>
  12. {
  13. for (var i = 0; i < 99999999; i++)
  14. {
  15. new WLX.SimpleUtil.Redis.SimpleRedisQueue().LeftPush("test1", "b_" + i.ToString());
  16. }
  17. });
  18. System.Threading.Tasks.Task.Factory.StartNew(() =>
  19. {
  20. for (var i = 0; i < 9999; i++)
  21. {
  22. new WLX.SimpleUtil.Redis.SimpleRedisQueue().LeftPush("test1", "c_" + i.ToString());
  23. }
  24. });
  25. System.Threading.Tasks.Task.Factory.StartNew(() =>
  26. {
  27. for (var i = 0; i < 99999999; i++)
  28. {
  29. new WLX.SimpleUtil.Redis.SimpleRedisQueue().LeftPush("test1", "e_" + i.ToString());
  30. }
  31. });
  32. System.Threading.Tasks.Task.Factory.StartNew(() =>
  33. {
  34. for (var i = 0; i < 99999999; i++)
  35. {
  36. new WLX.SimpleUtil.Redis.SimpleRedisQueue().LeftPush("test1", "f_" + i.ToString());
  37. }
  38. });
  39. Console.ReadKey();
  40. }

 

然后有消费队列的程序:

  1. static void Main(string[] args)
  2. {
  3. var queue = new SimpleRedisQueue();
  4. while (true)
  5. {
  6. var v = queue.RightPop("test1");
  7. Console.WriteLine(v == null ? "空" : v);
  8. }
  9. }

测试结果截图

对可靠性和稳定性要求不高的应用场景,可以使用redis简单方便的实现。

 

  1.  

用redis实现简单的队列的更多相关文章

  1. Redis实现简单消息队列

    http://www.jianshu.com/p/9c04890615ba 任务异步化 打开浏览器,输入地址,按下回车,打开了页面.于是一个HTTP请求(request)就由客户端发送到服务器,服务器 ...

  2. redis实现简单延时队列(转)

    继之前用rabbitMQ实现延时队列,Redis由于其自身的Zset数据结构,也同样可以实现延时的操作 Zset本质就是Set结构上加了个排序的功能,除了添加数据value之外,还提供另一属性scor ...

  3. Redis简单延时队列

    Redis实现简单延队列, 利用zset有序的数据结构, score设置为延时的时间戳. 实现思路: 1.使用命令 [zrangebyscore keyName socreMin socreMax] ...

  4. Redis实现简单的消息队列

    1.问:什么是消息队列?  答:是一个消息的链表,是一个异步处理的数据处理引擎. 2.问:有什么好处? 答:不仅能够提高系统的负荷,还能够改善因网络阻塞导致的数据缺失. 3.问:用途有哪些? 答:邮件 ...

  5. Redis+php-resque实现消息队列

      服务器硬件配置 Dell PowerEdge R310英特尔单路机架式服务器 Intel Xeon Processor X3430 2.4GHz, 8MB Cache 8GB内存(2 x 4GB) ...

  6. Day10 - Python协程、异步IO、redis缓存、rabbitMQ队列

    Python之路,Day9 - 异步IO\数据库\队列\缓存   本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...

  7. 哈,又一款超级简单的队列(MQ)实现方案来了~

    开源的消息队列已经很多了,但大部分很重,实际环境下,很多可能只是使用到了一点功能而已,杀鸡使用牛刀,着实有些浪费了.很多时候,我们只想要一片绿叶,但它们给了我们整个的春天,很难消化.本着DIR精神, ...

  8. redis 的简单命令

    以下实例讲解了如何启动 redis 客户端: 启动 redis 客户端,打开终端并输入命令 redis-cli.该命令会连接本地的 redis 服务. $redis-cli redis > re ...

  9. Redis的简单了解以及主从复制

    1.Redis的简单了解 Redis是一种高性能的分布式NoSql数据库,持久存储,高并发,数据类型丰富,通过现场申请内存空间,同时可以配置虚拟内存.五种数据类型:string(字符串,这种格式和me ...

随机推荐

  1. Junit单元测试类

    /*package zxdc.web; import static org.junit.Assert.*; import java.io.IOException; import javax.servl ...

  2. VS中文档大纲视图的作用

    一.在vs的菜单栏中点击视图==========>其他窗口===========>文档大纲 二.文档大纲的作用是可以查看当前Form窗体的结构,如下图 三.若果感觉控件的类型太长,可以在文 ...

  3. C/C++获取操作系统、CPU、内存信息(windows和linux)

    有时候需要在工程里面获取一些系统或者硬件的信息,比如系统版本,cpu,内存,显卡,硬盘等,作为后续软件功能判断的依据,甚至参与性能算法自适应建模 Windows 操作系统和内存信息在windows下通 ...

  4. PLSQL ORA-12154 TNS无法解析指定的连接标识符

    若你的机子上Windows 64位操作系统, 将PL Sql 的默认安装目录  Program Files (x86) 文件夹改为Program Files 或者别的便可以了

  5. VS2008给对话框添加背景颜色

    第一种方法如下: 在对话框OnPaint()函数中添加代码 //改变对话框背景颜色 CRect rect; CPaintDC dc(this); GetClientRect(rect); dc.Fil ...

  6. java单例的几种写法

    转载出处:http://cantellow.javaeye.com/blog/838473 第一种(懒汉,线程不安全): public class Singleton { private static ...

  7. eclipse项目从编程到打jar包到编写BashShell执行

    eclipse项目从编程到打jar包到编写BashShell执行 一.创建Java项目,并编写项目(带额外jar包) 二.打jar包 三.编写BashShell执行 其中一以及二可以参考我的博客 Ec ...

  8. A - Combination Lock

    Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Description Scroog ...

  9. android调试之adb

    ADB 其实大部分的PC开发机与Android设备的操作都是通过adb(android debug bridge)技术完成的,这是一个C/S架构的命令行工具,主要由三个部分组成 运行在PC开发机上的命 ...

  10. mysql使用小结

    一.修改 mysql 的 root 密码 mysql> use mysql;  mysql> update user set password=password('123456') whe ...