快速生成快遞柜唯一取件碼

曾管理一萬多臺快遞柜,優化了系統中生成唯一取件碼的算法。

項目: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.pswp.cn/news/282278.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282278.shtml
英文地址,請注明出處:http://en.pswp.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…