redis是什麼? Redis 是一個高性能的key-value資料庫! 想進一步瞭解請移步搜索引擎自行查找。 編寫這個小程式的目的就是對redis進行一個簡單的小操作,對redis有一個初步的瞭解,並未有什麼高大尚的騷操作,適合小白閱讀。 程式共分為三個部分。 1.創建紅包 2.將紅包存儲到資料庫 ...
redis是什麼?
Redis 是一個高性能的key-value資料庫!
想進一步瞭解請移步搜索引擎自行查找。
編寫這個小程式的目的就是對redis進行一個簡單的小操作,對redis有一個初步的瞭解,並未有什麼高大尚的騷操作,適合小白閱讀。
程式共分為三個部分。
1.創建紅包
2.將紅包存儲到資料庫
3.取出紅包
1.創建紅包
首先需要確定創建紅包需要哪些參數。
1.紅包的最小金額0.01
2.紅包的數量
3.紅包總金額
4.紅包需要一個ID號(存儲資料庫的時候需要使用)
5.每個紅包的金額
1 def __init__(self): 2 self.min = 0.01 # 紅包最小金額 3 self.nums = 1 # 紅包數量 4 self.money = 0 # 紅包總金額 5 self.ID = [] # 為每一個紅包分配一個ID號。 6 self.evePm = [] # 每個紅包的分配金額
輸入紅包總金額和紅包數量這裡需要進行判斷(避免出現平均金額小於0.01的尷尬局面)
while self.money / self.nums < 0.01: self.money = float(input("請輸入紅包金額:")) self.nums = int(input("請輸入紅包數量:")) if self.money / self.nums < 0.01: print("輸入不符合紅包規則,請重新輸入")
這裡需要提示一下,在獲取金額和數量的是時候一定要進行類型轉換,否則會報類型錯誤。
有了金額和紅包數量就可以進行紅包金額的分配了。這裡就難住了我,紅包的金額要怎麼分配呢。於是我就在網上進行了查找,不查不知道,一查真奇妙。分發紅包的演算法還是蠻複雜的。所以我為了省時省力就選擇了一個比較馬虎的方法。雖然對於小白也不是一下子就能看懂的,但是慢慢讀還是能看懂的。
for i in range(self.nums): # 簡單的紅包分配計算方法 if i != self.nums-1: safe_total = (self.money - (self.nums - i) * self.min) / (self.nums - i) # 隨機安全上限 evemoney = random.randint(self.min * 100, int(safe_total * 100)) / 100 self.money -= evemoney else: evemoney = round(self.money, 2) # 精確到小數點後兩位 self.evePm.append(evemoney)
在紅包分配的時候有幾個地方需要註意。第一個是利用這個計算方法分配紅包時一定要有判斷,因為如果沒有判斷,而是直接算出每個紅包的金額,你會發現所有紅包的金額加起來不等於總紅包金額。原因也是隨機數惹的禍。第二個雖然進行了判斷,但是當紅包金額有點大時,最後一個紅包的金額會精確到小數點後好多位。這是很多語言都有的問題。那麼就要強制精確到後兩位。這樣還是總金額嘛?放心,是的。
將紅包發送到資料庫(有關redis安裝請參考其他技術博客)
pool = redis.ConnectionPool(host='127.0.0.1', password='') # 創建redis連接池 r = redis.Redis(connection_pool=pool) # 創建redis連接
全局創建redis連接池
self.ID = [i for i in range(self.nums)] # 為每一個紅包分配id red_dic = zip(self.ID, self.evePm) # 將id號與紅包進行綁定 # for i, j in red_dic: # print("id:{} 金額:{}".format(i, j)) for i, j in red_dic: r.set(i, j)
將紅包數據存儲到資料庫
用戶取紅包
def __init__(self, nums): self.ID = [] # 每個人的id self.nums = nums # 紅包個數 def get_red(self): pnums = int(input("請輸入有多少人參與搶紅包:")) self.ID = [i for i in range(pnums)] random.shuffle(self.ID) # 將id進行隨機打亂,模擬搶紅包前後順序 if pnums > self.nums: # 紅包數小於人數 for i in range(pnums): if i < self.nums: print("id為{}的用戶搶到了{}元".format(self.ID[i], r.get(i).decode("utf-8"))) else: print("id為{}的用戶未搶到紅包".format(self.ID[i])) else: for j in range(pnums): print("id為{}的用戶搶到了{}元".format(self.ID[j], r.get(j).decode("utf-8"))) print("還有{}個紅包未被搶".format(self.nums - pnums))
這裡的代碼沒有一點點的難度,仔細看都看得懂得。我就不做解釋了。
想獲取程式源代碼,請點擊獲取