python+redis简单实现发红包程

发布时间:2019-05-21 21:23:37编辑:auto阅读(1950)

    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))

    这里的代码没有一点点的难度,仔细看都看得懂得。我就不做解释了。

    想获取程序源代码,请点击获取

关键字