本次主要分享一下使用redis做缓存队列,实现生产者消费者模式。
首先先来看一下redis提供的列表操作接口。像ListRightPush就和符合队列先进先出的原则。
然后围绕这个列表已下单为例简要实现生产者和消费者两端的模块。
生产者Controller
IApplicationContext ctx = ContextRegistry.GetContext(); /// <summary> /// /// </summary> public void Order() { OrderRequest order = new OrderRequest { Mobile = "15100000001", GoodsName = "抱枕", Price = 1, OrderId = "1111" }; Thread t1 = new Thread(new ParameterizedThreadStart(WriteQueue)); t1.Start(order); order = new OrderRequest { Mobile = "15100000002", GoodsName = "坚果", Price = 2, OrderId = "1112" }; Thread t2 = new Thread(new ParameterizedThreadStart(WriteQueue)); t2.Start(order); order = new OrderRequest { Mobile = "15100000003", GoodsName = "羽绒服", Price = 3, OrderId = "1113" }; Thread t3 = new Thread(new ParameterizedThreadStart(WriteQueue)); t3.Start(order); order = new OrderRequest { Mobile = "15100000004", GoodsName = "阔腿裤", Price = 4, OrderId = "1114" }; Thread t4 = new Thread(new ParameterizedThreadStart(WriteQueue)); t4.Start(order); order = new OrderRequest { Mobile = "15100000005", GoodsName = "芒果", Price = 5, OrderId = "1115" }; Thread t5 = new Thread(new ParameterizedThreadStart(WriteQueue)); t5.Start(order); order = new OrderRequest { Mobile = "15100000006", 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.net。以前有使用过spring,年代久远,目前自己正在重新学习当中,往后再分享这一块学习心得。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?