日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python如何连redis_python操作redis

發(fā)布時(shí)間:2023/12/19 python 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python如何连redis_python操作redis 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

連接 Redis

importredis

連接方式:redis提供了2個(gè)方法

1:StrictRedis:實(shí)現(xiàn)大部分官方的命令

2:Redis:是StrictRedis的子類,用于向后兼容舊版的redis。

官方推薦使用StrictRedis方法。

舉例(普通連接):

import redis

#decode_responses=True 自動(dòng)解碼

r = redis.Redis(host='127.0.0.1',port=6379,password='123456',db=0,decode_responses=True) #默認(rèn)數(shù)據(jù)庫為0

r = redis.StrictRedis(host='10.10.2.14',port=6379,password='123456',decode_responses=True)

連接池:connection pool

管理對(duì)一個(gè)redis server的所有連接,避免每次建立,釋放連接的開銷。默認(rèn),每個(gè)redis實(shí)例都會(huì)維護(hù)一個(gè)自己的連接池,可以直接建立一個(gè)連接池,作為參數(shù)傳給redis,這樣可以實(shí)現(xiàn)多個(gè)redis實(shí)例共享一個(gè)連接池。

舉例(連接池):

pool = redis.ConnectionPool(host='127.0.0.1',port=6379,password='123456',decode_responses=True)

r = redis.Redis(connection_pool=pool)

一 STRING 字符串的操作

1. r.set 設(shè)置值

#在Redis中設(shè)置值,默認(rèn)不存在則創(chuàng)建,存在則修改

r.set('name', 'zhangsan')

'''參數(shù):

set(name, value, ex=None, px=None, nx=False, xx=False)

ex,過期時(shí)間(秒)

px,過期時(shí)間(毫秒)

nx,如果設(shè)置為True,則只有name不存在時(shí),當(dāng)前set操作才執(zhí)行,同setnx(name, value)

xx,如果設(shè)置為True,則只有name存在時(shí),當(dāng)前set操作才執(zhí)行'''

2. r.get 獲取值

r.get('name')

3. mset 批量設(shè)置值

#批量設(shè)置值

r.mset(name1='zhangsan', name2='lisi')

#或

r.mget({"name1":'zhangsan', "name2":'lisi'})

4. mget(keys, *args) 批量獲取

#批量獲取

print(r.mget("name1","name2"))

#或

li=["name1","name2"]

print(r.mget(li))

5. getset 設(shè)置新值,打印原值

#設(shè)置新值,打印原值

getset(name, value)

print(r.getset("name1","wangwu")) #輸出:zhangsan

print(r.get("name1")) #輸出:wangwu

6. getrange 根據(jù)字節(jié)獲取子序列

#根據(jù)字節(jié)獲取子序列

getrange(key, start, end)

r.set("name","zhangsan")

print(r.getrange("name",0,3))#輸出:zhan

7. setrange 修改字符串內(nèi)容,從指定字符串索引開始向后替換,如果新值太長時(shí),則向后添加

#修改字符串內(nèi)容,從指定字符串索引開始向后替換,如果新值太長時(shí),則向后添加

setrange(name, offset, value)

r.set("name","zhangsan")

r.setrange("name",1,"z")

print(r.get("name")) #輸出:zzangsan

r.setrange("name",6,"zzzzzzz")

print(r.get("name")) #輸出:zzangszzzzzzz

8. strlen(name) 返回name對(duì)應(yīng)值的字節(jié)長度

#返回name對(duì)應(yīng)值的字節(jié)長度(一個(gè)漢字3個(gè)字節(jié))

r.set("name","zhangsan")

print(r.strlen("name")) #輸出:8

9. incr 值的累加 amount為累加的值

#自增mount對(duì)應(yīng)的值,當(dāng)mount不存在時(shí),則創(chuàng)建mount=amount,否則,則自增,amount為自增數(shù)(整數(shù))

incr(self, name, amount=1)

print(r.incr("mount",amount=2))#輸出:2

print(r.incr("mount"))#輸出:3

print(r.incr("mount",amount=3))#輸出:6

print(r.incr("mount",amount=6))#輸出:12

print(r.get("mount")) #輸出:12

10. append 在name對(duì)應(yīng)的值后面追加內(nèi)容

#在name對(duì)應(yīng)的值后面追加內(nèi)容

append(name, value)

r.set("name","zhangsan")

print(r.get("name")) #輸出:'zhangsan

r.append("name","lisi")

print(r.get("name")) #輸出:zhangsanlisi

11.type 查看類型

r.type(name)

案例

頁面點(diǎn)擊數(shù)

假定我們對(duì)一系列頁面需要記錄點(diǎn)擊次數(shù)。例如論壇的每個(gè)帖子都要記錄點(diǎn)擊次數(shù),而點(diǎn)擊次數(shù)比回帖的次數(shù)的多得多。如果使用關(guān)系數(shù)據(jù)庫來存儲(chǔ)點(diǎn)擊,可能存在大量的行級(jí)鎖爭用。所以,點(diǎn)擊數(shù)的增加使用redis的INCR命令最好不過了。

? 當(dāng)redis服務(wù)器啟動(dòng)時(shí),可以從關(guān)系數(shù)據(jù)庫讀入點(diǎn)擊數(shù)的初始值(1237這個(gè)頁面被訪問了34634次)

>>> r.set("visit:1237:totals",34634)

True

每當(dāng)有一個(gè)頁面點(diǎn)擊,則使用INCR增加點(diǎn)擊數(shù)即可。

>>> r.incr("visit:1237:totals")

34635

>>> r.incr("visit:1237:totals")

34636

頁面載入的時(shí)候則可直接獲取這個(gè)值

>>> r.get ("visit:1237:totals")

'34636'

二 Hash 操作

redis中的Hash 在內(nèi)存中類似于一個(gè)name對(duì)應(yīng)一個(gè)dic來存儲(chǔ)

1. hset name對(duì)應(yīng)的hash中設(shè)置一個(gè)鍵值對(duì)(不存在,則創(chuàng)建,否則,修改)

#name對(duì)應(yīng)的hash中設(shè)置一個(gè)鍵值對(duì)(不存在,則創(chuàng)建,否則,修改)

hset(name, key, value)

r.hset("dic_name","a1","aa")

2. hget 在name對(duì)應(yīng)的hash中根據(jù)key獲取value

r.hset("dic_name","a1","aa")

#在name對(duì)應(yīng)的hash中根據(jù)key獲取value

hget(name,key)

print(r.hget("dic_name","a1"))#輸出:aa

3. hgetall 獲取name對(duì)應(yīng)hash的所有鍵值

#獲取name對(duì)應(yīng)hash的所有鍵值

hgetall(name)

print(r.hgetall("dic_name"))

4. hmset 在name對(duì)應(yīng)的hash中批量設(shè)置鍵值對(duì),mapping:字典

#在name對(duì)應(yīng)的hash中批量設(shè)置鍵值對(duì),mapping:字典

hmset(name, mapping)

dic={"a1":"aa","b1":"bb"}

r.hmset("dic_name",dic)

print(r.hget("dic_name","b1"))#輸出:bb

5. hmget 在name對(duì)應(yīng)的hash中獲取多個(gè)key的值

# 在name對(duì)應(yīng)的hash中獲取多個(gè)key的值

hmget(name, keys, *args)

li=["a1","b1"]

print(r.hmget("dic_name",li))

print(r.hmget("dic_name","a1","b1"))

6.

hlen 獲取hash中鍵值對(duì)的個(gè)數(shù)

hkeys 獲取hash中所有的key的值

hvals 獲取hash中所有的value的值

dic={"a1":"aa","b1":"bb"}

r.hmset("dic_name",dic)

#hlen(name) 獲取hash中鍵值對(duì)的個(gè)數(shù)

print(r.hlen("dic_name"))

#hkeys(name) 獲取hash中所有的key的值

print(r.hkeys("dic_name")) # ['a1','b1']

#hvals(name) 獲取hash中所有的value的值

print(r.hvals("dic_name"))

7. hexists 檢查name對(duì)應(yīng)的hash是否存在當(dāng)前傳入的key

#檢查name對(duì)應(yīng)的hash是否存在當(dāng)前傳入的key

hexists(name, key)

print(r.hexists("dic_name","a1"))#輸出:True

8. hdel 刪除指定name對(duì)應(yīng)的key所在的鍵值對(duì)

#刪除指定name對(duì)應(yīng)的key所在的鍵值對(duì)

hdel(name,*keys)

r.hdel("dic_name","a1")

9. hincrby 自增hash中key對(duì)應(yīng)的值,不存在則創(chuàng)建key=amount(amount為整數(shù))

#自增hash中key對(duì)應(yīng)的值,不存在則創(chuàng)建key=amount(amount為整數(shù))

hincrby(name, key, amount=1)

print(r.hincrby("demo","a",amount=2))

10.hincrbyfloat 自增hash中key對(duì)應(yīng)的值,不存在則創(chuàng)建key=amount(amount為浮點(diǎn)數(shù))

自增hash中key對(duì)應(yīng)的值,不存在則創(chuàng)建key=amount(amount為浮點(diǎn)數(shù))

hincrbyfloat(name, key, amount=1.0)

案例

使用hash類型保存多樣化對(duì)象,類似二維表結(jié)構(gòu)

當(dāng)有大量類型文檔的對(duì)象,文檔的內(nèi)容都不一樣時(shí),(即“表”沒有固定的列),可以使用hash來表達(dá)。

>>> r.hset('users:jdoe', 'name', "John Doe")

1L

>>> r.hset('users:jdoe', 'email', 'John@test.com')

1L

>>> r.hset('users:jdoe', 'phone', '1555313940')

1L

>>> r.hincrby('users:jdoe', 'visits', 1)

1L

>>> r.hgetall('users:jdoe')

{'phone': '1555313940', 'name': 'John Doe', 'visits': '1', 'email': 'John@test.com'}

>>> r.hkeys('users:jdoe')

['name', 'email', 'phone', 'visits']

三 List 操作

redis中的List在內(nèi)存中按照一個(gè)name對(duì)應(yīng)一個(gè)List來存儲(chǔ)

1. lpush 在name對(duì)應(yīng)的list中添加元素,每個(gè)新的元素都添加到列表的最左邊

# 在name對(duì)應(yīng)的list中添加元素,每個(gè)新的元素都添加到列表的最左邊

lpush(name,values)

r.lpush("list_name",2)

r.lpush("list_name",3,4,5)#保存在列表中的順序?yàn)?,4,3,2

2.rpush 同lpush,但每個(gè)新的元素都添加到列表的最右邊

#同lpush,但每個(gè)新的元素都添加到列表的最右邊

rpush(name,values)

3. lpushx 在name對(duì)應(yīng)的list中添加元素,只有name已經(jīng)存在時(shí),值添加到列表的最左邊

#在name對(duì)應(yīng)的list中添加元素,只有name已經(jīng)存在時(shí),值添加到列表的最左邊

lpushx(name,value)

4. rpushx 在name對(duì)應(yīng)的list中添加元素,只有name已經(jīng)存在時(shí),值添加到列表的最右邊

#在name對(duì)應(yīng)的list中添加元素,只有name已經(jīng)存在時(shí),值添加到列表的最右邊

rpushx(name,value)

5. llen name對(duì)應(yīng)的list元素的個(gè)數(shù)

# name對(duì)應(yīng)的list元素的個(gè)數(shù)

llen(name)

print(r.llen("list_name"))

6. linsert 在name對(duì)應(yīng)的列表的某一個(gè)值前或后插入一個(gè)新值

# 在name對(duì)應(yīng)的列表的某一個(gè)值前或后插入一個(gè)新值

linsert(name, where, refvalue, value))

r.linsert("list_name","BEFORE","2","SS")#在列表內(nèi)找到第一個(gè)元素2,在它前面插入SS

'''參數(shù):

name: redis的name

where: BEFORE(前)或AFTER(后)

refvalue: 列表內(nèi)的值

value: 要插入的數(shù)據(jù)'''

7. r.lset 對(duì)list中的某一個(gè)索引位置重新賦值

#對(duì)list中的某一個(gè)索引位置重新賦值

r.lset(name, index, varlue)

r.lset("list_name",0,"bbb")

8. r.lrem 刪除name對(duì)應(yīng)的list中的指定值

#刪除name對(duì)應(yīng)的list中的指定值

r.lrem(name, value, num=0)

r.lrem("list_name",'ssss',2)

''' 參數(shù):

name: redis的name

value: 要?jiǎng)h除的值

num: num=0 刪除列表中所有的指定值;

num=2 從前到后,刪除2個(gè);

num=-2 從后向前,刪除2個(gè)'''

9. lpop 移除列表的左側(cè)第一個(gè)元素,返回值則是第一個(gè)元素

#移除列表的左側(cè)第一個(gè)元素,返回值則是第一個(gè)元素

lpop(name)

print(r.lpop("list_name"))

10. lindex 根據(jù)索引獲取列表內(nèi)元素

#根據(jù)索引獲取列表內(nèi)元素

lindex(name, index)

print(r.lindex("list_name",1))

11. lrange 分片獲取元素

#分片獲取元素

lrange(name, start, end)

print(r.lrange("list_name",0,-1))

12. ltrim 移除列表內(nèi)沒有在該索引之內(nèi)的值(裁剪)

#移除列表內(nèi)沒有在該索引之內(nèi)的值

ltrim(name, start, end)

r.ltrim("list_name",0,2)

13. rpoplpush(src, dst) 從一個(gè)列表取出最右邊的元素,同時(shí)將其添加至另一個(gè)列表的最左邊

# 從一個(gè)列表取出最右邊的元素,同時(shí)將其添加至另一個(gè)列表的最左邊

#src 要取數(shù)據(jù)的列表

#dst 要添加數(shù)據(jù)的列表

四 Set 操作

Set集合就是不允許重復(fù)的列表

1. sadd(name,values) 給name對(duì)應(yīng)的集合中添加元素

#給name對(duì)應(yīng)的集合中添加元素

r.sadd("set_name","aa")

r.sadd("set_name","aa","bb")

2. smembers(name) 獲取name對(duì)應(yīng)的集合的所有成員

#獲取name對(duì)應(yīng)的集合的所有成員

3. scard(name) 獲取name對(duì)應(yīng)的集合中的元素個(gè)數(shù)

#獲取name對(duì)應(yīng)的集合中的元素個(gè)數(shù)

r.scard("set_name")

4. sdiff(keys, *args) 在第一個(gè)name對(duì)應(yīng)的集合中且不在其他name對(duì)應(yīng)的集合的元素集合

#在第一個(gè)name對(duì)應(yīng)的集合中且不在其他name對(duì)應(yīng)的集合的元素集合

r.sadd("set_name","aa","bb")

r.sadd("set_name1","bb","cc")

r.sadd("set_name2","bb","cc","dd")

print(r.sdiff("set_name","set_name1","set_name2"))#輸出:{aa}

6. sinter(keys, *args) 獲取多個(gè)name對(duì)應(yīng)集合的并集

# 獲取多個(gè)name對(duì)應(yīng)集合的并集

r.sadd("set_name","aa","bb")

r.sadd("set_name1","bb","cc")

r.sadd("set_name2","bb","cc","dd")

print(r.sinter("set_name","set_name1","set_name2"))#輸出:{bb}

8.sismember 檢查value是否是name對(duì)應(yīng)的集合內(nèi)的元素

#檢查value是否是name對(duì)應(yīng)的集合內(nèi)的元素

sismember(name, value)

9. smove(src, dst, value) 將某個(gè)元素從一個(gè)集合中移動(dòng)到另外一個(gè)集合

#將某個(gè)元素從一個(gè)集合中移動(dòng)到另外一個(gè)集合

10. spop(name) 從集合的右側(cè)移除一個(gè)元素,并將其返回

#從集合的右側(cè)移除一個(gè)元素,并將其返回

11. srandmember(name, numbers) 從name對(duì)應(yīng)的集合中隨機(jī)獲取numbers個(gè)元素

# 從name對(duì)應(yīng)的集合中隨機(jī)獲取numbers個(gè)元素

print(r.srandmember("set_name2",2))

12. srem(name, values) 刪除name對(duì)應(yīng)的集合中的某些值

#刪除name對(duì)應(yīng)的集合中的某些值

print(r.srem("set_name2","bb","dd"))

13. sunion(keys, *args) 獲取多個(gè)name對(duì)應(yīng)的集合的并集

#獲取多個(gè)name對(duì)應(yīng)的集合的并集

r.sunion("set_name","set_name1","set_name2")

14. sunionstore(dest,keys, *args) 獲取多個(gè)name對(duì)應(yīng)的集合的并集,并將結(jié)果保存到dest對(duì)應(yīng)的集合中

#獲取多個(gè)name對(duì)應(yīng)的集合的并集,并將結(jié)果保存到dest對(duì)應(yīng)的集合中

案例

社交圈子數(shù)據(jù)

在社交網(wǎng)站中,每一個(gè)圈子(circle)都有自己的用戶群。通過圈子可以找到有共同特征(比如某一體育活動(dòng)、游戲、電影等愛好者)的人。當(dāng)一個(gè)用戶加入一個(gè)或幾個(gè)圈子后,系統(tǒng)可以向這個(gè)用戶推薦圈子中的人。

? 我們定義這樣兩個(gè)圈子,并加入一些圈子成員。

>>> r.sadd('circle:game:lol','user:debugo')

1

>>> r.sadd('circle:game:lol','user:leo')

1

>>> r.sadd('circle:game:lol','user:Guo')

1

>>> r.sadd('circle:soccer:InterMilan','user:Guo')

1

>>> r.sadd('circle:soccer:InterMilan','user:Levis')

1

>>> r.sadd('circle:soccer:InterMilan','user:leo')

1

獲取一個(gè)圈子的成員

>>> r.smembers('circle:game:lol')

set(['user:Guo', 'user:debugo', 'user:leo'])

可以使用集合運(yùn)算來得到幾個(gè)圈子的共同成員:

>>> r.sinter('circle:game:lol', 'circle:soccer:InterMilan')

set(['user:Guo', 'user:leo'])

>>> r.sunion('circle:game:lol', 'circle:soccer:InterMilan')

set(['user:Levis', 'user:Guo', 'user:debugo', 'user:leo'])

五 有序集合 zset

有序集合:

在集合的基礎(chǔ)上,為每元素排序,元素的排序需要根據(jù)另外一個(gè)值來進(jìn)行比較,所以,對(duì)于有序集合,每一個(gè)元素有兩個(gè)值,即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序。

1. zadd(name, args,*kwargs)

# 在name對(duì)應(yīng)的有序集合中添加元素

r.zadd("zset_name", 6,"a1", 2, "a2", 5,"a3")

#或

r.zadd('zset_name1', b1=10, b2=5)

2. zcard(name) 獲取有序集合內(nèi)元素的數(shù)量

#獲取有序集合內(nèi)元素的數(shù)量

3. zcount(name, min, max) 獲取有序集合中分?jǐn)?shù)在[min,max]之間的個(gè)數(shù)

#獲取有序集合中分?jǐn)?shù)在[min,max]之間的個(gè)數(shù)

print(r.zcount("zset_name",1,5))

4. zincrby(name, value, amount) 自增有序集合內(nèi)value對(duì)應(yīng)的分?jǐn)?shù)

#自增有序集合內(nèi)value對(duì)應(yīng)的分?jǐn)?shù)

r.zincrby("zset_name","a1",amount=2)#自增zset_name對(duì)應(yīng)的有序集合里a1對(duì)應(yīng)的分?jǐn)?shù)

r.zincrby("zset_name","a1") # 如果不指定a1 則自動(dòng)創(chuàng)建a1,并將score設(shè)為1,再次執(zhí)行則a1的score變?yōu)?,以此類推

5. zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)

# 按照索引范圍獲取name對(duì)應(yīng)的有序集合的元素

aa=r.zrange("zset_name",0,1,desc=False,withscores=True,score_cast_func=int)

print(aa)

'''參數(shù):

name redis的name

start 有序集合索引起始位置

end 有序集合索引結(jié)束位置

desc 排序規(guī)則,默認(rèn)按照分?jǐn)?shù)從小到大排序

withscores 是否獲取元素的分?jǐn)?shù),默認(rèn)只獲取元素的值

score_cast_func 對(duì)分?jǐn)?shù)進(jìn)行數(shù)據(jù)轉(zhuǎn)換的函數(shù)'''

6. zrevrange(name, start, end, withscores=False, score_cast_func=float)

#同zrange,集合是從大到小排序的

[(value1, score1),(value2, score2)..]

7. zrank(name, value)、zrevrank(name, value)

#獲取value值在name對(duì)應(yīng)的有序集合中的排行位置(從0開始)

print(r.zrank("zset_name", "a2"))

print(r.zrevrank("zset_name", "a2"))#從大到小排序

8. zscore(name, value) 獲取name對(duì)應(yīng)有序集合中 value 對(duì)應(yīng)的分?jǐn)?shù)

#獲取name對(duì)應(yīng)有序集合中 value 對(duì)應(yīng)的分?jǐn)?shù)

print(r.zscore("zset_name","a1"))

9. zrem(name, values) 刪除name對(duì)應(yīng)的有序集合中值是values的成員

#刪除name對(duì)應(yīng)的有序集合中值是values的成員

r.zrem("zset_name","a1","a2")

10. zremrangebyrank(name, min, max) 根據(jù)排行范圍刪除

#根據(jù)排行范圍刪除

11. zremrangebyscore(name, min, max) 根據(jù)分?jǐn)?shù)范圍刪除

#根據(jù)分?jǐn)?shù)范圍刪除

12. zinterstore(dest, keys, aggregate=None)

r.zadd("zset_name", "a1", 6, "a2", 2,"a3",5)

r.zadd('zset_name1', a1=7,b1=10, b2=5)

# 獲取兩個(gè)有序集合的交集并放入dest集合,如果遇到相同值不同分?jǐn)?shù),則按照aggregate進(jìn)行操作

# aggregate的值為: SUM MIN MAX

r.zinterstore("zset_name2",("zset_name1","zset_name"),aggregate="MAX")

print(r.zscan("zset_name2"))

13. zunionstore(dest, keys, aggregate=None)

#獲取兩個(gè)有序集合的并集并放入dest集合,其他同zinterstore,

其他常用操作

1. delete(*names) 根據(jù)name刪除redis中的任意數(shù)據(jù)類型

#根據(jù)name刪除redis中的任意數(shù)據(jù)類型

2. exists(name) 檢測redis的name是否存在

#檢測redis的name是否存在

3. keys(pattern='*') 根據(jù)* ?等通配符匹配獲取redis的name

#根據(jù)* ?等通配符匹配獲取redis的name

4. expire(name ,time) 為某個(gè)name設(shè)置超時(shí)時(shí)間

# 為某個(gè)name設(shè)置超時(shí)時(shí)間

5. rename(src, dst) 重命名

# 重命名

6. move(name, db)) 將redis的某個(gè)值移動(dòng)到指定的db下

# 將redis的某個(gè)值移動(dòng)到指定的db下

7. randomkey() 隨機(jī)獲取一個(gè)redis的name(不刪除)

#隨機(jī)獲取一個(gè)redis的name(不刪除)

8. type(name) 獲取name對(duì)應(yīng)值的類型

# 獲取name對(duì)應(yīng)值的類型

總結(jié)

以上是生活随笔為你收集整理的python如何连redis_python操作redis的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。