想要看更加舒服的排版、更加準時的推送
關注公衆號「不太靈光的程序員」
每日八點有乾貨推送
同時發佈《【Redis數據結構 1序】1使用redis-py操做Redis數據庫》python
一個高性能的key-value數據庫本文依舊會對學習內容進行拆分,建議閱讀時間基本保持10分鐘內,
先學習以前章節內容點擊《你不瞭解的Redis》閱讀全部章節內容
【Redis數據結構】系列對經常使用String、List、Set、Sorted Set、Hashe和Stream6種類型進行介紹,並使用redis-py進行實踐操做。程序員
Redis的出現,很大程度補償了Memcached這類key-value存儲的不足,在部分場合能夠對關係數據庫起到很好的補充做用。redis
Redis和Memcached相似,它支持存儲的value類型相對更多,value經常使用的數據結構有String、List、Set、Sorted Set、Hashe、Stream 6種,固然不一樣類型有不一樣的特性,操做命令是不盡相同的。數據庫
redis-py是Python中操做Redis數據庫的經常使用模塊,模塊中命令函數基本上是與原命令命名一致,子命令都是做爲命令的參數使用。windows
例如 SET命令
語法格式 :SET key value [EX seconds] [PX milliseconds] [NX|XX]
對應的函數是:set(self, name, value, ex=None, px=None, nx=False, xx=False, keepttl=False)
注:keepttl 爲Redis 6.0 的特性,能夠暫不考慮
注:模塊的execute_command是實際調用原命令的函數緩存
咱們會結合python的redis模塊對這6種數據結構的操做進行講解,方便加深記憶。服務器
Redis命令命名有如下特色:markdown
例如:數據結構
Windows 下載 Redis-x64-3.0.501.zip 解壓
管理員權限使用cmd切換到解壓後的目錄下:運維
啓動後是這樣的:
注:建議安裝RedisDesktopManager幫助學習
在redis-py 2.X 中StrictRedis用於實現大部分官方的命令,Redis用於向後兼用舊版本,官方建議使用StrictRedis。
在redis-py 3.0 中StrictRedis只是Redis的一個別名,建議使用Redis。
redis-py 2.X 能夠接收任何類型的輸入並強制轉換爲字符串類型。
redis-py 3.0 僅接受用戶數據做爲字節、字符串、數字(int,long和float), 其餘類型將引起DataError異常。
在2.x中,當用戶輸入bool值或者None值是結果就不是預期的了,
會強制轉換爲「True」、「False」和「None」的字符串,這會致使各類隱藏錯誤類型。
SETEX、LREM、TTL和PTTL命令的參數順序發生變化。
MSET、MSETNX和ZADD命令的參數結構發生變化。
注:後文中的全部redis-py都指代redis-py3.0
正如上面提到的 StrictRedis只是Redis的一個別名,建議使用Redis。
redis-py 使用鏈接池來管理對一個redis server的全部鏈接,避免每次創建、釋放鏈接的開銷。
redis-py 使用管道在單個請求中將多個命令緩衝到服務器,能夠理解爲數據庫事務。
能夠經過減小客戶機和服務器之間來回傳輸的TCP數據包的數量來提升性能。
也能夠減小應爲客戶端宕機,致使的一個連續操做沒有完成而產生的異常。
實例:
pipe = r.pipeline() pipe.x ... pipe.execute()Hello World
咱們建立分別建立user:1000:message、user:1001:message、user_1002_message三個key,都保存字符串 Hello World 並讀取它們。
# coding=gbk # 導入redis 模塊 import redis redis_pool = redis.ConnectionPool( host='127.0.0.1', port=6379, db=0, password='cbs123', decode_responses=True ) r = redis.Redis(connection_pool=redis_pool) sr = redis.StrictRedis(connection_pool=redis_pool) # 將鍵key設定爲指定的"字符串"值 r.set("user:1000:message", "Hello World", ex=100) sr.set("user:1001:message", "Hello World") sr.set("user:1004:message", "Hello World", px=10000) sr.set("user_1002_message", "Hello World") # 獲取key對應的數值 r.get("user:1000:message") r.get("user:1001:message") r.get("user_1002_message") """ > True > True > True > Hello World > Hello World > Hello World """
咱們能夠看到key在RedisDesktopManager使用冒號分隔的key是作了層次劃分的
當咱們要使用的redis作數據表的重要數據緩存時,user:1000:message 能夠表示爲 user表的id爲1000的記錄中message的數據。
存儲的key很少的話還比較好維護,有上萬個key在同一級命名空間中維護起來仍是比較痛苦的。
key的定義規則是見名知意,格式統一便可。
固然你也能夠作其餘格式的定義,你能夠理解就好。
Redis通用命令見源代碼> 表示返回結果
# coding=gbk # 導入redis 模塊 import redis redis_pool = redis.ConnectionPool( host='127.0.0.1', port=6379, db=0, password='cbs123', decode_responses=True ) r = redis.Redis(connection_pool=redis_pool) # 通用操做 不區分 數據類型的 # EXISTS key 檢查key值是否存在,成功返回1,不成功返回0(key對應的值不存在) r.exists("user:1000:message") r.exists("user:1002:message") """ > 1 > 0 """ # TYPE key 返回key對應的值的類型,成功返回類型,不成功返回none(key對應的值不存在) r.type("user:1000:message") r.type("user:1002:message") """ > string > none """ # TTL key 返回key對應的剩餘存活時間,成功返回時長單位秒,不成功返回-1 key值不存在返回-2 r.ttl("user:1000:message") r.ttl("user:1001:message") r.ttl("user:1004:message") r.ttl("user:1002:message") """ > 100 > -1 > 10 > -2 """ # 設置超時時間,當時間到達後會被刪除 # EXPIRE key seconds 超時時間,當時間到達後會被刪除,單位秒 # PEXPIRE key milliseconds 超時時間,當時間到達後會被刪除,單位毫秒 r.expire("user:1000:message", 10) r.pexpire("user:1001:message", 10) """ > True > False > False """ # PERSIST key 刪除key對應的超時時間,成功返回True,不成功返回False(key對應的值不存在) r.persist("user:1000:message") r.persist("user:1001:message") r.persist("user:1002:message") """ > True > False > False """ # DEL key 刪除key對應的值,成功返回1,不成功返回0(key對應的值不存在) r.delete("user:1000:message") r.delete("user:1002:message") """ > 1 > 0 """推薦閱讀: