標籤:
業精於勤,荒於嬉;行成于思,毀於隨
-- 韓愈·《進學解》 因為工作中需要用到Redis,所以最近抽點時間看了一下,現在將學習的內容整理一下。
一、簡介1、Redis是什嗎? Redis是一個記憶體中的key-value型
資料結構儲存系統,可以用作資料庫、緩衝和訊息中介軟體。官方網站:redis.io,中文網站:redis.cn。 2、為什麼要使用Redis? - 多功能:可用作資料庫、緩衝和訊息中介軟體(用於處理序間通訊); - 支援多種類型的資料結構,比如:strings、hashes、lists等; - 支援大多數的程式設計語言,比如:C/C++、Java、Python等; - 提供了不同層級的持久化(落地)方式來保證資料安全; - 通過redis哨兵和自動分區提供高可用性; - 原子操作,保證資料的正確性; 3、下載和安裝(debian)下載: $ sudo apt-get install redis-server
配置:redis的設定檔是 redis.conf ,檔案中包含了所有可能用到的參數和詳細的解釋啟動: $ redis-server 串連: $ redis-cli
二、支援的資料結構 Redis是一種key-value儲存系統,並且Redis的key是二進位安全的,可以使用任何的二進位序列作為key,一般字元串甚至JPEG檔案。redis支援多種類型的資料結構:strings、lists、sets、sorted sets、hashes、bitmaps、hyperloglogs。 1、strings - 字串strings類型的value和key一樣,可以是任何類型的字串。
1 樣本:2 > SET name aut #設定 name 的值為 aut3 > GET name #擷取 name 的值4 > SET age 20 #設值5 > INCR age # num 自增 16 > MSET name aut age 20 #同時對多個key設值
用途舉例:計數器,儲存圖片等二進位檔案 2、lists - 列表一個key-value列表,支援兩端的添加和刪除、範圍內取值等操作
1 樣本:2 > RPUSH study redis #右端插入3 > LPOP study #左端刪除4 > LRANGE study 1 5 #取出範圍內的值,下標從0開始,-n表示倒數第n個位置5 > LTRIM study 1 2 #從左邊截取指定長度
用途舉例:處理序間通訊的訊息佇列,部落格引擎中儲存評論 3、hashes - 散列表hashes中的一個key可以對應一個包含多個“欄位 - 值”對的結構,其包含的“欄位 - 值”對數只受記憶體限制
1 樣本:2 > HMSET user:2547 name aut school xupt age 20 #設定欄位的值3 > HGET user:2547 name #擷取單個欄位的值4 > HMGET user:2547 name school #擷取多個欄位的值5 > HGETALL user:2547 #擷取所有欄位的值6 > HINCRBY user:2547 age 10 #將指定欄位遞增某個數值
用途舉例:儲存使用者資訊、物品資訊 4、sets - (無序)集合sets用於儲存無序並且無重複的資料,提供了集合內的插入刪除,集合間的交並等操作
1 樣本:2 > SADD score 98 95 64 #插入元素3 > SMEMBERS score #擷取所有元素4 > SISMEMBER score 80 #測試某個元素是否在集合中5 > SINTER score1 score2 #擷取兩個集合的交集6 > SRANDMEMBER score #隨機擷取集合中的一個元素
用途舉例:儲存具有某種共同屬性的所有對象 5、sorted sets - (有序)集合sorted sets使用一個浮點數score來對集合內的元素進行排序,當score相同時按字母序進行排序
1 樣本:2 > ZADD user 2547 aut #插入元素,如果元素已經存在,則更新score3 > ZRANGE user 0 -1 #擷取指定範圍內的元素4 > ZRANK user aut #擷取指定元素的排名5 > ZRANGEBYSCORE user -inf 2000 withscores #擷取score大於等於2000的元素,並把score一併列印出來
用途舉例:儲存排名資訊 6、bitmaps - 位元影像bitmaps以位為單位來實現某些標記功能,提供了設值/取值、統計等操作
1 樣本:2 > SETBIT key 10 1 #設定指定位為13 > GETBIT key 10 #擷取指定位的值4 > BITCOUNT key #統計指定元素的位為1的位元
用途舉例:標記使用者ID(是否登入、線上還是離線) 7、hyperloglogs - (不知道該怎麼翻譯~~)hyoerloglogs通過輸入元素計算出輸入元素的基數估算值,詳情參考:redis資料結構HyperLogLog
1 樣本:2 > PFADD str1 "apple" "banana" "cherry" #添加元素3 > PFCOUNT str1 #統計str1的近似基數4 > PFMERGE str1&2 str1 str2 #將str1和str2合并到str1&2中
用途舉例:統計訪問網站的獨立IP數量 其他常用操作:
1 > EXISTS key #檢查key是否存在2 > DEL key #刪除key3 > TYPE key #檢測key的類型4 > EXPIRE key 5 #設定key的有效時間為5秒5 > TTL key #擷取key的剩餘有效時間
更多的命令使用方法請參閱 命令
三、磁碟持久化 由於 Redis 是一個記憶體中的資料結構儲存系統,所有資料都在記憶體中操作,當需要把資料永久儲存下來的時候,就需要使用 Redis 持久化功能。持久化就是把資料從記憶體寫入到磁碟,也被稱為“落地”,Redis 提供了以下幾種持久化方式: - RDB:在指定的時間間隔內對資料進行快照儲存; - AOF:在每次對記錄的寫操作之後都將操作命令寫入記錄檔; - 不使用持久化:記錄只在伺服器運行時存在於記憶體; 1、RDB RDB持久化在指定的時間間隔內(或者滿足某個指定條件時)將資料儲存到一個名為dump.rdb的二進位檔案中。工作方式: ①Redis fork 一個子進程; ②子進程將資料集寫入一個臨時RDB檔案中; ③Redis 用新的RDB檔案替換原來的RDB檔案,並刪除舊檔案。優點: - RDB檔案緊湊且單一,可以方便地傳送到其他備份中心,適用於災難恢複; - 持久化工作由子進程完成,保證最大化Redis的效能; - 當恢複比較大的資料集的時候,由於RDB是直接恢複,速度會更快一些(較AOF);缺點: - 如果持久化間隔較大的話,容易丟失過多資料; - 而如果持久化太頻繁,則不斷的fork會嚴重降低Redis的效能;
使用建議:每天儲存過去一段時間的資料,每小時儲存過去24個小時的資料,再搭配AOF一起使用。 2、AOF AOF在每次執行完改變資料集的命令後(具體有不同的策略),都將該命令追加到AOF檔案的末尾,也就是儲存操作的命令,恢複時通過重新執行儲存的命令來恢複檔案。工作方式: ①Redis fork一個子進程,子進程建立新的AOF檔案; ②子進程將原來的AOF檔案內容寫入新檔案中; ③Redis將執行過的修改命令寫入新檔案中; ④Redis刪除舊檔案。優點: - 多種不同的fsync策略使得丟失的資料量降到最小; - AOF檔案僅僅是追加命令,所以節省空間的,並且容易被人讀懂,方便恢複; - Redis可以在AOF檔案體積變得過大時,自動在後台對AOF進行重寫,重寫後的AOF檔案僅僅包含了恢複當前資料集的最小命令集合;缺點: - 由於儲存的是命令,所以AOF檔案比RDB檔案要大; - 根據使用的fsync策略,AOF的速度可能會慢於RDB;
使用建議:使用每秒fsync的策略。 關於持久化的建議: - 如果資料只有在伺服器運行時存在,那麼不用選擇持久化; - 如果可以承受數分鐘內資料丟失,那麼可以只使用RDB持久化; - 如果要求資料即時更新,那麼可以使用每秒fsync策略的AOF持久化; - 具體可以根據應用情境將兩種持久化方式配合使用。
總結:根據網友資料得到下面的結論,參考地址:Redis與Memcached的區別 ①Redis的最佳使用情境是全部資料in-memory; ②Redis的更多情境是作為Memcached的替代者來使用; ③當需要更多的資料類型支援時,Redis更合適; ④當儲存的資料不能被剔除時,使用Redis更合適。 (全文完)
Redis學習 - 入門