使用redis实现生产者消费者模式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使⽤redis实现⽣产者消费者模式 本次主要分享⼀下使⽤redis做缓存队列,实现⽣产者消费者模式。
⾸先先来看⼀下redis提供的列表操作接⼝。
像ListRightPush就和符合队列先进先出的原则。
然后围绕这个列表已下单为例简要实现⽣产者和消费者两端的模块。
⽣产者Controller
IApplicationContext ctx = ContextRegistry.GetContext();
///<summary>
///
///</summary>
public void Order()
{
OrderRequest order = new OrderRequest { Mobile = "151********", GoodsName = "抱枕", Price = 1, OrderId = "1111" }; Thread t1 = new Thread(new ParameterizedThreadStart(WriteQueue));
t1.Start(order);
order = new OrderRequest { Mobile = "151********", GoodsName = "坚果", Price = 2, OrderId = "1112" };
Thread t2 = new Thread(new ParameterizedThreadStart(WriteQueue));
t2.Start(order);
order = new OrderRequest { Mobile = "151********", GoodsName = "⽻绒服", Price = 3, OrderId = "1113" };
Thread t3 = new Thread(new ParameterizedThreadStart(WriteQueue));
t3.Start(order);
order = new OrderRequest { Mobile = "151********", GoodsName = "阔腿裤", Price = 4, OrderId = "1114" };
Thread t4 = new Thread(new ParameterizedThreadStart(WriteQueue));
t4.Start(order);
order = new OrderRequest { Mobile = "151********", GoodsName = "芒果", Price = 5, OrderId = "1115" };
Thread t5 = new Thread(new ParameterizedThreadStart(WriteQueue));
t5.Start(order);
order = new OrderRequest { Mobile = "151********", GoodsName = "哑铃", Price = 6, OrderId = "1116" };
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) > 0)
{
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,年代久远,⽬前⾃⼰正在重新学习当中,往后再分享这⼀块学习⼼得。