摘要:舉例普通連接自動解碼默認數據庫為連接池管理對一個的所有連接,避免每次建立,釋放連接的開銷。所以,點擊數的增加使用的命令最好不過了。通過圈子可以找到有共同特征比如某一體育活動游戲電影等愛好者的人。我們定義這樣兩個圈子并加入一些圈子成員。
1:StrictRedis:實現大部分官方的命令
2:Redis:是StrictRedis的子類,用于向后兼容舊版的redis。
import redis
#decode_responses=True 自動解碼
管理對一個redis server的所有連接,避免每次建立,釋放連接的開銷。默認,每個redis實例都會維護一個自己的連接池,可以直接建立一個連接池,作為參數傳給redis,這樣可以實現多個redis實例共享一個連接池。
舉例(連接池):
#在Redis中設置值,默認不存在則創建,存在則修改 r.set("name", "zhangsan") """參數: set(name, value, ex=None, px=None, nx=False, xx=False) ex,過期時間(秒) px,過期時間(毫秒) nx,如果設置為True,則只有name不存在時,當前set操作才執行,同setnx(name, value) xx,如果設置為True,則只有name存在時,當前set操作才執行"""2. r.get 獲取值
r.get("name")3. mset 批量設置值
#批量設置值 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 設置新值,打印原值
#設置新值,打印原值 getset(name, value) print(r.getset("name1","wangwu")) #輸出:zhangsan print(r.get("name1")) #輸出:wangwu6. getrange 根據字節獲取子序列
#根據字節獲取子序列 getrange(key, start, end) r.set("name","zhangsan") print(r.getrange("name",0,3))#輸出:zhan7. setrange 修改字符串內容,從指定字符串索引開始向后替換,如果新值太長時,則向后添加
#修改字符串內容,從指定字符串索引開始向后替換,如果新值太長時,則向后添加 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")) #輸出:zzangszzzzzzz8. strlen(name) 返回name對應值的字節長度
#返回name對應值的字節長度(一個漢字3個字節) r.set("name","zhangsan") print(r.strlen("name")) #輸出:89. incr 值的累加 amount為累加的值
#自增mount對應的值,當mount不存在時,則創建mount=amount,否則,則自增,amount為自增數(整數) 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")) #輸出:1210. append 在name對應的值后面追加內容
#在name對應的值后面追加內容 append(name, value) r.set("name","zhangsan") print(r.get("name")) #輸出:"zhangsan r.append("name","lisi") print(r.get("name")) #輸出:zhangsanlisi11.type 查看類型
r.type(name)案例
頁面點擊數
假定我們對一系列頁面需要記錄點擊次數。例如論壇的每個帖子都要記錄點擊次數,而點擊次數比回帖的次數的多得多。如果使用關系數據庫來存儲點擊,可能存在大量的行級鎖爭用。所以,點擊數的增加使用redis的INCR命令最好不過了。
? 當redis服務器啟動時,可以從關系數據庫讀入點擊數的初始值(1237這個頁面被訪問了34634次)
>>> r.set("visit:1237:totals",34634) True
每當有一個頁面點擊,則使用INCR增加點擊數即可。
>>> r.incr("visit:1237:totals") 34635 >>> r.incr("visit:1237:totals") 34636 頁面載入的時候則可直接獲取這個值 >>> r.get ("visit:1237:totals") "34636"二 Hash 操作
#name對應的hash中設置一個鍵值對(不存在,則創建,否則,修改) hset(name, key, value) r.hset("dic_name","a1","aa")2. hget 在name對應的hash中根據key獲取value
r.hset("dic_name","a1","aa") #在name對應的hash中根據key獲取value hget(name,key) print(r.hget("dic_name","a1"))#輸出:aa3. hgetall 獲取name對應hash的所有鍵值
#獲取name對應hash的所有鍵值 hgetall(name) print(r.hgetall("dic_name"))4. hmset 在name對應的hash中批量設置鍵值對,mapping:字典
#在name對應的hash中批量設置鍵值對,mapping:字典 hmset(name, mapping) dic={"a1":"aa","b1":"bb"} r.hmset("dic_name",dic) print(r.hget("dic_name","b1"))#輸出:bb5. hmget 在name對應的hash中獲取多個key的值
# 在name對應的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中鍵值對的個數 hkeys 獲取hash中所有的key的值 hvals 獲取hash中所有的value的值
dic={"a1":"aa","b1":"bb"} r.hmset("dic_name",dic) #hlen(name) 獲取hash中鍵值對的個數 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對應的hash是否存在當前傳入的key
#檢查name對應的hash是否存在當前傳入的key hexists(name, key) print(r.hexists("dic_name","a1"))#輸出:True8. hdel 刪除指定name對應的key所在的鍵值對
#刪除指定name對應的key所在的鍵值對 hdel(name,*keys) r.hdel("dic_name","a1")9. hincrby 自增hash中key對應的值,不存在則創建key=amount(amount為整數)
#自增hash中key對應的值,不存在則創建key=amount(amount為整數) hincrby(name, key, amount=1) print(r.hincrby("demo","a",amount=2))10.hincrbyfloat 自增hash中key對應的值,不存在則創建key=amount(amount為浮點數)
使用hash類型保存多樣化對象,類似二維表結構
當有大量類型文檔的對象,文檔的內容都不一樣時,(即“表”沒有固定的列),可以使用hash來表達。
>>> 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 操作
# 在name對應的list中添加元素,每個新的元素都添加到列表的最左邊 lpush(name,values) r.lpush("list_name",2) r.lpush("list_name",3,4,5)#保存在列表中的順序為5,4,3,22.rpush 同lpush,但每個新的元素都添加到列表的最右邊
#同lpush,但每個新的元素都添加到列表的最右邊 rpush(name,values)3. lpushx 在name對應的list中添加元素,只有name已經存在時,值添加到列表的最左邊
#在name對應的list中添加元素,只有name已經存在時,值添加到列表的最左邊 lpushx(name,value)4. rpushx 在name對應的list中添加元素,只有name已經存在時,值添加到列表的最右邊
#在name對應的list中添加元素,只有name已經存在時,值添加到列表的最右邊 rpushx(name,value)5. llen name對應的list元素的個數
# name對應的list元素的個數 llen(name) print(r.llen("list_name"))6. linsert 在name對應的列表的某一個值前或后插入一個新值
# 在name對應的列表的某一個值前或后插入一個新值 linsert(name, where, refvalue, value)) r.linsert("list_name","BEFORE","2","SS")#在列表內找到第一個元素2,在它前面插入SS """參數: name: redis的name where: BEFORE(前)或AFTER(后) refvalue: 列表內的值 value: 要插入的數據"""7. r.lset 對list中的某一個索引位置重新賦值
#對list中的某一個索引位置重新賦值 r.lset(name, index, varlue) r.lset("list_name",0,"bbb")8. r.lrem 刪除name對應的list中的指定值
#刪除name對應的list中的指定值 r.lrem(name, value, num=0) r.lrem("list_name","ssss",2) """ 參數: name: redis的name value: 要刪除的值 num: num=0 刪除列表中所有的指定值; num=2 從前到后,刪除2個; num=-2 從后向前,刪除2個"""9. lpop 移除列表的左側第一個元素,返回值則是第一個元素
#移除列表的左側第一個元素,返回值則是第一個元素 lpop(name) print(r.lpop("list_name"))10. lindex 根據索引獲取列表內元素
#根據索引獲取列表內元素 lindex(name, index) print(r.lindex("list_name",1))11. lrange 分片獲取元素
#分片獲取元素 lrange(name, start, end) print(r.lrange("list_name",0,-1))12. ltrim 移除列表內沒有在該索引之內的值(裁剪)
#移除列表內沒有在該索引之內的值 ltrim(name, start, end) r.ltrim("list_name",0,2)13. rpoplpush(src, dst) 從一個列表取出最右邊的元素,同時將其添加至另一個列表的最左邊
# 從一個列表取出最右邊的元素,同時將其添加至另一個列表的最左邊 #src 要取數據的列表 #dst 要添加數據的列表四 Set 操作
#給name對應的集合中添加元素 r.sadd("set_name","aa") r.sadd("set_name","aa","bb")2. smembers(name) 獲取name對應的集合的所有成員
#獲取name對應的集合的所有成員3. scard(name) 獲取name對應的集合中的元素個數
#獲取name對應的集合中的元素個數 r.scard("set_name")4. sdiff(keys, *args) 在第一個name對應的集合中且不在其他name對應的集合的元素集合
#在第一個name對應的集合中且不在其他name對應的集合的元素集合 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對應集合的并集
# 獲取多個name對應集合的并集 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對應的集合內的元素
#檢查value是否是name對應的集合內的元素 sismember(name, value)9. smove(src, dst, value) 將某個元素從一個集合中移動到另外一個集合
#將某個元素從一個集合中移動到另外一個集合10. spop(name) 從集合的右側移除一個元素,并將其返回
#從集合的右側移除一個元素,并將其返回11. srandmember(name, numbers) 從name對應的集合中隨機獲取numbers個元素
# 從name對應的集合中隨機獲取numbers個元素 print(r.srandmember("set_name2",2))12. srem(name, values) 刪除name對應的集合中的某些值
#刪除name對應的集合中的某些值 print(r.srem("set_name2","bb","dd"))13. sunion(keys, *args) 獲取多個name對應的集合的并集
#獲取多個name對應的集合的并集 r.sunion("set_name","set_name1","set_name2")14. sunionstore(dest,keys, *args) 獲取多個name對應的集合的并集,并將結果保存到dest對應的集合中
#獲取多個name對應的集合的并集,并將結果保存到dest對應的集合中案例
社交圈子數據
在社交網站中,每一個圈子(circle)都有自己的用戶群。通過圈子可以找到有共同特征(比如某一體育活動、游戲、電影等愛好者)的人。當一個用戶加入一個或幾個圈子后,系統可以向這個用戶推薦圈子中的人。
? 我們定義這樣兩個圈子,并加入一些圈子成員。
>>> 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
有序集合:
在集合的基礎上,為每元素排序,元素的排序需要根據另外一個值來進行比較,所以,對于有序集合,每一個元素有兩個值,即:值和分數,分數專門用來做排序。
1. zadd(name, args, *kwargs)# 在name對應的有序集合中添加元素 r.zadd("zset_name", 6,"a1", 2, "a2", 5,"a3") #或 r.zadd("zset_name1", b1=10, b2=5)2. zcard(name) 獲取有序集合內元素的數量
#獲取有序集合內元素的數量3. zcount(name, min, max) 獲取有序集合中分數在[min,max]之間的個數
#獲取有序集合中分數在[min,max]之間的個數 print(r.zcount("zset_name",1,5))4. zincrby(name, value, amount) 自增有序集合內value對應的分數
#自增有序集合內value對應的分數 r.zincrby("zset_name","a1",amount=2)#自增zset_name對應的有序集合里a1對應的分數 r.zincrby("zset_name","a1") # 如果不指定a1 則自動創建a1,并將score設為1,再次執行則a1的score變為2,以此類推5. zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)
# 按照索引范圍獲取name對應的有序集合的元素 aa=r.zrange("zset_name",0,1,desc=False,withscores=True,score_cast_func=int) print(aa) """參數: name redis的name start 有序集合索引起始位置 end 有序集合索引結束位置 desc 排序規則,默認按照分數從小到大排序 withscores 是否獲取元素的分數,默認只獲取元素的值 score_cast_func 對分數進行數據轉換的函數"""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對應的有序集合中的排行位置(從0開始) print(r.zrank("zset_name", "a2")) print(r.zrevrank("zset_name", "a2"))#從大到小排序8. zscore(name, value) 獲取name對應有序集合中 value 對應的分數
#獲取name對應有序集合中 value 對應的分數 print(r.zscore("zset_name","a1"))9. zrem(name, values) 刪除name對應的有序集合中值是values的成員
#刪除name對應的有序集合中值是values的成員 r.zrem("zset_name","a1","a2")10. zremrangebyrank(name, min, max) 根據排行范圍刪除
#根據排行范圍刪除11. zremrangebyscore(name, min, max) 根據分數范圍刪除
#根據分數范圍刪除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集合,如果遇到相同值不同分數,則按照aggregate進行操作 # 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) 根據name刪除redis中的任意數據類型
#根據name刪除redis中的任意數據類型2. exists(name) 檢測redis的name是否存在
#檢測redis的name是否存在3. keys(pattern="*") 根據* ?等通配符匹配獲取redis的name
#根據* ?等通配符匹配獲取redis的name4. expire(name ,time) 為某個name設置超時時間
# 為某個name設置超時時間5. rename(src, dst) 重命名
# 重命名6. move(name, db)) 將redis的某個值移動到指定的db下
# 將redis的某個值移動到指定的db下7. randomkey() 隨機獲取一個redis的name(不刪除)
#隨機獲取一個redis的name(不刪除)8. type(name) 獲取name對應值的類型
# 獲取name對應值的類型
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41807.html
摘要:上一篇文章實戰第三章命令第五節有序集合下一篇文章實戰第三章命令第七節其他命令一般來說,發布與訂閱又稱的特點是訂閱者負責訂閱頻道,發送者負責向頻道發送二進制字符串消息。到目前為止,本書介紹的大多數命令都是與特定數據類型相關的。 上一篇文章:Python--Redis實戰:第三章:Redis命令:第五節:有序集合下一篇文章:Python--Redis實戰:第三章:Redis命令:第七節:其...
摘要:對字符串執行自增和自減操作的實例導入包包與本地進行鏈接,地址為,端口號為嘗試獲取一個不存在的鍵將得到一個值。上一篇文章實戰第二章使用構建應用第五節網頁分析下一篇文章實戰第三章命令第二節列表 上一篇文章: Python--Redis實戰:第二章:使用Redis構建Web應用:第五節:網頁分析下一篇文章:Python--Redis實戰:第三章:Redis命令:第二節:列表 在Redis里...
摘要:上一篇文章實戰第三章命令第六節發布與訂閱下一篇文章實戰第四章數據安全與性能保障第節持久化選項到目前為止,本章介紹了提供的種結構以及的發布與訂閱模式。 上一篇文章:Python--Redis實戰:第三章:Redis命令:第六節:發布與訂閱下一篇文章:Python--Redis實戰:第四章:數據安全與性能保障:第1節:持久化選項 到目前為止,本章介紹了Redis提供的5種結構以及Redi...
閱讀 3038·2021-09-22 15:52
閱讀 2911·2019-08-30 15:55
閱讀 2707·2019-08-30 15:53
閱讀 2460·2019-08-30 13:21
閱讀 1627·2019-08-30 13:10
閱讀 2486·2019-08-26 12:09
閱讀 2572·2019-08-26 10:33
閱讀 1809·2019-08-23 18:06