奥运网站模板,桐城住房建设网站,网站建设流程及费用,建站都需要什么曾管理一万多台快递柜#xff0c;优化了系统中生成唯一取件码的算法。项目#xff1a;https://github.com/nnhy/PickupCode新建项目#xff0c;添加 Nuget 应用 NewLife.Redis #xff0c;借助其Add去重能力。代码如下#xff1a;private static void Main(string[] args)…曾管理一万多台快递柜优化了系统中生成唯一取件码的算法。项目https://github.com/nnhy/PickupCode新建项目添加 Nuget 应用 NewLife.Redis 借助其Add去重能力。代码如下private static void Main(string[] args)
{XTrace.UseConsole();var redis new FullRedis(127.0.0.1, null, 3);var stationCode 2743;for (int i 0; i 8; i){var code BuildPickupCode(redis, stationCode);XTrace.WriteLine(取件码{0}{1}, i 1, code);}
}/// summary为站点生成唯一取件码/summary
/// param namecacheredis确保48小时不重复/param
/// param namestationCode站点编码/param
/// returns/returns
/// exception crefArgumentNullException/exception
/// exception crefException/exception
static string BuildPickupCode(ICache cache, string stationCode)
{if (stationCode.IsNullOrEmpty()) throw new ArgumentNullException(nameof(stationCode));var rnd new Random();for (int i 0; i 10; i){// 生成6位随机数作为取件码不足6位时前面补0var code rnd.Next(100000, 1000000).ToString().PadLeft(6, 0);// 站点结合取件码作为唯一keyRedis去重确保48小时内不重复。如果重复再生成一次新的随机数var key ${stationCode}:{code};if (cache.Add(key, code, 48 * 3600)) return code;}// 连续10次都失败就有可能是redis网络或代理有问题了throw new Exception(Build PickupCode Error!);
}运行效果原理比较简单借助Redis的SETNX能力当key不存在时添加已存在时不改变已有值。SETNX的返回值0和1表示是否添加成功。在NewLife.Redis中redis.Add即是SETNX的封装如果添加成功说明这个随机取件码可用反之则生成新的随机取件码。Add第二个参数意义不大第三个参数表示有效期这里使用48小时。也就是说这个key在48小时后将会自动消失该取件码将有可能重新生成用于新的快递。实际运营中这个有效时间也可能是5到7天。最后吐槽一下很多快递柜的8位取件码实在不利于快速记忆不利于便捷输入。如果使用6位大多数人看一次默念一下即可完成输入