Redis数据类型之列表操作
redis
目录:
1、自动分配(redis)
- 批量导入
2、微信自动绑定
3、django的ORM做不了的操作,怎么自定义操作数据库
extra
’
4、报表
公司每个月销售的业绩
5、权限
=================================
1、自动分配、你在什么时候用到了自动分配?
答:市场部或运营部招来的新的客户,单条(批量)录入数据的时候,进行自动分配。
2、那你们是怎么自动分配的呢?
答:基于redis的列表实现的。相当于队列用了。
====================================
一、自动分配(redis)
数据放缓存了,为的是速度快
redis是支持持久化的,如果关机了以后,数据已经会放在文件里了
先买上一台电脑:装上redis服务器软件
- 这个服务器有个工网IP:47.93.4.198
- 端口:6379
我们的电脑:装上链接redis的模块
- pip instaill redis
redis:说白了就是一个服务器的一个软件,帮助我们在内存里面存数据
conn.lpush("names":"sss") #往里边放入值
conn.lpush("names":*[地方法规","dfgdf"]) #放多个值 ,从左边添加,相当于insert
conn.rpush("names":*[地方法规","dfgdf"]) #放多个值 ,从后面添加,相当于append
conn.lpop("names") #一个一个从里面取值 ,bytes类型
conn.rpop("names") #从里面取值 ,bytes类型
conn.llen("names") #查看长度
import redis
conn = redis.Redis(host="192.168.20.150",port=6379)
#===========对于字符串用set,get设置,得到值===========
conn.set("k13","v2") #向远程redis中写入了一个键值对
val = conn.get("k13") #获取键值对
print(val)
conn.set("names","ss")
val2 = conn.get("names")
print(val2) #===========对于列表的操作: lpush操作和lpop操作,(从左边放值,从左边取值)=============
val4 = conn.lpush("names_s",*["海燕","刘伟"])
conn.lpush('names_s',*['把几个','鲁宁']) #'鲁宁','把几个',"刘伟","海燕",
conn.delete("names_s")
v = conn.llen("names_s")
print(conn.llen("names_s")) #4
for i in range(v):
print(conn.lpop("names_s").decode("utf-8")) # ==========对于列表的操作: rpush操作和rpop操作,(从右边放值,从右边取值)======
conn.rpush("abcd",[1,2,3])
conn.rpush("abcd",*["a","b","c"]) #[1,2,3],a,b,c #*代表是解包,如果不加*,放进去的就是一个列表
# conn.delete("abcd")
v = conn.llen("abcd")
# print(v) #
for i in range(v):
print(conn.rpop("abcd").decode("utf-8")) #c,b,a,[1,2,3]
在项目中应用
链接redis,吧所有的数据列表放在redis里,吧回滚的也放在redis里面
原来是迭代器一个一个取值,现在我们可以用链接redis,rpop一个一个取值
当出问题回滚的时候(或者没有使用),我们可以用rpush吧它再添加进去,然后在取出来
conn.lindex("said_id_list_origin",0) #查看索引0对应的值
第一次运行,只有数据库有数据
如果数据库中没有取到值,那么直接返回None
接下来一个一个获取,如果取到了None,已经取完,再把备用的列表里面的数据在放回去
分配表里面的数据如果更新的话就需要重置了。
import redis
from crm import models POOL = redis.ConnectionPool(host='47.93.4.198', port=6379, password='123123')
CONN = redis.Redis(connection_pool=POOL) class AutoSale(object): @classmethod
def fetch_users(cls):
# [obj(销售顾问id,num),obj(销售顾问id,num),obj(销售顾问id,num),obj(销售顾问id,num),]
sales = models.SaleRank.objects.all().order_by('-weight') sale_id_list = []
count = 0
while True:
flag = False
for row in sales:
if count < row.num:
sale_id_list.append(row.user_id)
flag = True
count += 1
if not flag:
break if sale_id_list:
CONN.rpush('sale_id_list', *sale_id_list) # 自动pop数据
CONN.rpush('sale_id_list_origin', *sale_id_list) # 原来的数据
return True
return False @classmethod
def get_sale_id(cls):
# 查看原来数据是否存在
sale_id_origin_count = CONN.llen('sale_id_list_origin')
if not sale_id_origin_count:
# 去数据库中获取数据,并赋值给: 原数据,pop数据
status = cls.fetch_users()
if not status:
return None user_id = CONN.lpop('sale_id_list')
if user_id:
return user_id reset = CONN.get('sale_id_reset')
# 要重置
if reset:
CONN.delete('sale_id_list_origin')
status = cls.fetch_users()
if not status:
return None
CONN.delete('sale_id_reset')
return CONN.lpop('sale_id_list')
else:
ct = CONN.llen('sale_id_list_origin')
for i in range(ct):
v = CONN.lindex('sale_id_list_origin', i)
CONN.rpush('sale_id_list', v)
return CONN.lpop('sale_id_list') @classmethod
def reset(cls):
CONN.set('sale_id_reset',1) @classmethod
def rollback(cls,nid):
CONN.lpush('sale_id_list',nid)
总结:
1、什么是redis?
2、set,get对字符串做操作的,
3、lpush,rpush,lpop,rpop对于列表做操作的
lindex:取索引
llen() :长度
4、 delete :删除 :公共的
扩展:
redis和我们的数据库一样,不能每次都链接,redis支持连接池
不推荐
推荐:
二、批量导入
上传excel文件,页面上显示
上传文件
1、拿到文件名和文件大小
file_obj.field_name: 文件名,
file_obj.size :文件大小
2、打开文件读取,以写的方式存起来
3、安装xlrd-1.1.0的两种方式
python setup.py build
pip instail xlrd
4、打开excle文件做操作。拿到每一个单元格的数据,写入数据库
吧第一行排除,可以吧列表转换成字典,录入到数据库
5、练习
自动获取ID
录入客户表
录入分配表
不在创建临时xlsx文件,写在内存里面,
写上一个模板文件,让用户去下载
6、文件,用户下载文件的两种方式
吧文件写在静态文件里面,用a标签去跳转。但是这种当是可能不行
设置响应头(搜索django如何实现文件下载)
三、微信自动绑定
前提:公司里的每一个人都得关注公众号,才可以给推送消息
Redis数据类型之列表操作的更多相关文章
- redis数据类型及订阅操作
Redis数据类型详解 Redis键/值介绍 Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如“foo”的简单字符串到一个JPG文件的内容都可以.空字符串也是有效k ...
- Redis数据类型之列表(list)
1. 什么是列表 redis的列表使用双向链表实现,往列表中放元素的时候复杂度是O(1),但是随机访问的时候速度就不行了,因为需要先遍历到指定的位置才可以取到元素. 既然列表是使用链表实现的,那么就说 ...
- Redis数据类型之列表List
Redis列表简介 Redis列表是简单的字符串列表,一个列表最多可以包含 232 - 1 个元素.列表按照插入顺序排序,可以从列表的头部或者尾部添加元素 上图演示了使用LPUSH向列表中插入元素,并 ...
- 【Redis学习之五】Redis数据类型:列表和散列
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-2.8.18 一.列表 基于Linked Lis ...
- redis 数据类型之列表
1.lpush lpush(name,values) # 在name对应的list中添加元素,每个新的元素都添加到列表的最左边 # 如: # conn.lpush('oo', 11,22,33) # ...
- Redis数据类型之散列表
Redis五大数据类型以及操作 目录: 一.redis的两种链接方式 二.redis的字符串操作(string) 三.redis的列表操作(list) 四.redis的散列表操作(类似于字典里面嵌套字 ...
- Redis五大数据类型的常用操作
在上一篇博文<centos安装redis>中,已经详细介绍了如何在centos上安装redis,今天主要介绍下Redis五大数据类型及其五大数据类型的相关操作. Redis支持五种数据类型 ...
- 缓存数据库-redis数据类型和操作(list)
转: 狼来的日子里! 奋发博取 缓存数据库-redis数据类型和操作(list) 一:Redis 列表(List) Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素导列表的头部( ...
- Redis系列(二):Redis的数据类型及命令操作
原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...
随机推荐
- oracle 12 安装
oracle 12 第二版本安装 下载地址 https://www.oracle.com/technetwork/cn/middleware/webcenter/content/downloads/ ...
- python3.6+RF连接mysql
接口自动化中会遇到有操作数据库的动作 目录 1.安装第三方库 2.安装pymysql 3.数据库操作 1.安装第三方库 使用在线安装:pip install robotframework_databa ...
- python爬虫常用的库
1,请求:requests requests.get(url, headers) requests.post(url, data=data, files=files) urllib模块: Py ...
- SSH整合项目----在线商城
1.1 网上商城需求分析 1.1.1 前台:用户模块. 注册: * JS非空校验.(不是必须) * Struts2数据校验:在注册Action类同一包下新建UserAction-user_reg ...
- Linux文件目录的权限
权限对文件的重要性:(主要是针对文件的内容而言,与文件名没有关系) r: 可读取此文件的实际内容. w: 可以编辑.新增或者修改该文件的内容(但不能删除该文件) x: 该文件具有可以被系统执行的权限. ...
- Angular5 父组件获取子组件实例( ViewChildren、ViewChild用法)
原文链接 Understanding ViewChildren, ContentChildren, and QueryList in Angular 使用场景 有时候,我们想要在父组件中访问它的子组件 ...
- [Python3] 028 常用模块 datetime
目录 datetime 1. datetime.date 2. datetime.time 3. datetime.datetime 4. datetime.timedelta 补充 datetime ...
- WebMagic 抓取图片并保存至本地
1.近期接触到java 爬虫,开源的爬虫框架有很多,其中WebMagic 是国产的,文档也是中文的,网上资料很多,便于学习,功能强大,可以在很短时间内实现一个简单的网络爬虫.具体可参考官网 http: ...
- 小记---------FLUM的三种配置方式:spooldir、exec、hadoop sink
FLUM概述 是一个分布式的数据收集系统,具有高可靠.高可用.事务管理.失败重启等功能,数据处理速度快,完全可以用于生产环境 核心:agent(是FLUM的一个代号,名字 ).age ...
- python requests的content和text方法的区别【转】
requests对象的get和post方法都会返回一个Response对象,这个对象里面存的是服务器返回的所有信息,包括响应头,响应状态码等.其中返回的网页部分会存在.content和.text两个对 ...