1. 程式人生 > >redis簡單使用

redis簡單使用

pool sta lock 關註 png 個人 關機 支持 叠代

目錄:

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