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簡單使用