python的redis簡單使用

安裝的Python版本 3.6.1redis

redis安裝的2.8數據庫

安裝redis模塊服務器

pip install redis

簡單使用網絡

redis-test.py性能

import redis
r=redis.Redis(host='127.0.0.1',port=6609,db=0)
r.set('name','baby')
print(r.get('name'))
print(r.dbsize())

使用connection pool來管理對一個redis server的全部鏈接,避免每次創建、釋放鏈接的開銷。spa

默認,每一個Redis實例都會維護一個本身的鏈接池。code

能夠直接創建一個鏈接池,而後做爲參數 Redis,這樣就能夠實現多個Redis實例共享一個鏈接池server

使用鏈接池對象

import redis
 pool = redis.ConnectionPool(host='127.0.0.1',port=6609)
 r = redis.Redis(connection_pool=pool)
 r.set('name1','lili')
 print(r.get('name1'))

 

應用:頁面點擊數blog

  須要對一系列頁面記錄點擊次數,若是使用關係數據庫來存儲點擊,可能存在大量的行級鎖爭用

  (1)當redis服務器啓動時,能夠從關係數據庫讀入點擊數的初始值

import redis
r=redis.Redis(host='127.0.0.1',port=6609,db=0)
r.set('visits:100',999)

  (2)有人訪問頁面時

r.incr('visits:100')

  (3)獲取頁面點擊數

r.get('visits:100')

Pipeline 是 StrictRedis 類的子類,支持在一個請求裏發送緩衝的多個命令。經過減小客戶端和服務器之間往來的數據包,能夠大大提升命令組的性能

簡單使用

複製代碼

>>>import redis 
>>>r=redis.Redis(host='127.0.0.1',port=6609,db=0)
>>> r.set('name', 'baby')
>>> pipe = r.pipeline()
>>> pipe.set('birthday', '2010')
>>> pipe.get('name')
>>> pipe.execute()

複製代碼

爲了方便使用,全部緩衝到 pipeline 的命令返回 pipeline 對象自己

調用能夠鏈接起來

>>> pipe.set('name', 'baby').set('birthday', '2010').get('name').execute()

pipeline 也能夠保證緩衝的命令組作爲一個原子操做

要使用命令緩衝,但禁止pipeline 的原子操做屬性,關掉 transaction

pipe = r.pipeline(transaction=False)

WATCH 命令提供了在開始事務前監視一個或多個鍵

這些鍵中的任何一個在執行事務前發生改變,整個事務就會被取消並拋出 WatchError 異常

複製代碼

import redis
import time
r=redis.Redis(host='127.0.0.1',port=6609,db=0)
sellerid = 101
itemid = 101
price = 50
print(time.time())
def list_item(r,itemid,sellerid,price):
    inventory = "inventory:%s"%sellerid
    item = "%s.%s"%(itemid,sellerid)
    end = time.time()+5
    pipe = r.pipeline()
    while time.time()<end:
        try:
            pipe.watch(inventory)
            if not pipe.sismember(inventory,itemid):
                pipe.unwatch()
                return None
            pipe.multi()
            pipe.zadd("market:",item,price)
            pipe.srem(inventory,itemid)
            pipe.execute()
            return True
        except redis.exceptions.WatchError:
            pass
        return False
        
list_item(r,itemid,sellerid,price)

複製代碼

redis只會在數據已經被其餘客戶端搶先修改了的狀況下,通知執行了WATCH命令的客戶端,即--樂觀鎖

而關係型數據庫執行的加鎖操做爲悲觀鎖,這種方式下持有鎖的客戶端運行越慢,等待解鎖的客戶端被阻塞的時間越長

1

事務由命令MULTI命令啓動,而後須要傳遞一個應該在事務中執行的命令列表,而後整個事務由EXEC命令執行

若是在watch後值被修改,在執行pipe.execute()的時候會報異常WatchError: Watched variable changed

redis只會在本身的事務執行失敗時重試

流水線:一次性發送多個命令,而後等待全部回覆出現。能夠經過減小客戶端與redis服務器之間的網絡通訊次數來提高redis在執行多個命令時的性能

相關文章
相關標籤/搜索