微信公衆號搜索【程序媛小莊】 - 沒有白走的路,每一步都算數java
安裝好Redis後,一樣可使用Python去操做Redis,Python操做redis是經過第三方模塊的,本文介紹如何使用Python對Redis進行增刪改查的操做。python
首先須要安裝包:pip install redis
web
在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中每種數據結構存儲數據的方式請看下圖:緩存
字符串類型是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'
複製代碼
用於存儲對象,對象的結構爲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這個鍵和其對應的值
複製代碼
列表的元素類型爲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)
複製代碼
無序集合,元素爲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):用於增量迭代分批獲取元素,避免內存消耗太大。
有序集合,元素爲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):根據分數範圍刪除 。
文章首發於微信公衆號程序媛小莊,同步於掘金。
碼字不易,轉載請說明出處,走過路過的小夥伴們伸出可愛的小指頭點個贊再走吧(╹▽╹)