快速生成快递柜唯一取件码

曾管理一万多台快递柜,优化了系统中生成唯一取件码的算法。

项目: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 name="cache">redis确保48小时不重复</param>
/// <param name="stationCode">站点编码</param>
/// <returns></returns>
/// <exception cref="ArgumentNullException"></exception>
/// <exception cref="Exception"></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');// 站点结合取件码作为唯一key,Redis去重确保48小时内不重复。如果重复再生成一次新的随机数var key = $"{stationCode}:{code}";if (cache.Add(key, code, 48 * 3600)) return code;}// 连续10次都失败,就有可能是redis网络或代理有问题了throw new Exception("Build PickupCode Error!");
}

运行效果

45186c722707e74e8dc17d725eec3399.png

原理比较简单,借助Redis的SETNX能力,当key不存在时添加,已存在时不改变已有值。

SETNX的返回值0和1表示是否添加成功。

在NewLife.Redis中redis.Add即是SETNX的封装,如果添加成功,说明这个随机取件码可用,反之则生成新的随机取件码。

Add第二个参数意义不大,第三个参数表示有效期,这里使用48小时。也就是说,这个key在48小时后将会自动消失,该取件码将有可能重新生成用于新的快递。实际运营中,这个有效时间也可能是5到7天。

最后吐槽一下,很多快递柜的8位取件码,实在不利于快速记忆,不利于便捷输入。如果使用6位,大多数人看一次默念一下,即可完成输入!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动调试自动编译五分钟上手

Browsersync能让浏览器实时、快速响应您的文件更改&#xff08;html、js、css、sass、less等&#xff09;并自动刷新页面。更重要的是 Browsersync可以同时在PC、平板、手机等设备下进项调试。 无论您是前端还是后端工程师&#xff0c;使用它将提高您30%的工作效率。 MD5加密&a…

六台机器搭建RedisCluster分布式集群

一、RedisCluster结构二、redis Cluster集群搭建1、修改redis.conf中需要更改的配置 bind 改成当前ip cluster-enabled yes #允许redis集群 cluster-config-file nodes-6379.conf #集群配置文件 cluster-node-timeout 15000 #集群中节点允许失联的最大时间15s 注&#xff1…

C# 的 async/await 其实是stackless coroutine

注&#xff1a; 最近Java 19引入的虚拟线程火热&#xff0c;还有很多人羡慕 go的 coroutine&#xff0c;很多同学一直有一个疑问&#xff1a; C# 有 虚拟线程或者 coroutine吗&#xff0c;下面的这个回答可以解决问题。这里节选的是知乎上的hez2010 的高赞回答&#xff1a;http…

推荐使用typora

最近在网上接触到一款全新的markdown写作工具——typora。 现在它已经是我的主要写作工具了。 甚至我也也会利用它安排自己的工作和任务。 typora介绍 下载链接特色&#xff1a;可以即时渲染markdown语法的书写工具总算找到了&#xff0c;终于不用再纠结发生语法错误&#xff0…

中文词频统计

import jiebafoopen(text.txt,r,encodingutf-8)tfo.read()fo.close() wordsjieba.cut(t)dic{}for w in words: if len(w)1: continue else: dic[w]dic.get(w,0)1wc list(dic.items())wc.sort(keylambda x:x[1],reverse True)for i in range(20): print(wc[i]) 转载于:https:/…

实现html锚点的两种方式

1&#xff0c;a标签name属性。 2&#xff0c;使用标签的id属性&#xff1b;

mysql实现读写分离

一、环境介绍&#xff1a; LNMP vmware workstation pro配置了3个虚拟机&#xff0c;均安装了LNMP环境&#xff1a; Pro &#xff1a;192.168.0.105 Pro2&#xff1a;192.168.0.106 Pro3&#xff1a;192.168.0.107 二、Mysql主从复制同步的实现 https://blo…

[BZOJ1509][NOI2003]逃学的小孩

1509: [NOI2003]逃学的小孩 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 968 Solved: 489[Submit][Status][Discuss]Description Input 第一行是两个整数N&#xff08;3  N  200000&#xff09;和M&#xff0c;分别表示居住点总数和街道总数。以下M行&#xff0c;每行…

十一随笔|读书

十一放假回老家前三天一直下雨&#xff0c;没法帮父母干农活&#xff0c;阴雨天气农村就闲下来了亲戚间走动&#xff0c;长辈们谈论孩子不好好学习&#xff0c;孩子抱怨学习没用大学毕业照样找不到工作。现在大学生就业现状确实不容乐观&#xff0c;当下不好好学习没有拖底&…

yii之behaviors

BaseController: protected $actions [*];protected $except [];protected $mustlogin [];protected $verbs [];// 行为过滤public function behaviors(){return [access > [class > \yii\filters\AccessControl::className(),only > $this->actions, // 针对哪…

关闭 Visual Studio 2013 的 Browser Link 功能

什么是 Browser Link ? 这个 Browser Link 的功能就是通过一个脚本文件架起流程器和 Visual Studio IDE 之前的一个通信桥梁&#xff0c; 在启用 Browser Link 后&#xff0c; Visual Studio 会给网站注入一个 IHttpModule 模块对象&#xff0c; 然后在每个页面都会注册一段上…

Groove list操作-转数组,collect,each等

2019独角兽企业重金招聘Python工程师标准>>> list转换为数组 List list [a,b,c,d] def strs list as String[] println strs[0] 使用了Groovy语言&#xff0c;就能时不时的感受到Groovy语言在编码风格上与Java语言的不同。当然&#xff0c;我们首先感受到的可能就…

支持多种操作系统的新一代服务主机

一个应用需要常驻操作系统后台服务&#xff0c;可选框架有WindowsServiceLifeTime和SystemdLifeTime&#xff0c;但需要区别对待不同操作系统且需要另外写命令安装。NewLife.Agent自2008年设计以来&#xff0c;一直秉着简单易用的原则&#xff0c;不仅实现了服务框架&#xff0…

c#中的奇异递归模式

奇异递归模式&#xff0c;Curiously Recurring Template Pattern (CRTP) &#xff0c;作用是能使父类中能够使用子类的信息。下面是我对这个问题的分析过程。 按照一般的继承关系&#xff0c;父类是无法访问到子类的&#xff0c;所以很自然的想到了c#中的泛型&#xff0c;将子类…

面试中get和post的区别

get和post的区别主要有以下几方面&#xff1a;1、url可见性&#xff1a; get&#xff0c;参数url可见&#xff1b; post&#xff0c;url参数不可见2、数据传输上&#xff1a; get&#xff0c;通过拼接url进行传递参数&#xff1b; post&#xff0c;通过body体传输参数3、缓存性…

程序猿与线性代数

逛微博&#xff0c;摸到了一堆宝&#xff1a;关于线性代数学习的文章。先是发现了陈晓鸣&#xff08;http://weibo.com/acumon&#xff09;&#xff0c;前百度资深project师&#xff0c;终身学习者。再找到“文艺复兴记”&#xff08;http://weibo.com/weidagang&#xff09;。…

Verilog MIPS32 CPU(八)-- 控制器

Verilog MIPS32 CPU&#xff08;一&#xff09;-- PC寄存器Verilog MIPS32 CPU&#xff08;二&#xff09;-- RegfilesVerilog MIPS32 CPU&#xff08;三&#xff09;-- ALUVerilog MIPS32 CPU&#xff08;四&#xff09;-- RAMVerilog MIPS32 CPU&#xff08;五&#xff09;--…

[翻译]Dapr 长程测试和混沌测试

介绍这是Dapr的特色项目&#xff0c;具体参见&#xff1a;https://github.com/dapr/test-infra/issues/11 &#xff0c;在全天候运行的应用程序中保持Dapr可靠性至关重要。在部署真正的应用程序之前&#xff0c;可以通过在受控的混沌环境中构建&#xff0c;部署和操作此类应用程…

python UDP-数据报协议

基于udp协议通信的套接字 服务端 1 from socket import *2 3 server socket(AF_INET, SOCK_DGRAM) # SOCK_DGRAM>数据报协议4 server.bind((127.0.0.1, 8080))5 6 print(start....)7 while True:8 data, client_addr server.recvfrom(1024) # (bhello, (127.0.0.1, …

Mysql Lost connection to MySQL server at ‘reading initial communication packet', system error: 0

一、问题描述&#xff1a; 在服务器端可以正常连接并操作mysql&#xff0c;但是在windows端使用navicat工具远程ssh连接就出现下面错误。 1、服务器端&#xff1a; 2、windows端navicat连接 3、原因 原来我今天在做主从配置的时候&#xff0c;将 /etc/my.cnf 配置文件中的b…