redis是什么?

  Redis 是一个高性能的key-value数据库!

  想进一步了解请移步搜索引擎自行查找。

编写这个小程序的目的就是对redis进行一个简单的小操作,对redis有一个初步的了解,并未有什么高大尚的骚操作,适合小白阅读。

程序共分为三个部分。

  1.创建红包

  2.将红包存储到数据库

  3.取出红包

1.创建红包

  首先需要确定创建红包需要哪些参数。

  1.红包的最小金额0.01

  2.红包的数量

  3.红包总金额

  4.红包需要一个ID号(存储数据库的时候需要使用)

  5.每个红包的金额

 def __init__(self):
self.min = 0.01 # 红包最小金额
self.nums = 1 # 红包数量
self.money = 0 # 红包总金额
self.ID = [] # 为每一个红包分配一个ID号。
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))

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

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

python+redis简单实现发红包程序的更多相关文章

  1. 用Python编写简单的发红包程序和计算器原理

    用Python编写简单的发红包程序: 第一种解法:数轴方法解决 import random def red_packet(money,num): money = money * 100 #将钱数转换成 ...

  2. 使用PHP编写发红包程序

    使用PHP编写发红包程序 http://www.jb51.net/article/69815.htm 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2015-07-22   微信发红 ...

  3. Python redis 简单介绍

    Python redis 简单介绍 1.安装 终端输入: pip(or)pip3.6 install redis 安装成功 2.哈哈,发现我并没有redis服务可以访问,所以到这里,在本机安装了red ...

  4. php简单随机实现发红包程序

    前言: 使用PHP发红包,当我们输入红包数量和总金额后,PHP会根据这两个值进行随机分配每个金额,保证每个人都能领取到一个红包,每个红包金额不等,就是要求红包金额要有差异,所有红包金额总额应该等于总金 ...

  5. PHP实现发红包程序

    我们先来分析下规律. 设定总金额为10元,有N个人随机领取: N=1 第一个 则红包金额=X元: N=2 第二个 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数. 第 ...

  6. PHP实现发红包程序(helloweba网站经典小案例)

    我们先来分析下规律. 设定总金额为10元,有N个人随机领取: N=1 第一个 则红包金额=X元: N=2 第二个 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数. 第 ...

  7. PHP发红包程序限制红包的大小

    我们先来分析下规律. 设定总金额为10元,有N个人随机领取: N=1 第一个 则红包金额=X元: N=2 第二个 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数. 第 ...

  8. python:redis简单操作

    一,安装redis-py pip install redis easy_install redis 二,简单用法 import redis # 连接redis服务器 def conn_redis(): ...

  9. python,redis简单订阅

    python连接redis import redis r =redis.Redis(host='192.168.199.11',port = 6379 ,db = 0) r.publish('chan ...

随机推荐

  1. Spring Boot使用@Async实现异步调用:自定义线程池

    前面的章节中,我们介绍了使用@Async注解来实现异步调用,但是,对于这些异步执行的控制是我们保障自身应用健康的基本技能.本文我们就来学习一下,如果通过自定义线程池的方式来控制异步调用的并发. 定义线 ...

  2. lucene使用与优化

    lucene使用与优化 1 lucene简介 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿 ...

  3. Linux 下创建 sftp 用户并限定目录

    Linux 下创建 sftp 用户并限定目录 1.创建 sftpUser 用户组 [root@XXX ~]# groupadd sftpUser 2.创建 sftpUser 用户并指定目录 [root ...

  4. python socket 编程简单入门

    想讲讲套接字的概念 套接字,即英文socket的中文意译,起源于20世纪70年代,是加利福利亚大学的伯克利版本UNIX(称为BSD UNIX)的一部分.目的是实现主机上运行的一个程序与另一个运行的程序 ...

  5. vue教程3-04 vue.js vue-devtools 调试工具的下载安装和使用

    vue教程3-04 vue.js vue-devtools vue调试工具的安装和使用 一.vue-devtools 下载与安装 1.需要 fan qiang 2.打开谷歌浏览器设置--->扩展 ...

  6. Oracle 扩展表空间大小的几种方式

    环境:windows操作系统 增加表空间大小的四种方法Meathod1:给表空间增加数据文件 ALTER TABLESPACE app_data ADD DATAFILE 'D:\ORACLE\PRO ...

  7. Delphi:程序自己删除自己,适用于任何windows版本(含源码)

    Delphi:程序自己删除自己,适用于任何windows版本(含源码) function Suicide: Boolean; var   sei: TSHELLEXECUTEINFO;   szMod ...

  8. Oracle死锁查询及批量处理

    一.数据库死锁的现象程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错. 二.死锁的原理当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做 ...

  9. C#:使用HtmlAgilityPack解析Html

    推荐阅读: HtmlAgilityPack 入门教程1 HtmlAgilityPack入门教程2 向HtmlAgilityPack道歉:解析HTML还是你好用 获取html中meta标签中的conte ...

  10. C# 自定义类型通过实现IFormattable接口,来输出指定的格式和语言文化的字符串(例:DateTime)

    常规的调用ToString()方法,存在两个问题. (1).调用者无法控制字符串的格式 (2).调用者不能方便的选择一种特定的语言文化来格式化字符串. 在开发一些国际化的应用时,应用程序需要调用与当前 ...