1. 程式人生 > 實用技巧 >Redis的基本操作

Redis的基本操作

Redis的基本操作

redis普通連線與連線池

# 安裝redis模組
pip install redis

# 普通連線
from redis import Redis
# 建立連線物件
conn = Redis(host='localhost', port=6379)
ret = conn.get('name')

python操作之連線池

# redis使用connection pool來管理對一個redis Server的所有連線,以避免每次建立,釋放連線的開銷。

import redis

POOL = redis.ConnectionPool(host='127.0.0.1',port=6379)
ret = redis.Redis(connection_pool=POOL)
ret.set('name','cherry')
print(ret.get('name'))

# 單例的實現
# redis_pool.py

import redis

POOL = redis.ConnectionPool(host='127.0.0.1',port=6379,max_connections=100) # z造一個池子,最多建立100個連線
ret = redis.Redis(connection_pool=POOL)  # 從連線池中取出一個連線

單例實現方式(模組匯入)

redis_pool.py

import redis

POOL = redis.ConnectionPool(host='127.0.0.1',port=6379,max_connections=100) # z造一個池子,最多建立100個連線

這樣就可以避免每執行一次,就建立一個連線池

# 使用方式(包匯入)
from redis_pool import POOL
import redis

ret = redis.Redis(connection_pool=POOL)  # 從連線池取出一個連線

 注意

如果是執行包內的檔案,在該檔案匯入包內的檔案時,注意不能用‘.’;
在外部使用可以帶點

redis之字串的操作

重點掌握

set操作
def set(self, name, value,ex=None, px=None, nx=False, xx=False, keepttl=False):
    
ex: 過期時間( 秒)
px: 過期時間(毫秒)
nx: 如果設定為True, 當name不存在的時候,set操作才會執行;如果存在,則不會執行。(新增操作)
xx,如果設定為True,則只有name存在時,當前set操作才執行,值存在才能修改,值不存在,不會設定新值。(更新操作)

exp:

conn.set('perfect','surpass',ex=5)   # 設定過期時間5秒
conn.set('sex','Female',nx=True)   # key不存在建立,存在不做任何操作
conn.set('name','cherry1',xx=True) # key存在才更新新值,不存在不做任何操作
get操作
# 獲取值
name = conn.get('name')
mset操作
# 批量設定值
mset(self, mapping)
conn.mset({'name1':'egon','name2':'lqz'})
mget操作
# 批量獲取值
mget(self, keys, *args):

ret = conn.mget(['name1','name2','name3'])  # [b'egon', b'lqz', None]
incr操作
# 應用場景,統計某網站的訪問數量,頁面的訪問量,介面的訪問量
ret = conn.incr('num',amount=1)  # 只要一執行,數字就加1
decr操作
# 應用場景,設計秒殺
ret = conn.decr('num',amount=1) 
 等於
ret = conn.incr('num',amount=1)

瞭解

setnx(name,value)  ==>  set(name,value,nx=True)
setex(name,value,time) ==> set(name,value,ex=5)
psetx(name,time_ms,value)  # 毫秒

# 先獲取值在設定值,將兩次IO操作變為1次
ret = conn.getset('name1','egon_dsb')  # ret  是獲取到的值

# 根據key擷取字串
ret = conn.getrange('name1',0,0)  #  b'e'

# 修改字串內容,從指定字串索引開始向後替換
 ret = conn.setrange('name1',2,'8888') # 從第三個位置開始替換後面的字串

# 獲取name對應的值的二進位制表示中的某位的值 (0或1)
ret = conn.getbit('name1',9)   # 1

# append
在redis name對應的值後面追加內容
ret = conn.append('num','oo')

redis之hash操作

重點掌握

hset操作
hset(self, name, key=None, value=None, mapping=None)

ret = conn.hset('beast','name','huangliang')
ret = conn.hset('beast','name','lqz')   # 直接覆蓋
hget操作
hget(self, name, key)

ret = conn.hget('beast','name2')  # b'lqz'
hmget操作
# 支援傳多個key ,或者傳一個keys的列表
def hmget(self, name, keys, *args):
    "Returns a list of values ordered identically to ``keys``"
    args = list_or_args(keys, args)
    return self.execute_command('HMGET', name, *args)


ret = conn.hmget('beast','name','name2')
ret = conn.hmget('beast',['name','name2'])
hmset操作
# 批量設定多個值
conn.mset({'name1':'egon','name2':'lqz'})
hincrby操作
# 應用場景 個人部落格文章的訪問量
conn.hmset('blog':{'第一篇部落格':'55','第二篇部落格':'66'})

ret = conn.hincrby('blog','第一篇部落格')  # 點選一次,自增一次
hscan_iter操作
# 利用yield封裝hscan建立生成器,實現分批去redis中獲取資料
 
# 引數:
    # match,匹配指定key,預設None 表示所有的key
    # count,每次分片最少獲取個數,預設None表示採用Redis的預設分片個數

ret = conn.hscan_iter('hash3')
print(ret)
for i in ret:
    print(i)

瞭解

# 獲取name對應的hash中所有的key的值
ret = conn.hkeys('hash3')
# 獲取name對應的hash中所有的value的值
ret = conn.hvals('hash3')
# 檢查name對應的hash是否存在當前傳入的key
ret = conn.hexists('hash3','key4')  #  存在作為True,不存在則為False
# 將name對應的hash中指定key的鍵值對刪除
ret = conn.hdel('hash3','key2')  # 
# 獲取name對應的hash中鍵值對的個數
 ret=conn.hlen('hash3')

redis之list操作

重點掌握

lpush操作
# 在name對應的List中新增元素,每個新元素都新增到列表的最左邊 
ret = conn.lpush('list1',1,2,3,4,5)
"""
實現佇列
先進先出
"""
rpush操作
# 在name對應的List中新增元素,每個新元素都新增到列表的最右邊 
ret = conn.rpush('list1',777,888)
"""
實現堆疊
後進先出
"""
blpop操作
訊息佇列(生產者消費者模型)
# block,阻塞操作,可以寫一個超時時間
# 應用場景:分散式爬蟲

ret=conn.blpop('list1',timeout=10)
print(ret)

其他

# lpushx(name,value) 在name對應的list中新增元素,只有name已經存在時,值新增到列表的最左邊
lpushx('list1',888)
# rpushx(name,value) 在name對應的list中新增元素,只有name已經存在時,值新增到列表的最右邊
rpushx('list1',999)
# llen(name)  統計一下name對應list的總長度
ret = conn.llen('list1')

# 在name對應的列表的某一個值前或後插入一個新值
ret = conn.linsert('list1','before','3','88887') # 在‘3’前面插入一條資料
ret = conn.linsert('list1','after','3','18887')  # 在‘3’後面插入一條資料

#  對name對應的list中的某一個索引位置重新賦值
ret = conn.lset('list1','0','1111')

# 在name對應的list中刪除指定的值
def lrem(self, name, count, value):
    """
    The count argument influences the operation in the following ways:
        count > 0: Remove elements equal to value moving from head to tail.
        count < 0: Remove elements equal to value moving from tail to head.
        count = 0: Remove all elements equal to value.
    """
    return self.execute_command('LREM', name, count, value)
ret=conn.lrem('list1',2,'5')   # 從前往後刪除兩個5  (+ 從前往後)
ret=conn.lrem('list1',-1,'5')  # 從後往前刪除1個5   (- 從後往前)
ret=conn.lrem('list1',0,'5')   # 刪除所有5  (0-all)

# 在name對應的列表的左側獲取第一個元素並在列表中移除,返回值則是第一個元素
ret = conn.lpop('list1')

# 在name對應的列表的右側獲取第一個元素並在列表中移除,返回值則是第一個元素
ret = conn.rpop('list1')

# 在name對應的列表中根據索引獲取列表元素
ret = conn.lindex('list1','0')   #取出索引為0的位置的值

# 對name對應的list進行切片取值
ret = conn.lrange('list1','0','2')  #[b'4', b'88887', b'3']

# 在name對應的列表中移除沒有在start-end索引之間的值
ret = conn.ltrim('list1','0','2')

自定義增量迭代

# yield的應用場景

# 自定製分批取列表的資料
# conn.lpush('test',*[1,2,3,4,45,5,6,7,7,8,43,5,6,768,89,9,65,4,23,54,6757,8,68])
# conn.flushall()
def scan_list(name,count=2):
    index=0
    while True:
        data_list=conn.lrange(name,index,count+index-1)
        if not data_list:
            return
        index+=count
        for item in data_list:
            yield item

Redis之管道

# 在redis中使用管道來實現事務
事務的一致性:要麼都成功,要麼都失敗
 
import redis
from xxx import POOL

conn = redis.Redis(connection_pool=POOL)
# pipe = r.pipeline(transaction=False)
pipe = r.pipeline(transaction=True)  #開啟事務
pipe.multi()
pipe.set('name', 'alex')
pipe.set('role', 'sb')
 
pipe.execute()

單例模式封裝

import redis
POOL = redis.ConnectionPool(host='10.211.55.4', port=6379)

Redis的其它使用

# 刪除操作
conn.delete('list1')
ret=conn.delete('hash1')

# 判斷name是否存在
ret=conn.exists('hash2')

#根據模型獲取redis的name
ret=conn.keys('cache*')  #查詢以cache開頭的所有key

#為某個redis的某個name設定超時時間
ret=conn.expire('hash2',2)

# 獲取name對應值的型別
ret=conn.type('name3')
ret=conn.type('test')
ret=conn.type('test')