//从第1个开始,依次向左插入值。如果键不存在,先创建再插入值 队列形式 先进后出,后进先出
//插入后形式 <-- 10,9,8,7,6,5,4,3,2,1 <-- 方向向左依次进行 stopwatch.start(); for (int i = 0; i < 10; i++) { var getobjlist = rediscachehelper.instance.listleftpush("leftlistkey", (i + 1).tostring()); } stopwatch.stop(); console.writeline("在列表头部插入值消耗时间:" + stopwatch.elapsedmilliseconds.tostring()); //从第1个开始,依次向右插入值。如果键不存在,先创建再插入值 先进先出,后进后出
//插入后形式 1,2,3,4,5,6,7,8,9,10 --> 方向向右依次进行 stopwatch.start(); for (int i = 0; i < 10; i++) { var getobjlist = rediscachehelper.instance.listrightpush("rightlistkey", (i + 1).tostring()); } stopwatch.stop(); console.writeline("在列表尾部插入值消耗时间:" + stopwatch.elapsedmilliseconds.tostring());
//获取left列表中的队列元素 从列表头部开始读取 var getleftvalue = rediscachehelper.instance.listrange("leftlistkey"); console.writeline(string.join(",", getleftvalue)); //获取right列表中的队列元素 从列表头部开始读取 var getrightvalue = rediscachehelper.instance.listrange("rightlistkey"); console.writeline(string.join(",", getrightvalue));
//从左边第一个元素开始 循环移除并返回该移除的值 console.writeline("从左边开始"); while (true) { var getleftvalue = rediscachehelper.instance.listleftpop("leftlistkey"); if (!string.isnullorempty(getleftvalue)) { console.writeline("移除:" + getleftvalue); } else { break; } } //从右边第一个元素开始 循环移除并返回该移除的值 console.writeline("从右边开始"); while (true) { var getrightvalue = rediscachehelper.instance.listrightpop("rightlistkey"); if (!string.isnullorempty(getrightvalue)) { console.writeline("移除:" + getrightvalue); } else { break; } }
//从左边第一个元素开始 循环移除并返回该移除的值 替换一下key后 console.writeline("从左边开始"); while (true) { var getleftvalue = rediscachehelper.instance.listleftpop("rightlistkey"); if (!string.isnullorempty(getleftvalue)) { console.writeline("移除:" + getleftvalue); } else { break; } } //从右边第一个元素开始 循环移除并返回该移除的值 替换一下key后 console.writeline("从右边开始"); while (true) { var getrightvalue = rediscachehelper.instance.listrightpop("leftlistkey"); if (!string.isnullorempty(getrightvalue)) { console.writeline("移除:" + getrightvalue); } else { break; } }
//列表长度 不存在则返回0 var getlength = rediscachehelper.instance.listlength("leftlistkey"); console.writeline("列表长度:" + getlength); //删除list中的元素 并返回删除的个数 不存在则返回0 var getlong = rediscachehelper.instance.listdelrange("leftlistkey", "6"); console.writeline("删除list中的元素,并返回删除的个数:" + getlong); //清空列表 rediscachehelper.instance.listclear("leftlistkey");
使用list类型 模拟用户并发抢购商品
//模拟数据 想list类型表中加入一定数量的库存 50个商品 for (int i = 1; i <= 50; i++) { var getvalue = rediscachehelper.instance.listrightpush("orderlist", i.tostring()); //console.writeline("返回结果:" + getvalue); } //模拟创建多个用户 100个用户 list<testredis> testlist = new list<testredis>(); for (int i = 0; i < 100; i++) { testlist.add(new testredis() { uid = (i + 1) }); } //先清空 rediscachehelper.instance.listclear("ordersuccesslist"); //使用list类型模拟并发情况 不用担心库存为负的情况 //模拟多个用户抢购限时商品 100个用户抢50个商品 stopwatch.start(); list<task> tasklist = new list<task>(); foreach (var item in testlist) { var task = task.run(() => { try { //先自减,获取自减后的值 long order_num = -1; long.tryparse(rediscachehelper.instance.listrightpop("orderlist"), out order_num); if (order_num > 0) { //下面执行订单逻辑(这里不考虑业务出错的情况) rediscachehelper.instance.listleftpush("ordersuccesslist", item.uid.tostring()); //记录下单成功的用户 //操作数据库相关逻辑 可以使用“消息队列”或“服务”进行数据库同步操作 console.writeline("用户:" + item.uid + ",抢到了商品:" + order_num); } else { console.writeline("商品已经被抢光了,用户" + item.uid + "未抢到"); } } catch (exception ex) { console.writeline(ex.message); throw; } }); tasklist.add(task); } task.waitall(tasklist.toarray()); stopwatch.stop(); console.writeline("模拟并发场景消耗时间:" + stopwatch.elapsedmilliseconds.tostring());
最后附上helper
/// <summary> /// 在列表头部插入值。如果键不存在,先创建再插入值 /// </summary> /// <param name="rediskey"></param> /// <param name="redisvalue"></param> /// <returns></returns> public long listleftpush(string rediskey, string redisvalue, int db = -1) { var _db = getdatabase(db); return _db.listleftpush(rediskey, redisvalue); } /// <summary> /// 在列表尾部插入值。如果键不存在,先创建再插入值 /// </summary> /// <param name="rediskey"></param> /// <param name="redisvalue"></param> /// <returns></returns> public long listrightpush(string rediskey, string redisvalue, int db = -1) { var _db = getdatabase(db); return _db.listrightpush(rediskey, redisvalue); } /// <summary> /// 在列表尾部插入数组集合。如果键不存在,先创建再插入值 /// </summary> /// <param name="rediskey"></param> /// <param name="redisvalue"></param> /// <returns></returns> public long listrightpush(string rediskey, ienumerable<string> redisvalue, int db = -1) { var _db = getdatabase(db); var redislist = new list<redisvalue>(); foreach (var item in redisvalue) { redislist.add(item); } return _db.listrightpush(rediskey, redislist.toarray()); } /// <summary> /// 移除并返回存储在该键列表的第一个元素 反序列化 /// </summary> /// <param name="rediskey"></param> /// <returns></returns> public t listleftpop<t>(string rediskey, int db = -1) where t : class { var _db = getdatabase(db); return jsonconvert.deserializeobject<t>(_db.listleftpop(rediskey)); } /// <summary> /// 移除并返回存储在该键列表的最后一个元素 反序列化 /// 只能是对象集合 /// </summary> /// <param name="rediskey"></param> /// <returns></returns> public t listrightpop<t>(string rediskey, int db = -1) where t : class { var _db = getdatabase(db); return jsonconvert.deserializeobject<t>(_db.listrightpop(rediskey)); } /// <summary> /// 移除并返回存储在该键列表的第一个元素 /// </summary> /// <typeparam name="t"></typeparam> /// <param name="rediskey"></param> /// <param name="db"></param> /// <returns></returns> public string listleftpop(string rediskey, int db = -1) { var _db = getdatabase(db); return _db.listleftpop(rediskey); } /// <summary> /// 移除并返回存储在该键列表的最后一个元素 /// </summary> /// <typeparam name="t"></typeparam> /// <param name="rediskey"></param> /// <param name="db"></param> /// <returns></returns> public string listrightpop(string rediskey, int db = -1) { var _db = getdatabase(db); return _db.listrightpop(rediskey); } /// <summary> /// 列表长度 /// </summary> /// <param name="rediskey"></param> /// <param name="db"></param> /// <returns></returns> public long listlength(string rediskey, int db = -1) { var _db = getdatabase(db); return _db.listlength(rediskey); } /// <summary> /// 返回在该列表上键所对应的元素 /// </summary> /// <param name="rediskey"></param> /// <returns></returns> public ienumerable<string> listrange(string rediskey, int db = -1) { var _db = getdatabase(db); var result = _db.listrange(rediskey); return result.select(o => o.tostring()); } /// <summary> /// 根据索引获取指定位置数据 /// </summary> /// <param name="rediskey"></param> /// <param name="start"></param> /// <param name="stop"></param> /// <param name="db"></param> /// <returns></returns> public ienumerable<string> listrange(string rediskey, int start, int stop, int db = -1) { var _db = getdatabase(db); var result = _db.listrange(rediskey, start, stop); return result.select(o => o.tostring()); } /// <summary> /// 删除list中的元素 并返回删除的个数 /// </summary> /// <param name="rediskey">key</param> /// <param name="redisvalue">元素</param> /// <param name="type">大于零 : 从表头开始向表尾搜索,小于零 : 从表尾开始向表头搜索,等于零:移除表中所有与 value 相等的值</param> /// <param name="db"></param> /// <returns></returns> public long listdelrange(string rediskey, string redisvalue, long type = 0, int db = -1) { var _db = getdatabase(db); return _db.listremove(rediskey, redisvalue, type); } /// <summary> /// 清空list /// </summary> /// <param name="rediskey"></param> /// <param name="db"></param> public void listclear(string rediskey, int db = -1) { var _db = getdatabase(db); _db.listtrim(rediskey, 1, 0); }
黄山市民网:https://www.huangshanshimin.com/