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