Redis學習 - 入門

  業精於勤,荒於嬉;行成於思,毀於隨
            -- 韓愈·《進學解》
 
  由於工做中須要用到Redis,因此最近抽點時間看了一下,如今將學習的內容整理一下。
 
1、簡介
一、Redis是什麼?
  Redis是一個內存中的key-value型數據結構存儲系統,能夠用做數據庫、緩存和消息中間件。官方網站:redis.io,中文網站:redis.cn
 
二、爲何要使用Redis?
    - 多功能:可用做數據庫、緩存和消息中間件(用於進程間通訊);
    - 支持多種類型的數據結構,好比:strings、hashes、lists等;
    - 支持大多數的編程語言,好比:C/C++、Java、Python等;
    - 提供了不一樣級別的持久化(落地)方式來保證數據安全;
    - 經過redis哨兵和自動分區提供高可用性;
    - 原子操做,保證數據的正確性;
 
三、下載和安裝(debian)
下載: $ sudo apt-get install redis-server 
配置:redis的配置文件是 redis.conf ,文件中包含了全部可能用到的參數和詳細的解釋
啓動: $ redis-server 
鏈接: $ redis-cli 
 
2、支持的數據結構
  Redis是一種key-value存儲系統,而且Redis的key是二進制安全的,可使用任何的二進制序列做爲key,普通字符串甚至JPEG文件。redis支持多種類型的數據結構:strings、lists、sets、sorted sets、hashes、bitmaps、hyperloglogs。
 
一、strings - 字符串
strings類型的value和key同樣,能夠是任何類型的字符串。
1 示例:
2 > SET name aut   #設置 name 的值爲 aut
3 > GET name       #獲取 name 的值
4 > SET age 20     #設值
5 > INCR age       # num 自增 1
6 > MSET name aut age 20     #同時對多個key設值
用途舉例:計數器,存儲圖片等二進制文件
 
二、lists - 列表
一個key-value列表,支持兩端的添加和刪除、範圍內取值等操做
1 示例:
2 > RPUSH study redis     #右端插入
3 > LPOP study            #左端刪除
4 > LRANGE study 1 5      #取出範圍內的值,下標從0開始,-n表示倒數第n個位置
5 > LTRIM study 1 2       #從左邊截取指定長度
用途舉例:進程間通訊的消息隊列,博客引擎中存儲評論
 
三、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     #將指定字段遞增某個數值
用途舉例:存儲用戶信息、物品信息
 
四、sets - (無序)集合
sets用於存儲無序而且無重複的數據,提供了集合內的插入刪除,集合間的交併等操做
1 示例:
2 > SADD score 98 95 64    #插入元素
3 > SMEMBERS score         #獲取全部元素
4 > SISMEMBER score 80     #測試某個元素是否在集合中
5 > SINTER score1 score2   #獲取兩個集合的交集
6 > SRANDMEMBER score      #隨機獲取集合中的一個元素
用途舉例:存儲具備某種共同屬性的全部對象
 
五、sorted sets - (有序)集合
sorted sets使用一個浮點數score來對集合內的元素進行排序,當score相同時按字母序進行排序
1 示例:
2 > ZADD user 2547 aut     #插入元素,若是元素已經存在,則更新score
3 > ZRANGE user 0 -1       #獲取指定範圍內的元素
4 > ZRANK user aut         #獲取指定元素的排名
5 > ZRANGEBYSCORE user -inf 2000 withscores     #獲取score大於等於2000的元素,並把score一併打印出來
用途舉例:存儲排名信息
 
六、bitmaps - 位圖
bitmaps以位爲單位來實現某些標記功能,提供了設值/取值、統計等操做
1 示例:
2 > SETBIT key 10 1     #設置指定位爲1
3 > GETBIT key 10       #獲取指定位的值
4 > BITCOUNT key        #統計指定元素的位爲1的位數
用途舉例:標記用戶ID(是否已註冊、在線仍是離線)
 
七、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          #刪除key
3 > TYPE key         #檢測key的類型
4 > EXPIRE key 5     #設置key的有效時間爲5秒
5 > TTL key          #獲取key的剩餘有效時間
更多的命令使用方法請參閱 命令
 
3、磁盤持久化
  因爲 Redis 是一個內存中的數據結構存儲系統,全部數據都在內存中操做,當須要把數據永久保存下來的時候,就須要使用 Redis 持久化功能。持久化就是把數據從內存寫入到磁盤,也被稱爲「落地」,Redis 提供瞭如下幾種持久化方式:
    - RDB:在指定的時間間隔內對數據進行快照存儲;
    - AOF:在每次對記錄的寫操做以後都將操做命令寫入日誌文件;
    - 不使用持久化:記錄只在服務器運行時存在於內存;
 
一、RDB
  RDB持久化在指定的時間間隔內(或者知足某個指定條件時)將數據保存到一個名爲dump.rdb的二進制文件中。
工做方式:
  ①Redis fork 一個子進程;
  ②子進程將數據集寫入一個臨時RDB文件中;
  ③Redis 用新的RDB文件替換原來的RDB文件,並刪除舊文件。
優勢:
    - RDB文件緊湊且單一,能夠方便地傳送到其餘備份中心,適用於災難恢復;
    - 持久化工做由子進程完成,保證最大化Redis的性能;
    - 當恢復比較大的數據集的時候,因爲RDB是直接恢復,速度會更快一些(較AOF);
缺點:
    - 若是持久化間隔較大的話,容易丟失過多數據;
    - 而若是持久化太頻繁,則不斷的fork會嚴重下降Redis的性能;
使用建議:天天保存過去一段時間的數據,每小時保存過去24個小時的數據,再搭配AOF一塊兒使用。
 
二、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更合適。
 
(全文完)
相關文章
相關標籤/搜索