Python--Redis實戰:第一章:初識Redis:第二節:Redis數據結構簡介

上一篇文章: 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種結構,說明了這些結構存儲的值,並簡單介紹了他們的語音。redis

結構類型 結構存儲的值 結構的讀寫能力
STRING 能夠是字符串、整數、浮點數 對整個字符串或者字符串的其中一部分執行操做,對整數或浮點數執行自增(increment)或者自減(decrement)操做。
LIST 一個鏈表,鏈表上的每一個節點都包含了一個字符串 從鏈表的兩端推入或者彈出元素;根據偏移量對鏈表進行修剪(trim);讀取單個或者多個元素;根據值查找或則移除元素。
SET 包含字符串的無序收集器(unordered collection),而且被包含的每一個字符串都是獨一無2、各不相同 添加、獲取、移除單個元素;檢查一個元素是否存在於集合中;計算交集、並集、差集;從集合中隨機獲取元素
HASH 包含鍵值對的無序散列表 添加、獲取、移除單個鍵值對;獲取全部鍵值對。
ZSET(有序集合) 字符串成員(member)與浮點數分值(score)之間的有序映射,元素的排列順序由分值的大小決定 添加、獲取、刪除單個元素;根據分值範圍(range)或者成員來獲取元素。

字符串

Redis的字符串和其餘編程語言或者其餘鍵值存儲提供的字符串很是相似。編程

字符串擁有一些和其餘鍵值存儲類似的命令,例如:GET(獲取值)、SET(設置值)和DEL(刪除值)。segmentfault

下表展現了字符串的基本命令:數據結構

命令 行爲
GET 獲取存儲在給定鍵中的值
SET 設置存儲在給定鍵中的值
DEL 刪除存儲在給定鍵中的值(這個命令能夠用於全部類型)
實例:SET、GET、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)結構的支持使得它在鍵值存儲的世界中獨樹一幟,一個列表結構能夠有序的存儲多個字符串。code

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的集合和列表均可以存儲多個字符串,他們的不一樣在於,列表能夠存儲多個相同的字符串,而集合則經過使用散列表來保證本身存儲的每一個字符串都是各不相同的。rem

由於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-文章投票試煉
相關文章
相關標籤/搜索