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

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

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

操作redis简单封装如下:

 public static class RedisHelper
{
public static int i = 0;
private static string redisConnectionString = ConfigurationManager.AppSettings["RedisConnectionString"].ToString(); private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
i++;
return ConnectionMultiplexer.Connect(redisConnectionString);
}); public static ConnectionMultiplexer Instance
{
get
{
return lazyConnection.Value;
}
}
}

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

    /// <summary>
/// 简单 redis 队列
/// </summary>
public class SimpleRedisQueue
{
public void LeftPush(string key, string value)
{
var redis = RedisHelper.Instance.GetDatabase();
redis.ListLeftPush(key, value);
} public string RightPop(string key)
{
var redis = RedisHelper.Instance.GetDatabase();
return redis.ListRightPop(key);
}
}

  

测试代码如下:

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

  static void Main(string[] args)
{
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
for (var i = 0; i < 99999999; i++)
{
new WLX.SimpleUtil.Redis.SimpleRedisQueue().LeftPush("test1", "a_" + i.ToString());
}
}); System.Threading.Tasks.Task.Factory.StartNew(() =>
{
for (var i = 0; i < 99999999; i++)
{
new WLX.SimpleUtil.Redis.SimpleRedisQueue().LeftPush("test1", "b_" + i.ToString());
}
});
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
for (var i = 0; i < 9999; i++)
{
new WLX.SimpleUtil.Redis.SimpleRedisQueue().LeftPush("test1", "c_" + i.ToString());
}
});
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
for (var i = 0; i < 99999999; i++)
{
new WLX.SimpleUtil.Redis.SimpleRedisQueue().LeftPush("test1", "e_" + i.ToString());
}
});
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
for (var i = 0; i < 99999999; i++)
{
new WLX.SimpleUtil.Redis.SimpleRedisQueue().LeftPush("test1", "f_" + i.ToString());
}
});
Console.ReadKey();
}

 

然后有消费队列的程序:

static void Main(string[] args)
{
var queue = new SimpleRedisQueue();
while (true)
{
var v = queue.RightPop("test1");
Console.WriteLine(v == null ? "空" : v);
}
}

测试结果截图

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

 

												

用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. hdu-4857 逃生(拓扑序)

    题目链接: 逃生 Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) Proble ...

  2. C语言system()函数:执行shell命令

    头文件:#include <stdlib.h> 定义函数:int system(const char * string); 函数说明:system()会调用fork()产生子进程, 由子进 ...

  3. 修改SO

    1.如果在jni中定义的是int型的数据,比如: JNIEXPORT jint JNICALL Java_com_ggndktest1_JniGg_getCoin (JNIEnv * env, job ...

  4. bootstrap 学习笔记(4)---- 按钮

    平常我们自己写按钮,这次不用我们自己写 了,直接应用bootstrap中的按钮样式,就能设计出很漂亮的按钮样式.接下来就让我们一起学习吧. 1.可以作为按钮使用的标签或元素:<a>< ...

  5. ZOJ3496 Assignment

    传送门 这题也是真恶心-- 题目大意是俩公司要运货,每条路有容量上限.然后B公司手里有p个--(技能点?)如果在一条路上放了x个技能点,这条路经过了y个货物,那么B公司就会收x*y的钱.现在要求的是, ...

  6. POJ 3104 Contestants Division

    Contestants Division Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10597   Accepted:  ...

  7. eclipse导入jsp文件第一行报错

  8. HDU2190

    悼念512汶川大地震遇难同胞——重建希望小学 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  9. win7 第一次装 mysql-5.7.16-winx64 ,不知道root 密码,该如何处理?

    转载请注明出处:http://blog.csdn.net/qq_26093511/article/details/52851811 ERROR 1045 (28000): Access denied ...

  10. Java中的双重检查(Double-Check)详解

    在 Effecitve Java 一书的第 48 条中提到了双重检查模式,并指出这种模式在 Java 中通常并不适用.该模式的结构如下所示: ? 1 2 3 4 5 6 7 8 9 10 public ...