本次主要分享一下使用redis做缓存队列,实现生产者消费者模式。

  首先先来看一下redis提供的列表操作接口。像ListRightPush就和符合队列先进先出的原则。

  然后围绕这个列表已下单为例简要实现生产者和消费者两端的模块。

  生产者Controller

     IApplicationContext ctx = ContextRegistry.GetContext();
/// <summary>
///
/// </summary>
public void Order()
{
OrderRequest order = new OrderRequest { Mobile = "", GoodsName = "抱枕", Price = , OrderId = "" };
Thread t1 = new Thread(new ParameterizedThreadStart(WriteQueue));
t1.Start(order);
order = new OrderRequest { Mobile = "", GoodsName = "坚果", Price = , OrderId = "" };
Thread t2 = new Thread(new ParameterizedThreadStart(WriteQueue));
t2.Start(order);
order = new OrderRequest { Mobile = "", GoodsName = "羽绒服", Price = , OrderId = "" };
Thread t3 = new Thread(new ParameterizedThreadStart(WriteQueue));
t3.Start(order);
order = new OrderRequest { Mobile = "", GoodsName = "阔腿裤", Price = , OrderId = "" };
Thread t4 = new Thread(new ParameterizedThreadStart(WriteQueue));
t4.Start(order);
order = new OrderRequest { Mobile = "", GoodsName = "芒果", Price = , OrderId = "" };
Thread t5 = new Thread(new ParameterizedThreadStart(WriteQueue));
t5.Start(order);
order = new OrderRequest { Mobile = "", GoodsName = "哑铃", Price = , OrderId = "" };
Thread t6 = new Thread(new ParameterizedThreadStart(WriteQueue));
t6.Start(order);
}
/// <summary>
///
/// </summary>
/// <param name="obj"></param>
private void WriteQueue(Object obj)
{
//通过spring容器创建对象
IBLLQueue BLLQueue = ctx.GetObject<BLLQueue>("IBLLQueue");
BLLQueue.WriteRedisQueue((OrderRequest)obj);
}
    /// <summary>
/// 订单对象
/// </summary>
  public class OrderRequest
    {
/// <summary>
/// 订单Id
/// </summary>
public string OrderId { get; set; }
/// <summary>
/// 手机
/// </summary>
public string Mobile { get; set; }
/// <summary>
/// 物品名称
/// </summary>
public string GoodsName { get; set; }
/// <summary>
/// 价格
/// </summary>
public double Price { get; set; }
}

  接口和实现类

   public interface IBLLQueue
{
/// <summary>
///
/// </summary>
/// <returns></returns>
void WriteRedisQueue(OrderRequest order);
} public class BLLQueue : IBLLQueue
{
private string key = "OrderQueue";
readonly static object _locker = new object();
/// <summary>
///
/// </summary>
/// <param name="WriteRedisQueue"></param>
public void WriteRedisQueue(OrderRequest order)
{
//添加到下单队列
lock (_locker)
{
var json = JsonHelper.SerializeObject(order);
var result = (int)RedisService.ListRightSet(key, json);
}
}
}

  redis帮助类

        /// <summary>
/// ListGet
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static RedisValue[] ListGet(string key)
{
return Db.ListRange(key);
}
/// <summary>
/// ListSet(尾)
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public static long ListRightSet(string key, string value)
{
return Db.ListRightPush(key, value);
}
/// <summary>
/// ListSet(头)
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public static long ListLeftSet(string key, string value)
{
return Db.ListLeftPush(key, value);
}
/// <summary>
/// ListRemove
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public static long ListRemove(string key, string value)
{
return Db.ListRemove(key, value);
}
/// <summary>
/// ListLength
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public static long ListLength(string key)
{
return Db.ListLength(key);
}

  运行方法,通过可视化工具可看到redis列表结果:

  2.通过控制台输出程序简单实现消费者模块。

  main函数:

      static void Main(string[] args)
{
Queue queue = new Queue();
queue.run();
}

  订单消费者实现方法:

 public class Queue
{
private string key = "OrderQueue";
private bool flg = true;
readonly static object _locker = new object();
public void run()
{
try
{
lock (_locker)
{
while (flg)
{
if (RedisService.ListLength(key) > )
{
Take();
}
flg = false;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public void Take()
{
var list = RedisService.ListGet(key).ToList();
foreach (var item in list)
{
var order = JsonHelper.DeserializeJsonToObject<OrderRequest>(item);
if (order != null)
{
Console.WriteLine("订单编号:" + (order.OrderId ?? "") + " 物品名称:" + (order.GoodsName ?? "") + " 手机:" + (order.Mobile ?? "") + " 价格:" + order.Price);
}
//移除队列
RedisService.ListRemove(key, item);
}
}
}

  执行结果:

  这样本次的案例就算小功告成。这边有简单使用spring.net。以前有使用过spring,年代久远,目前自己正在重新学习当中,往后再分享这一块学习心得。

使用redis实现生产者消费者模式的更多相关文章

  1. Celery 框架学习笔记(生产者消费者模式)

    生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等).产生数据的模块,就形象地称为生产 ...

  2. day 28 :进程相关,进程池,锁,队列,生产者消费者模式

    ---恢复内容开始--- 前情提要: 一:进程Process  1:模块介绍 from multiprocessing import Process from multiprocessing impo ...

  3. 第三节: List类型的介绍、生产者消费者模式、发布订阅模式

    一. List类型基础 1.介绍 它是一个双向链表,支持左进.左出.右进.右出,所以它即可以充当队列使用,也可以充当栈使用. (1). 队列:先进先出, 可以利用List左进右出,或者右进左出(Lis ...

  4. java多线程 生产者消费者模式

    package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static ...

  5. LabVIEW之生产者/消费者模式--队列操作 彭会锋

    LabVIEW之生产者/消费者模式--队列操作 彭会锋 本文章主要是对学习LabVIEW之生产者/消费者模式的学习笔记,其中涉及到同步控制技术-队列.事件.状态机.生产者-消费者模式,这几种技术在在本 ...

  6. 转:Task任务调度实现生产者消费者模式 (个人理解后文)

    纯属个人愚见.欢迎加入反驳(PiDou). 1.前文大致就是,利用Queue配置的一个TaskFactory任务调度器.实现生产者消费者模式的例子..首先我就试了 第一种 FIFO(先进先出)的配置. ...

  7. Lucene.net站内搜索—4、搜索引擎第一版技术储备(简单介绍Log4Net、生产者消费者模式)

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  8. MVC异常日志生产者消费者模式记录(异常过滤器)

    生产者消费者模式 定义自己的异常过滤器并注册 namespace Eco.Web.App.Models { public class MyExceptionAttribute : HandleErro ...

  9. 转:Task任务调度实现生产者消费者模式

    我们经常会遇到生产者消费者模式,比如前端各种UI操作事件触发后台逻辑等.在这种典型的应用场景中,我们可能会有4个业务处理逻辑(下文以P代表生产者,C代表消费者): 1. FIFO(先进先出)      ...

随机推荐

  1. Spring扫面路径配置不全导致异常 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 的原因

    运行Junit测试类 package cn.bgodata.x.zero.service; import org.junit.Test; import org.junit.runner.RunWith ...

  2. 前后端分离djangorestframework——解析渲染组件

    解析器 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己想要的数据类型的过程,本质就是对请求体中的数据进行解析 Accept是告诉对方我能解析什么样的数据,通常也可以表示我想要什么样的数 ...

  3. django重定向

    return HttpResponseRedirect('/index/')# 重定向返回url格式:http://127.0.0.1:8000/index/会去掉前期的所有路由重新写入/index/ ...

  4. LeetCode算法题-Find the Difference(Java实现-五种解法)

    这是悦乐书的第214次更新,第227篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第82题(顺位题号是389).给定两个字符串s和t,它们只包含小写字母.字符串t由随机混 ...

  5. html 标签学习(续)

    一.基础标签补充 1.div 标签和span标签 (没有特别的样式,常用) div标签用来定义一个块级元素,并无实际的意义.主要通过CSS样式为其赋予不同的表现. span标签用来定义内联(行内)元素 ...

  6. Zookeeper Health Checks

    Short Description: The article talks about the basic health checks to be performed when working on i ...

  7. flex布局快速成型(原创)

    最近我根据一个UI设计,耗时3h快速实现较复杂页面布局,如上图.根据这份UI设计图,实现代码如下,暂不考虑具体细节,先以成型为主: <!DOCTYPE html> <html> ...

  8. 关于折半法查找的一些总结以及ArrayList类的总结

    一.折半法查找的总结(这算法很好理解,但我花了好久琢磨他有啥用.....) 1.实际意义 折半法查找主要是为了能够很快在一个数组中找出我们所需要的那个元素,与往常我们通过一个一个比较的方法不同,折半法 ...

  9. JDK动态代理给Spring事务埋下的坑!

    一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...

  10. md5之守株待兔

    第一个实验吧的题目,不太会做,参考了很多大佬的经验,最后发现这个题目很简单,大概这就是入门的感觉吧!如果你多次尝试点开题目给的连接,就会发现,系统的密钥一直会变,可是我的密钥却保持一个,这就让我们联想 ...