[redis入門] redis基本命令和Python如何操做Redis | 8月更文挑戰

微信公衆號搜索【程序媛小莊】 - 沒有白走的路,每一步都算數java

image.png

前言

安裝好Redis後,一樣可使用Python去操做Redis,Python操做redis是經過第三方模塊的,本文介紹如何使用Python對Redis進行增刪改查的操做。python

Python操做Redis

首先須要安裝包:pip install redisweb

普通鏈接

在Python代碼中進行鏈接:redis

from redis import Redis


# 建立鏈接對象
conn = Redis(host='127.0.0.1', port=6379, password='1234')  # redis默認端口是6379

# 經過鏈接對象設置redis緩存
ret = conn.set('name','python')
print(conn.get('name')) # zhy
複製代碼

鏈接池

普通鏈接是鏈接一次就斷了,在常用redis的場景下頻繁的建立鏈接和釋放鏈接很是耗費資源,所以能夠採起鏈接池的方式,當程序建立數據源實例時,系統會一次建立多個數據庫鏈接,並把這些數據庫鏈接保存在鏈接池中,當程序須要進行數據庫訪問時,無需建立新的鏈接直接從鏈接池中取出一個空閒的鏈接對象便可。數據庫

# 須要說明的是,鏈接池對象必須符合單例模式,單例模式有多種實現方法,這裏只列舉一種
import redis


class Pool:
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = redis.ConnectionPool(host='127.0.0.1',port=6379,max_connections=100)
        return cls._instance
    
    
# 生成鏈接池對象 
pool = Pool()
# 生成鏈接對象
conn = redis.Redis(connection_pool=pool)
複製代碼

Redis API使用

Redis中每種數據結構存儲數據的方式請看下圖:緩存

image.png

string類型

字符串類型是Redis中最爲基礎的數據存儲類型,最大容量是512M,數字在存儲時也是保存爲字符串string。下面是string類型經常使用的方法。微信

設置值

set:默認不存在建立,存在則修改。markdown

# redis直接操做
set(name, value, ex=None, px=None, nx=False, xx=False)
參數說明:
	ex: 過時時間,單位是秒
    px: 過時時間,單位是毫秒
    nx: 若是設置爲True,則只有name不存在時,當前set操做才執行,即添加
    xx: 默認是False,若是設置爲True的話,表示若是name不存在,不會建立新的,若是key存在則更新redis中key對應的數據
        
# Python操做
ret = conn.set('age', 18, ex=10)
ret = conn.set('name1','python', nx=True)
ret = conn.set('name1','python', xx=True)
複製代碼

setnx(name, value):用法等同於set(name, value, nx=True)數據結構

setex(name, value, time): 用法等同於set(name, value, ex=time)app

psetex(name, value, time_ms):用法等同於setex,可是時間參數單位是毫秒。

mset(kwargs):批量設置值。

# redis直接操做批量設置值
mset(k1='v1', k2='v2')
# 或者
mset({'k1': 'v1', 'k2': 'v2'})

# Python操做
ret = conn.mset({'name':'lx','name2':'doushabao','name3':'haha'})
複製代碼

獲取值

get(name):根據name獲取值

# redis 直接操做
get(name)

# python操做
ret = conn.get('name')
複製代碼

mget(keys, args):根據key批量獲取值。

# redis直接操做
mget('Python', 'java')
# 或
mget(['Python', 'java'])

# python操做
ret = conn.mget('name','name1')
複製代碼

getset(name, value):設置新的值並返回原來的值。

# python操做
r.set('name', 'Python')
old_name = r.getset('name', 'java')  # old_name = b'Python'
複製代碼

getrange(key, start, end):根據字節獲取子序列,key是redis中設置的key,start是起始位置,end是結束位置,從零開始。

# python操做
ret = conn.getrange('name',0,1)
# name對應的是java
print(ret)  # ja
複製代碼

setrange(name, offset, value):修改字符串內容,從指定字符串索引開始向後替換(新值太長則向後添加)

# Python操做
ret = conn.setrange('name',1,'iiiiiiiiiii')
複製代碼

strlen(name): 返回name對應值的字節長度

# python操做
ret = conn.strlen('name')
複製代碼

其餘方法

incr(self, name, amount=1):同incrby,適用因而數字的字符串的加法,不然報錯,自增 name對應的值,當name不存在時,則建立name=amount,不然,則自增。

decr(self, name, amount=1)):自檢name對應的值,不存在則建立name=amount,不然自減。

append(key, value):在redis name對應的值後拼接新的字符串

# python操做
conn.set('name', 'hah')
conn.append('name', 'hello')
print(r.get('name'))	# b'hahahello'
複製代碼

hash類型

用於存儲對象,對象的結構爲key-value形式,相似於Python的字典,值的類型爲string,不能嵌套使用。能夠存儲一組關聯性較強的數據。

設置值

hset(name, key=None, value=None, mapping=None):name對應的hash中設置一個鍵值對,不存在建立,不然進行修改操做。

# 參數說明
name,redis的name
key,name對應的hash中的key
value,name對應的hash中的value,只能是字符串 整型 浮點型 或者是bytes類型
mapping, 批處理設置鍵值對,py38之後批量插入使用hset,啓用hmset

# Python操做
ret = conn.hset('gae','age',19)
ret = conn.hset('yyy',mapping={'x1':'o1', 'x2':'o2'}) 
複製代碼

hsetnx(name, key, value):當name對應的hash中不存在當前key時則建立(至關於添加),並返回1;存在則不處理,返回0

hmset(name,mapping):在Python3.8版本中被棄用,使用hset便可。

ret = conn.hmset('xxxxx',{'k1':'v1','k2':'v2'})
複製代碼

獲取值

hget(name, key, value):獲取name對應的hash中的key對應的value。

hmget(name, keys, args):在name對應的hash中獲取多個key的值,列表的形式返回。

# 參數說明
name,reids對應的name
keys,要獲取key集合,如:['k1', 'k2', 'k3']
*args,要獲取的key,如:k1,k2,k3
# Python操做
ret = conn.hmget('xxxxx','k1','k2')
ret = conn.hmget('xxxxx',['k1','k2'])
複製代碼

hlen(name): 獲取name對應的hash中鍵值對的個數。

hkeys(name):獲取name對應的hash中全部的key的值。

hvals(name):獲取name對應的hash中全部的value的值。

hdel(name, keys):將name對應的hash中指定key的鍵值對刪除,支持刪除多個。

conn.hdel('info', 'name', 'age')
複製代碼

其餘操做

hincrby(name, key, amount=1):自增name對應的hash中的指定key的值,不存在則建立key=amount

# 參數說明
    name,redis中的name
    key, hash對應的key
    amount,自增數(整數)
    
# Python操做
ret1 = conn.hincrby('xxxxx','number',6)
複製代碼

hscan_iter(name, match=None, count=None):利用yield封裝hscan建立生成器,實現分批去redis中獲取數據

# 參數說明
match,匹配指定key,默認None 表示全部的key
count,每次分片最少獲取個數,默認None表示採用Redis的默認分片個數 

# Python使用
for item in conn.hscan_iter('xx'):
    print(item)	# 打印全部的key-value鍵值對

for item in conn.hscan_iter('xx', match='k1'):
    print(item)	# 打印k1這個鍵和其對應的值
複製代碼

list類型

列表的元素類型爲string,好比key: [值1, 值2...]

lpush(name, values):在name對應的鏈表中添加元素,每一個元素都添加到鏈表的最左邊。

conn.lpush('l1', 1,2,3,4,5)  # l1 = [b'5', b'4', b'3', b'2', b'1']
複製代碼

rpush(name, values):在name對應的鏈表中添加元素,每一個元素都添加到鏈表的最右邊。

conn.rpush('l1', 6)	# [b'5', b'4', b'3', b'2', b'1', b'6']
複製代碼

lpushx/rpushx(name, value):在name對應的list中添加元素,只有name已經存在時將元素插在最左邊(右邊);不存在不作任何操做。

llen(name):name對應的list元素的個數。

linsert(name, where, refvalue, value):在name對應的列表的某一個值前或後插入一個新值

# 參數說明
    name,redis的name
    where,BEFORE或AFTER, 不區分大小寫
    refvalue,標杆值,即:在它先後插入數據
    value,要插入的數據
    
# Python操做
conn.linsert('l1', 'after', 3, 12)  # [b'5', b'4', b'3', b'12', b'2', b'1', b'6']
複製代碼

r.lset(name, index, value):對name對應的list中的某一個索引位置從新賦值。

# 參數說明
    name,redis的name
    index,list的索引位置
    value,要設置的值
    
# Python操做
r.lset('l1', 2, '99')  # [b'5', b'4', b'99', b'12', b'12', b'2', b'1', b'6']
複製代碼

r.lrem(name, count, value):在name對應的list中刪除指定的值。

# 參數說明
name,redis的name
value,要刪除的值
count,
    count=0,刪除列表中全部的指定的value;
    count=2, 從前到後,刪除前2個value;
    count=-2, 從後向前,刪除後2個value
複製代碼

lpop/rpop(name):刪除name對應的列表中左邊(右邊)出現的第一個元素並返回。

lindex(name, index):在name對應的列表中根據索引獲取列表元素。

lrange(name, start, end):在name對應的列表分片獲取數據。

ltrim(name, start, end):在name對應的列表中移除start-end之索引外的元素,雙閉區間。

blpop(name, timeout=0):彈出name對應列表中的左邊第一個元素,若是不存在則阻塞,等待列表中出現元素。 timeout爲等待時間,表示阻塞時等待的時間,若是timeout=0則表示無期限的原地阻塞。

blpop('lx_list1')		# 彈出lx_list1中第一個元素,若是不存在則原地阻塞
複製代碼

自定製分批獲取鏈表數據

# 每次從redis中取2個元素, 經過生成器返回出去
# 而後再次while循環,直到知足取值個數要求,
def scan_list(name,count=2):
    index = 0
    while True:
        data_list = conn.lrange(name,index,count+index)
        if not data_list:
            return        # 循環完畢,結束
        # 由於lrange是前閉後閉區間
        index += count+1  # 更新取值區間的起點
        for item in data_list:
            yield item   # 每次切片的列表經過生成器依次返回

# 使用
for i in scan_list('name',count=3):
    print(i)
複製代碼

set類型

無序集合,元素爲string類型,元素惟一不重複。與Python中集合的概念一致。

sadd(name, values):name對應的集合中添加元素。

conn.sadd('num1', 1,2,3,4,5) # num1 = {b'4', b'1', b'2',b'3', b'5'} 無序的
複製代碼

scard(name):獲取name對應的集合中元素個數 。

***sunion(keys, args) ***:獲取多個name對應的集合的並集。

num3 = conn.sunion('num1', 'num2') # 並集
複製代碼

sinter(keys, args):獲取多個集合的交集。

sismember(name, value):檢查value是不是name對應的集合的成員, 返回布爾值。

smembers(name):檢查value是不是name對應的集合的成員。

smembers(name):獲取name對應的集合的全部成員。

spop(name):從集合中隨機移除一個成員,並將其返回。

srandmember(name, numbers):從name對應的集合中隨機獲取 numbers 個元素。

srem(name, values):在name對應的集合中刪除某些值

sscan_iter(name, match=None, count=None):用於增量迭代分批獲取元素,避免內存消耗太大。

zset類型

有序集合,元素爲string類型,元素惟一不重複。元素的排序須要根據另一個值來進行比較,因此,對於有序集合,每個元素有兩個值,即:值和分數,分數專門用來作排序。

zadd(name, args, kwargs):在name對應的有序集合中添加元素。

conn.zadd("zz", {"n1":1,"n2":2,"n3":3,"n4":4})
複製代碼

***zcard(name) ***:獲取name對應的有序集合元素。

zcount(name, min, max):獲取name對應的有序集合中,分數在[min,max]之間的元素的個數。

zincrby(name, value, amount):自增name對應的有序集合的 name 對應的分數。

zrange( name, start, end, desc=False, withscores=False, score_cast_func=float):按照索引範圍獲取name對應的有序集合的元素。

# 參數說明
    name    redis的name
    start   有序集合索引發始位置
    end     有序集合索引結束位置
    desc    排序規則,默認按照分數從小到大排序
    withscores  是否獲取元素的分數,默認只獲取元素的值
    score_cast_func 對分數進行數據轉換的函數
    
# Python操做
aa = conn.zrange("znum1",0,1,desc=False,withscores=True,score_cast_func=int)
print(aa)	# [(b'n1', 1), (b'n2', 4)] 
複製代碼

zscore(name, value):獲取name對應有序集合中,value對應的分數 。

zrank(name, value):獲取某個值在name對應的有序集合中的排行(從0開始)。

zrem(name, values):刪除name對應的有序集合中值是values的成員。

zrem('zz', ['s1', 's2'])
複製代碼

zremrangebyrank(name, min, max):根據排行範圍刪除,即 '索引值'刪除。

zremrangebyscore(name, min, max):根據分數範圍刪除 。

結語

文章首發於微信公衆號程序媛小莊,同步於掘金

碼字不易,轉載請說明出處,走過路過的小夥伴們伸出可愛的小指頭點個贊再走吧(╹▽╹)

相關文章
相關標籤/搜索