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

歡迎訪問 生活随笔!

生活随笔

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

python

python如何连redis_python操作redis

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

連接 Redis

importredis

連接方式:redis提供了2個方法

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

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

官方推薦使用StrictRedis方法。

舉例(普通連接):

import redis

#decode_responses=True 自動解碼

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

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

舉例(連接池):

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,過期時間(秒)

px,過期時間(毫秒)

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

xx,如果設(shè)置為True,則只有name存在時,當(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)容,從指定字符串索引開始向后替換,如果新值太長時,則向后添加

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

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對應(yīng)值的字節(jié)長度

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

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

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

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

#自增mount對應(yīng)的值,當(dāng)mount不存在時,則創(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對應(yīng)的值后面追加內(nèi)容

#在name對應(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)

案例

頁面點擊數(shù)

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

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

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

True

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

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

34635

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

34636

頁面載入的時候則可直接獲取這個值

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

'34636'

二 Hash 操作

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

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

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

hset(name, key, value)

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

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

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

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

hget(name,key)

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

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

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

hgetall(name)

print(r.hgetall("dic_name"))

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

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

hmset(name, mapping)

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

r.hmset("dic_name",dic)

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

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

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

hmget(name, keys, *args)

li=["a1","b1"]

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

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

6.

hlen 獲取hash中鍵值對的個數(shù)

hkeys 獲取hash中所有的key的值

hvals 獲取hash中所有的value的值

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

r.hmset("dic_name",dic)

#hlen(name) 獲取hash中鍵值對的個數(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對應(yīng)的hash是否存在當(dāng)前傳入的key

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

hexists(name, key)

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

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

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

hdel(name,*keys)

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

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

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

hincrby(name, key, amount=1)

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

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

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

hincrbyfloat(name, key, amount=1.0)

案例

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

當(dāng)有大量類型文檔的對象,文檔的內(nèi)容都不一樣時,(即“表”沒有固定的列),可以使用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)存中按照一個name對應(yīng)一個List來存儲

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

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

lpush(name,values)

r.lpush("list_name",2)

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

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

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

rpush(name,values)

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

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

lpushx(name,value)

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

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

rpushx(name,value)

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

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

llen(name)

print(r.llen("list_name"))

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

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

linsert(name, where, refvalue, value))

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

'''參數(shù):

name: redis的name

where: BEFORE(前)或AFTER(后)

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

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

7. r.lset 對list中的某一個索引位置重新賦值

#對list中的某一個索引位置重新賦值

r.lset(name, index, varlue)

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

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

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

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

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

''' 參數(shù):

name: redis的name

value: 要刪除的值

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

num=2 從前到后,刪除2個;

num=-2 從后向前,刪除2個'''

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

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

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) 從一個列表取出最右邊的元素,同時將其添加至另一個列表的最左邊

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

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

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

四 Set 操作

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

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

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

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

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

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

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

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

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

r.scard("set_name")

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

#在第一個name對應(yīng)的集合中且不在其他name對應(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) 獲取多個name對應(yīng)集合的并集

# 獲取多個name對應(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對應(yīng)的集合內(nèi)的元素

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

sismember(name, value)

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

#將某個元素從一個集合中移動到另外一個集合

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

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

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

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

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

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

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

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

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

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

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

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

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

案例

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

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

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

>>> 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

獲取一個圈子的成員

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

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

可以使用集合運算來得到幾個圈子的共同成員:

>>> 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ù)另外一個值來進(jìn)行比較,所以,對于有序集合,每一個元素有兩個值,即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序。

1. zadd(name, args,*kwargs)

# 在name對應(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]之間的個數(shù)

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

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

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

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

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

r.zincrby("zset_name","a1") # 如果不指定a1 則自動創(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對應(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 對分?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對應(yīng)的有序集合中的排行位置(從0開始)

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

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

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

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

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

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

#刪除name對應(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)

# 獲取兩個有序集合的交集并放入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)

#獲取兩個有序集合的并集并放入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) 為某個name設(shè)置超時時間

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

5. rename(src, dst) 重命名

# 重命名

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

# 將redis的某個值移動到指定的db下

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

#隨機獲取一個redis的name(不刪除)

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

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

總結(jié)

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

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