Python 分布式緩存之Reids數(shù)據(jù)類型操作詳解
1、Redis API
1.安裝redis模塊
$ pip3.8 install redis
2.使用redis模塊
import redis # 連接redis的ip地址/主機(jī)名,port,password=None r = redis.Redis(host="127.0.0.1",port=6379,password="gs123456")
3.redis連接池
redis-py使用connection pool來管理對(duì)一個(gè)redis server的所有連接,避免每次建立、釋放連接的開銷。默認(rèn),每個(gè)Redis實(shí)例都會(huì)維護(hù)一個(gè)自己的連接池。可以直接建立一個(gè)連接池,然后作為參數(shù)Redis,這樣就可以實(shí)現(xiàn)多個(gè)Redis實(shí)例共享一個(gè)連接池。
總之,當(dāng)程序創(chuàng)建數(shù)據(jù)源實(shí)例時(shí),系統(tǒng)會(huì)一次性創(chuàng)建多個(gè)數(shù)據(jù)庫連接,并把這些數(shù)據(jù)庫連接保存在連接池中,當(dāng)程序需要進(jìn)行數(shù)據(jù)庫訪問時(shí),無需重新新建數(shù)據(jù)庫連接,而是從連接池中取出一個(gè)空閑的數(shù)據(jù)庫連接
import redis # 創(chuàng)建連接池,將連接保存在連接池中 pool = redis.ConnectionPool(host="127.0.0.1",port=6379,password="gs123456",max_connections=10) # 創(chuàng)建一個(gè)redis實(shí)例,并使用連接池"pool" r = redis.Redis(connection_pool=pool)
2、String 操作
redis中的String在內(nèi)存中按照一個(gè)name對(duì)應(yīng)一個(gè)value來存儲(chǔ)。如圖:

1. set 為name設(shè)置值
# 在Redis中設(shè)置值,默認(rèn),不存在則創(chuàng)建,存在則修改 set(name, value, ex=None, px=None, nx=False, xx=False, keepttl=False) name:設(shè)置鍵 value:設(shè)置值 ex:設(shè)置過期時(shí)間(秒級(jí)) px:設(shè)置過期時(shí)間(毫秒) nx:如果設(shè)置為True,則只有name不存在時(shí),當(dāng)前set操作才執(zhí)行,同setnx(name, value) xx:如果設(shè)置為True,則只有name存在時(shí),當(dāng)前set操作才執(zhí)行
set用法:
r.set("name1","jack",ex=3600)
r.set("name2","xander",xx=36000)
setnx用法:
# 設(shè)置值,只有name不存在時(shí),執(zhí)行設(shè)置操作(添加) setnx(name, value)
setex用法:
# 設(shè)置值,參數(shù):time -->過期時(shí)間(數(shù)字秒 或 timedelta對(duì)象) setex(name, value, time)
psetex用法:
# 設(shè)置值,參數(shù):time_ms,過期時(shí)間(數(shù)字毫秒 或 timedelta對(duì)象) psetex(name, time_ms, value)
2. get 獲取name的值
# 根據(jù)key獲取值
get(name)
r.get("foo")
3. mset 批量設(shè)置name的值:
mset(mapping)
data = {
"k1":"v1",
"k2":"v2",
}
r.mset(data)
4. Mget 批量獲取name的值
# 批量獲取值,根據(jù)多key獲取多個(gè)值
mgets(mapping)
# 方法一
r.mget("k1","k2")
# 方法二
data = ["k1","k2"]
r.mget(data)
# 方法三
data = ("k1","k2")
r.mget(data)
5. getset 設(shè)置新值并獲取原來的值
getset(name, value)
r.set("foo", "xoo")
ret = r.getset("foo", "yoo")
print(ret) # b'xoo'
6. append 為name原有值后追加內(nèi)容
# key對(duì)應(yīng)值的后面追加內(nèi)容
append(key, value)
r.set("name","jack")
r.append("name","-m")
ret = r.get("name")
print(ret) # b'jack-m'
7. strlen 返回name的值字節(jié)長度:
# 返回字符串的長度,當(dāng)name不存在時(shí)返回0
strlen(name)
r.set("name","jack-")
ret = r.strlen("name")
print(ret) # 5
8. incr 為name整數(shù)累加值
# 自增mount對(duì)應(yīng)的值,當(dāng)mount不存在時(shí),則創(chuàng)建mount=amount,否則,則自增,amount為自增數(shù)(整數(shù))
incr(name, amount=1)
r.incr('mount')
r.incr('mount')
r.incr('mount', amount=3)
ret = r.get('mount')
print(ret) # b'5'
3、Hash 操作
hash表現(xiàn)形式上有些像pyhton中的dict,可以存儲(chǔ)一組關(guān)聯(lián)性較強(qiáng)的數(shù)據(jù) ,redis中Hash在內(nèi)存中的存儲(chǔ)格式如下圖:

1. hset 為name設(shè)置單個(gè)鍵值對(duì)
# name對(duì)應(yīng)的hash中設(shè)置一個(gè)鍵值對(duì)(不存在,則創(chuàng)建;否則,修改) hset(name, key, value) name:設(shè)置name key:name對(duì)應(yīng)hash中的key(鍵) value:name對(duì)應(yīng)的hash中的value(值)
hset用法
# 一次只能設(shè)置一個(gè)鍵值對(duì)
r.hset("student-jack", "name", "Jack")
2 . hget 獲取name單個(gè)鍵值對(duì)
# 根據(jù)name對(duì)應(yīng)的hash中獲取根據(jù)key獲取value
hget(name,key)
ret = r.hget("student-jack", "name")
print(ret) // b'Jack'
3. hmset 為name設(shè)置多個(gè)鍵值對(duì)
# mapping中傳入字典(不存在,則創(chuàng)建;否則,修改)
hmset(name, mapping):
data = {
"name": "Jack",
"age": 20,
"gender": "M",
}
r.hmset("student-jack", mapping=data)
4. hmget 獲取name多個(gè)鍵值對(duì)
# 根據(jù)name對(duì)應(yīng)的hash中獲取多個(gè)key的值
hmget(name, keys, *args)
name:指定name
keys:要獲取key集合,如:['k1', 'k2', 'k3']
*args:要獲取的key,如:k1,k2,k3
# 直接傳入需要獲取的鍵
ret = r.hmget("student-jack", "name", "age")
print(ret) # [b'Jack', b'20']
# 列表中指定需要獲取的鍵
data = ["name", "age"]
ret = r.hmget("student-jack", data)
print(ret) # [b'Jack', b'20']
5. hgetall 獲取name的鍵值對(duì)
# 根據(jù)name獲取hash的所有值
hgetall(name)
ret = r.hgetall("student-jack")
print(ret) # {b'name': b'Jack', b'age': b'20', b'gender': b'M'}
6、hlen 獲取name中的鍵值對(duì)個(gè)數(shù)
# 根據(jù)name獲取hash中鍵值對(duì)的總個(gè)數(shù)
hlen(name)
ret = r.hlen("student-jack")
print(ret) # 3 , 3個(gè)鍵值對(duì)
7. hkeys 獲取name中鍵值對(duì)所有key
# 獲取name里鍵值對(duì)的key
hkeys(name)
ret = r.hkeys('student-jack')
print(ret) # [b'name', b'age', b'gender']
8. hvals 獲取name中鍵值對(duì)所有value
# 獲取name里鍵值對(duì)的value
hvals(name)
ret = r.hvals('student-jack')
print(ret) # [b'Jack', b'20', b'M']
9. hkeys 檢查name里的鍵值對(duì)是否有對(duì)應(yīng)的key
# 根據(jù)name檢查對(duì)應(yīng)的hash是否存在當(dāng)前傳入的key
hexists(name, key)
# 返回布爾值
ret = r.hexists('student-jack', 'name')
print(ret) # True
10. hincrby 從name里的鍵值對(duì)設(shè)置自增值
1.整數(shù)自增:
# 自增name對(duì)應(yīng)的hash中的指定key的值,不存在則創(chuàng)建key=amount
hincrby(name, key, amount=1)
name:設(shè)置鍵
key:hash對(duì)應(yīng)的key
amount:自增數(shù)(整數(shù))
ret = r.hincrby('student-jack', 'age')
ret = r.hincrby('student-jack', 'age')
print(ret) # 22
2.浮點(diǎn)自增
# 自增name對(duì)應(yīng)的hash中的指定key的值,不存在則創(chuàng)建key=amount hincrbyfloat(name, key, amount=1.0) name:設(shè)置鍵 key:hash對(duì)應(yīng)的key amount:自增數(shù)(浮點(diǎn)數(shù))
11. hdel 根據(jù)name從鍵值對(duì)中刪除指定key
# 根據(jù)name將對(duì)應(yīng)hash中指定的key鍵值對(duì)刪除
hdel(name,*keys)
r.hdel("info",*("m-k1","m-k2"))
4、List 操作
List操作,redis中的List在內(nèi)存中按照一個(gè)name對(duì)應(yīng)一個(gè)List來存儲(chǔ)。如圖:

1. lpush 為name添加元素,每個(gè)新的元素都添加到列表的最左邊
# name對(duì)應(yīng)的list中添加元素
lpush(name,values)
# 直接指定多個(gè)元素
r.lpush("names", "Jack", "Alex", "Eric")
# 將需要添加的元素添加到元組
data = ("Jack", "Alex", "Eric")
r.rpush("names", *data)
# 將需要添加的元素添加到列表
data = ["Jack", "Alex", "Eric"]
r.rpush("names", *data)
Note:列表類型中的值統(tǒng)稱元素
2. rpush 為name添加元素,每個(gè)新的元素都添加到列表的最右邊
# 同lpush,但每個(gè)新的元素都會(huì)添加到列表的最右邊 rpush(name, values)
3. lpushx 為name添加元素,只有當(dāng)name已存在時(shí),將元素添加至列表最左邊
lpushx(name,value)
4. rpushx 同上,將元素添加至列表最右邊
rpushx(name, values)
5. llen 統(tǒng)計(jì)name中l(wèi)ist的元素個(gè)數(shù)
# name對(duì)應(yīng)的list元素的個(gè)數(shù)
llen(name)
ret = r.llen('names')
print(ret) # 3, 該list中有3個(gè)元素
6. linsert 為name中l(wèi)ist的某一個(gè)值或后 插入一個(gè)新的值
# 在name對(duì)應(yīng)的列表的某一個(gè)值前或后插入一個(gè)新值
linsert(name, where, refvalue, value)
name:設(shè)置name
where:BEFORE或AFTER
refvalue:標(biāo)桿值,即:在它前后插入數(shù)據(jù)
value:要插入的數(shù)據(jù)
// 在Alex值前插入一個(gè)值(BEFORE表示:在...之前)
r.linsert('names', 'BEFORE', 'Jack', 'Jason')
// 在Jack后插入一個(gè)值(AFTER表示:在...之后)
r.linsert('names', 'AFTER', 'Jack', 'Xander')
7. lset 為name中l(wèi)ist的某一個(gè)索引位置的元素重新賦值
# 對(duì)name對(duì)應(yīng)的list中的某一個(gè)索引位置重新賦值
lset(name, index, value)
name:設(shè)置name
index:list的索引位置
value:要設(shè)置的值
// 將索引為1的元素修改為Gigi
r.lset('names', 1, 'Gigi')
8. lrem 移除name里對(duì)應(yīng)list的元素
# 在name對(duì)應(yīng)的list中刪除指定的值
lrem(name, count, value)
name:設(shè)置name
value:要?jiǎng)h除的值
count:count=0,刪除列表中的指定值;
count=2,從前到后,刪除2個(gè);
count=-2,從后向前,刪除2個(gè)
r.lrem('names', count=2, value='Xander')
9. lpop 從name里的list獲取最左側(cè)的第一個(gè)元素,并在列表中移除,返回值是則是第一個(gè)元素
lpop(name)
ret = r.lpop('names')
print(ret) # b'Jason'
10. rpop 同上,從右側(cè)獲取第一個(gè)元素
rpop(name)
11. lindex 在name對(duì)應(yīng)的列表 根據(jù)索引獲取元素
# 在name對(duì)應(yīng)的列表中根據(jù)索引獲取列表元素
lindex(name, index)
ret = r.lindex('names', 0)
print(ret) # b'Gigi'
12. ltrim 移除列表內(nèi)沒有在該索引之內(nèi)的值(截?cái)啵?/p>
# 移除列表內(nèi)沒有在該索引之內(nèi)的值
ltrim(name, start, end)
r.ltrim("names",0,2)
13. lrange 在name對(duì)應(yīng)的列表 根據(jù)索引獲取數(shù)據(jù)
# 在name對(duì)應(yīng)的列表分片獲取數(shù)據(jù)
lrange(name, start, end)
name:設(shè)置name
start:索引的起始位置
end:索引結(jié)束位置
// 先添加點(diǎn)元素
data = ['Jack', 'Eric', 'Koko', 'Jason', 'Alie']
r.rpush('names', *data)
// 獲取列表所有元素
ret = r.lrange('names', 0, -1)
print(ret) # [b'Gigi', b'Alex', b'Jack', b'Eric', b'Koko', b'Jason', b'Alie']
// 獲取列表索引2-5的元素(包含2和5,即 2 3 4 5)
ret = r.lrange('names', 2, 5)
print(ret) # [b'Jack', b'Eric', b'Koko', b'Jason']
// 獲取列表的最后一個(gè)元素
ret = r.lrange('names', -1, -1)
print(ret) # [b'Alie']
到此這篇關(guān)于Python 分布式緩存之Reids數(shù)據(jù)類型操作詳解的文章就介紹到這了,更多相關(guān)Python Reids數(shù)據(jù)類型操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python灰度變換中的分段線性函數(shù)專項(xiàng)分析實(shí)現(xiàn)
灰度變換是指根據(jù)某種目標(biāo)條件按一定變換關(guān)系逐點(diǎn)改變?cè)磮D像中每個(gè)像素灰度值的方法。目的是改善畫質(zhì),使圖像顯示效果更加清晰。圖像的灰度變換處理是圖像增強(qiáng)處理技術(shù)中的一種非?;A(chǔ)、直接的空間域圖像處理方法,也是圖像數(shù)字化軟件和圖像顯示軟件的一個(gè)重要組成部分2022-10-10
Python識(shí)別驗(yàn)證碼的實(shí)現(xiàn)示例
這篇文章主要介紹了Python識(shí)別驗(yàn)證碼的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Python下singleton模式的實(shí)現(xiàn)方法
這篇文章主要介紹了Python下singleton模式的實(shí)現(xiàn)方法,有一定的借鑒價(jià)值,需要的朋友可以參考下2014-07-07
python通過對(duì)字典的排序,對(duì)json字段進(jìn)行排序的實(shí)例
今天小編就為大家分享一篇python通過對(duì)字典的排序,對(duì)json字段進(jìn)行排序的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Python實(shí)現(xiàn)郵件發(fā)送的詳細(xì)設(shè)置方法(遇到問題)
這篇文章主要介紹了Python實(shí)現(xiàn)郵件發(fā)送的詳細(xì)設(shè)置方法(遇到問題),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Python裝飾器入門學(xué)習(xí)教程(九步學(xué)習(xí))
裝飾器(decorator)是一種高級(jí)Python語法。裝飾器可以對(duì)一個(gè)函數(shù)、方法或者類進(jìn)行加工。本文給大家介紹Python裝飾器入門學(xué)習(xí)教程(九步學(xué)習(xí)),對(duì)python裝飾器相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-01-01
Python中利用LSTM模型進(jìn)行時(shí)間序列預(yù)測(cè)分析的實(shí)現(xiàn)
這篇文章主要介紹了Python中利用LSTM模型進(jìn)行時(shí)間序列預(yù)測(cè)分析的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07

