Redis資料型別與持久化方式
Redis是一個開源的記憶體儲存的資料結構資料庫,它可以作為資料庫,快取,訊息佇列。支援多種資料格式。和mc相比具有資料持久化的能力。並能通過哨兵和叢集提高可用性。
它具有以下資料型別:
字串型別
在Redis裡面採用的是SDS來封裝char[]的,這個也是redis的最小儲存單元。RedisObject是redis的基本資料型別,對照C#中的Object物件。而字串型別就是在RedisObject基礎上封裝的程式碼。
其中的incr,incrby命令可以實現原子自增,用它來生成唯一訂單號比較方便。因為如果在當前伺服器生成一個訂單號,如果面對高併發的情況有可能會產生兩個相同的訂單號。
不同型別均可呼叫的命令:
Exists key可以檢測鍵是否存在
Type key 可返回key對應值的儲存型別
Expires key seconds 可設定key的存在時間
Persist key 可設定key為持久化
TTL key 返回key剩餘的存在時間
列表型別
List型別按照插入順序排序,最常用作訊息佇列,常用的就四個方法LPOP,LPUSH,RPOP,RPUSH。我們可將能夠非同步處理的請求放到訊息佇列中去。
雜湊型別
Redis中的雜湊型別,可以用來存放物件了,類似與C#中的Dictionary以鍵值對的形式存放資料
集合型別
集合型別是雜湊型別的“簡易版”,它比Dictionary節省很多記憶體消耗,類似C#的HashSet型別。底層資料結構和雜湊型別類似,只是value為null,所以key不能重複,且無序。
有序集合型別
有序集合和雜湊型別的最大區別就是範圍查詢時它的時間複雜度為O(logN) + M,後者為O(N)。它的每一個字串元素都會關聯到score,裡面的元素總是通過score進行排序。
事務
Multi,Exec,Discard,Watch是Redis的事務命令。事務一般分為3個步驟:生成事務(Multi),生成命令
Redis中沒有回滾的說法。因為Redis命令只有在因語法錯誤而失敗,或是命令用在了錯誤型別的鍵上面。這也就是說是由於程式設計錯誤造成的。而且不支援回滾也可以讓Redis保持快速且簡單。
假如在你執行命令的過程中,要修改的那些資料發生了改變,那我執行的命令有什麼用呢?所以Watch命令就是為此而生的。Watch命令的作用就是假如在multi之後exec之前這段時間裡key的值發生了修改,那麼exec就會失敗。你只需要在multi之前用watch去監視key就行。
訂閱/釋出
很多的訊息佇列都有這個功能,比較常見的場景是郵件訂閱,比如你訂閱了某個作者的部落格,如果博主發了文章那麼那些訂閱了它的讀者就能收到通知。
常見的命令就兩個:subscribe channel 訂閱頻道,publish channel message 給指定頻道釋出訊息
還有一個就是psubscribe pattern 訂閱複合模式的頻道。
持久化
Redis有兩種持久化方式RDB(也叫快照)和AOF。快照指的是每隔一段時間就對你的資料進行一次儲存。AOF則會記錄每一次對伺服器的寫入操作,當伺服器重啟時會重新執行這些命令恢復原始資料,而且redis還會對aof檔案進行重寫防止過大。
你可以同時開啟兩種持久化方式。
快照的優點是可以最大化redis的效能,缺點是可能會丟失幾秒鐘甚至幾分鐘的資料。
AOF的優點是讓redis更加耐久,預設是每秒儲存一次資料,缺點是AOF的速度可能會比快照慢一些。
快照的配置方法可為:在配置檔案SNAPSHOTTING節中,標記save seconds change,後面再設定以下儲存的位置即可。
AOF的配置方法為:在配置檔案的APPEND ONLY MODE節中,設定appendonly yes(預設配置),再指定儲存檔案,儲存頻率,這裡推薦採用預設配置appendfsync everysec即可。