用redis实现简单的队列
在工作中,时常会有用到队列的场景,比较常见的用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实现简单的队列的更多相关文章
- Redis实现简单消息队列
http://www.jianshu.com/p/9c04890615ba 任务异步化 打开浏览器,输入地址,按下回车,打开了页面.于是一个HTTP请求(request)就由客户端发送到服务器,服务器 ...
- redis实现简单延时队列(转)
继之前用rabbitMQ实现延时队列,Redis由于其自身的Zset数据结构,也同样可以实现延时的操作 Zset本质就是Set结构上加了个排序的功能,除了添加数据value之外,还提供另一属性scor ...
- Redis简单延时队列
Redis实现简单延队列, 利用zset有序的数据结构, score设置为延时的时间戳. 实现思路: 1.使用命令 [zrangebyscore keyName socreMin socreMax] ...
- Redis实现简单的消息队列
1.问:什么是消息队列? 答:是一个消息的链表,是一个异步处理的数据处理引擎. 2.问:有什么好处? 答:不仅能够提高系统的负荷,还能够改善因网络阻塞导致的数据缺失. 3.问:用途有哪些? 答:邮件 ...
- Redis+php-resque实现消息队列
服务器硬件配置 Dell PowerEdge R310英特尔单路机架式服务器 Intel Xeon Processor X3430 2.4GHz, 8MB Cache 8GB内存(2 x 4GB) ...
- Day10 - Python协程、异步IO、redis缓存、rabbitMQ队列
Python之路,Day9 - 异步IO\数据库\队列\缓存 本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...
- 哈,又一款超级简单的队列(MQ)实现方案来了~
开源的消息队列已经很多了,但大部分很重,实际环境下,很多可能只是使用到了一点功能而已,杀鸡使用牛刀,着实有些浪费了.很多时候,我们只想要一片绿叶,但它们给了我们整个的春天,很难消化.本着DIR精神, ...
- redis 的简单命令
以下实例讲解了如何启动 redis 客户端: 启动 redis 客户端,打开终端并输入命令 redis-cli.该命令会连接本地的 redis 服务. $redis-cli redis > re ...
- Redis的简单了解以及主从复制
1.Redis的简单了解 Redis是一种高性能的分布式NoSql数据库,持久存储,高并发,数据类型丰富,通过现场申请内存空间,同时可以配置虚拟内存.五种数据类型:string(字符串,这种格式和me ...
随机推荐
- hpuoj 1193: Interval
Interval [STL.双指针.二分] 题目链接 http://acm.hpu.edu.cn/problem.php?id=1193 或者 题目链接 http://acm.nyist.net/Ju ...
- Python: PS 图像调整--饱和度调整
本文用 Python 实现 PS 图像调整中的饱和度调整算法,具体的算法原理和效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/detail ...
- bootstrap 学习笔记(5)---- 图片和响应式工具
(一)响应式图片: 在 Bootstrap 版本 3 中,通过为图片添加 .img-responsive 类可以让图片支持响应式布局.其实质是为图片设置了 max-width: 100%;. heig ...
- Java应用架构设计模块化模式与OSGI摘录
在Java中,最适合模块化的单元就是Jar文件. 代码层面我们关注的太多了,熟练的开发人员现在很少争论使用模式的好处,也不再识别哪个模式适合当前需要,因为都能够本能地使用各种设计原则和模式,从GoF的 ...
- docker容器磁盘
docker容器磁盘扩容 一.配置文件里更改容器创建时的默认磁盘大小 [root@ip---- ~]# cat /etc/sysconfig/docker-storage DOCKER_STORAGE ...
- 2.对《30个提高Web程序执行效率的好经验》的理解
摘自:http://www.cnblogs.com/powertoolsteam/archive/2010/07/12/1775933.html 文章中执行代码的消耗时间是怎么计算的,有知道的同学可以 ...
- 获取access_token时却报出下列错误信息:{"errcode":40164,"errmsg":"invalid ip 61.172.68.219, not in whitelist hint: [KJZfAa0644e575]"},以及一些其他报错
获取access_token时却报出下列错误信息:{"errcode":40164,"errmsg":"invalid ip 61.172.68.21 ...
- sublime配置java环境
今天突然不想用eclipse编写java了,觉得sublime挺好用,就想用sublime配置java环境,以下是过程以及出现的问题. 一.配置Java环境 1.打开我的电脑–属性–高级–环境变量 2 ...
- Java编程环境IntelliJ IDEA
1. 下载并安装jdk,进行配置 https://www.cnblogs.com/zhangchao0515/p/6806408.html 2. 下载并安装 IntelliJ IDEA, 并进行破解 ...
- LeetCode: 620 Not Boring Movies(easy)
题目: X city opened a new cinema, many people would like to go to this cinema. The cinema also gives o ...