摘要:上一篇文章實戰第一章初識第一節簡介下一篇文章實戰第一章初識第三節你好文章投票試煉可以存儲鍵與種不同的數據結構類型之間的映射,這中數據結構類別分別是字符串列表集合散列和有序集合。
上一篇文章:Python--Redis實戰:第一章:初識Redis:第一節:Redis簡介
下一篇文章:Python--Redis實戰:第一章:初識Redis:第三節:你好Redis-文章投票試煉
Redis可以存儲鍵與5種不同的數據結構類型之間的映射,這5中數據結構類別分別是:STRING(字符串)、LIST(列表)、SET(集合)、HASH(散列)和ZZET(有序集合)。
大部分程序員應該都不會對STRING、LIST、HASH這三種結構感到陌生,因為他們和很多編程語言內建的字符串、列表和散列等結構在實現和語義(semantics)方面都非常類似。有些編程語言還有集合數據結構,在實現和語義上類似于Redis的SET。ZSET在某種程度上是一種Redis特有的結構,但是當你熟悉它之后,就會發現它也是一種非常有用的結構。下表對比了Redis提供的5種結構,說明了這些結構存儲的值,并簡單介紹了他們的語音。
結構類型 | 結構存儲的值 | 結構的讀寫能力 |
---|---|---|
STRING | 可以是字符串、整數、浮點數 | 對整個字符串或者字符串的其中一部分執行操作,對整數或浮點數執行自增(increment)或者自減(decrement)操作。 |
LIST | 一個鏈表,鏈表上的每個節點都包含了一個字符串 | 從鏈表的兩端推入或者彈出元素;根據偏移量對鏈表進行修剪(trim);讀取單個或者多個元素;根據值查找或則移除元素。 |
SET | 包含字符串的無序收集器(unordered collection),并且被包含的每個字符串都是獨一無二、各不相同 | 添加、獲取、移除單個元素;檢查一個元素是否存在于集合中;計算交集、并集、差集;從集合中隨機獲取元素 |
HASH | 包含鍵值對的無序散列表 | 添加、獲取、移除單個鍵值對;獲取所有鍵值對。 |
ZSET(有序集合) | 字符串成員(member)與浮點數分值(score)之間的有序映射,元素的排列順序由分值的大小決定 | 添加、獲取、刪除單個元素;根據分值范圍(range)或者成員來獲取元素。 |
Redis的字符串和其他編程語言或者其他鍵值存儲提供的字符串非常類似。
字符串擁有一些和其他鍵值存儲相似的命令,例如:GET(獲取值)、SET(設置值)和DEL(刪除值)。
下表展示了字符串的基本命令:
命令 | 行為 |
---|---|
GET | 獲取存儲在給定鍵中的值 |
SET | 設置存儲在給定鍵中的值 |
DEL | 刪除存儲在給定鍵中的值(這個命令可以用于所有類型) |
import redis #導入redis包包 #與本地redis進行鏈接,地址為:localhost,端口號為6379 r=redis.StrictRedis(host="localhost",port=6379) print(r.set("Hello","World"))#SET命令執行成功,會返回OK,在Python中返回True print(r.get("Hello")) #獲取指定鍵【Hello】對應的值 r.delete("Hello") #刪除 print(r.get("Hello"))
結果
True b"World" None列表
Redis對鏈表(linked-list)結構的支持使得它在鍵值存儲的世界中獨樹一幟,一個列表結構可以有序的存儲多個字符串。
Redis列表可執行的操作和很多編程語言里面的列表操作非常相似,下標列出了列表命令:
命令 | 行為 |
---|---|
RPUSH | 將給定值推入列表的右端 |
LPUSH | 將給定值推入列表的左端 |
LRANGE | 獲取列表在給定范圍內的所有值 |
LINDEX | 獲取列表在給定位置上的單個元素 |
LPOP | 從列表的左端彈出一個值,并返回被彈出的值 |
RPOP | 從列表的右端彈出一個值,并返回被彈出的值 |
import redis #導入redis包包 #與本地redis進行鏈接,地址為:localhost,端口號為6379 r=redis.StrictRedis(host="localhost",port=6379) r.delete("list-key") print(r.rpush("list-key","item1")) #向列表推入新的元素,語句返回列表執行該語句后的長度 print(r.rpush("list-key","item2")) #向列表推入新的元素,語句返回列表執行該語句后的長度 print(r.lrange("list-key",0,-1)) #0為起始索引,-1表示列表結束索引,這樣就可以取出列表的所有元素 print(r.lindex("list-key",1)) #lindex取出單個元素
結果
1 2 [b"item1", b"item2"] b"item2"集合
Redis的集合和列表都可以存儲多個字符串,他們的不同在于,列表可以存儲多個相同的字符串,而集合則通過使用散列表來保證自己存儲的每個字符串都是各不相同的。
因為Redis的集合使用無序(unordered)方式存儲元素,所以不能像使用列表那樣,將元素推入集合的某一端,或者從集合的某一端彈出元素。
下表列出了集合的命令:
命令 | 行為 |
---|---|
sadd | 將給定元素添加到集合 |
smembers | 返回集合包含的所有元素,如果集合包含的元素非常多,那么該命令的執行速度可能會很慢 |
sismember | 檢查給定元素是否存在于集合中 |
srem | 如果給定集合存在于集合中,那么移除這個元素 |
import redis #導入redis包包 #與本地redis進行鏈接,地址為:localhost,端口號為6379 r=redis.StrictRedis(host="localhost",port=6379) r.delete("set-key") print(r.sadd("set-key","item1")) #向集合中添加新的元素,語句返回1表示這個元素被成功添加到集合中,返回0則表示這個元素已經存在集合中 print(r.sadd("set-key","item2")) #向集合中添加新的元素,語句返回1表示這個元素被成功添加到集合中,返回0則表示這個元素已經存在集合中 print(r.sadd("set-key","item3")) #向集合中添加新的元素,語句返回1表示這個元素被成功添加到集合中,返回0則表示這個元素已經存在集合中 print(r.sadd("set-key","item3")) #向集合中添加新的元素,語句返回1表示這個元素被成功添加到集合中,返回0則表示這個元素已經存在集合中 print(r.smembers("set-key")) #返回集合包含的所有元素 print(r.sismember("set-key","item1")) #判斷一個元素是否存在于集合匯總 print(r.sismember("set-key","item4")) #判斷一個元素是否存在于集合匯總 print(r.srem("set-key","item1")) #如果指定元素在集合中存在,就移除,結果返回移除元素的數量 print(r.srem("set-key","item4")) #如果指定元素在集合中存在,就移除,結果返回移除元素的數量 print(r.smembers("set-key")) #返回集合包含的所有元素
結果:
1 1 1 0 {b"item2", b"item3", b"item1"} True False 1 0 {b"item2", b"item3"}散列
Redis的散列可以存儲多個鍵值對之間的映射。和字符串一樣,散列存儲的值既可以是字符串也可以是數字值,并且同樣可以對散列存儲的數字值執行自增操作或者自減操作。
下表列出了散列的命令:
命令 | 行為 |
---|---|
hset | 在散列里面關聯給定的鍵值對 |
hget | 獲取指定散列鍵的值 |
hgetall | 獲取散列包含的所有鍵值對 |
hdel | 如果給定鍵存在于散列中,那么移除這個鍵 |
import redis #導入redis包包 #與本地redis進行鏈接,地址為:localhost,端口號為6379 r=redis.StrictRedis(host="localhost",port=6379) r.delete("hash-key") print(r.hset("hash-key","sub-key1","value1")) #如果返回1,表示散列中不存在該鍵值對,返回0表示存在該鍵值對 print(r.hset("hash-key","sub-key2","value2")) #如果返回1,表示散列中不存在該鍵值對,返回0表示存在該鍵值對 print(r.hset("hash-key","sub-key1","value1")) #如果返回1,表示散列中不存在該鍵值對,返回0表示存在該鍵值對 print(r.hgetall("hash-key")) print(r.hdel("hash-key","sub-key1")) #如果存在,就刪除返回1,不存在返回0 print(r.hdel("hash-key","sub-key3")) #如果存在,就刪除返回1,不存在返回0 print(r.hget("hash-key","sub-key2")) print(r.hgetall("hash-key"))
結果:
1 1 0 {b"sub-key1": b"value1", b"sub-key2": b"value2"} 1 0 b"value2" {b"sub-key2": b"value2"}有序集合
有序集合和散列一樣,都用于存儲鍵值對:有序集合的鍵被稱為【成員】(member),每個成員都是各不相同的;而有序集合的值則被稱為【分值】(score),分值必須為浮點數。
有序集合是Redis里面唯一一個既可以根據成員訪問元素(這一點和散列表一樣),又可以根據分值以及分值的排列順序來訪問元素的結構。
下表列出了有序集合的命令
命令 | 行為 |
---|---|
zadd | 將一個帶有給定分值的成員添加到有序集合里面 |
zrange | 根據元素在有序排列中所處的位置,從有序集合里面獲取多個元素。 |
zrangebyscore | 獲取有序集合在給定分值范圍內的所有元素 |
zrem | 如果給定元素存在于有序集合,那么移除這個成員。 |
import redis #導入redis包包 #與本地redis進行鏈接,地址為:localhost,端口號為6379 r=redis.StrictRedis(host="localhost",port=6379) r.delete("zset-key") print(r.zadd("zset-key",7,"member1")) #返回添加元素的數量 print(r.zadd("zset-key",9,"member2")) #返回添加元素的數量 print(r.zadd("zset-key",8,"member3")) #返回添加元素的數量 print(r.zadd("zset-key",7,"member3")) #返回添加元素的數量,如果存在就覆蓋值 print(r.zrange("zset-key",0,-1)) #h獲取有序集合所包含的所有元素,多個元素或安裝分值大小進行排序 print(r.zrangebyscore("zset-key",0,7)) #根據分值來獲取集合中的一部分元素 print(r.zrem("zset-key","member1")) #返回移除元素的數量 print(r.zrange("zset-key",0,-1)) #h獲取有序集合所包含的所有元素,多個元素或安裝分值大小進行排序
結果:
1 1 1 0 [b"member1", b"member3", b"member2"] [b"member1", b"member3"] 1 [b"member3", b"member2"]
上一篇文章:Python--Redis實戰:第一章:初識Redis:第一節:Redis簡介
下一篇文章:Python--Redis實戰:第一章:初識Redis:第三節:你好Redis-文章投票試煉
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/42514.html
摘要:上一篇文章實戰安裝下一篇文章實戰第一章初識第二節數據結構簡介是一個遠程內存數據庫,它不僅性能強勁,而且還具有復制特性以及為解決問題而生的獨一無二的數據模型,是一個速度非??斓姆顷P系數據庫。 上一篇文章:Pyhton--Redis實戰:Mac brew安裝redis下一篇文章:Python--Redis實戰:第一章:初識Redis:第二節:Redis數據結構簡介 Redis是一個遠程內...
摘要:為了防止用戶對同一篇文章進行多次投票,網站需要為每一篇文章記錄一個已投票用戶名單。上一篇文章實戰第一章初識第二節數據結構簡介下一篇文章實戰第二章使用構建應用第一節登錄和緩存 上一篇文章: Python--Redis實戰:第一章:初識Redis:第二節:Redis數據結構簡介下一篇文章:Python--Redis實戰:第二章:使用Redis構建Web應用:第一節:登錄和cookie緩存 ...
閱讀 1449·2023-04-25 16:31
閱讀 2053·2021-11-24 10:33
閱讀 2753·2021-09-23 11:33
閱讀 2542·2021-09-23 11:31
閱讀 2923·2021-09-08 09:45
閱讀 2348·2021-09-06 15:02
閱讀 2657·2019-08-30 14:21
閱讀 2323·2019-08-30 12:56