redis的特性
承接上文redis入門篇,本文具體介紹一下redis的特性,以及與另外一個nosql數據庫memcached的對比。
一、redis的優點
根據上文,我們知道redis的如下特性成爲了他的競爭力:
- key-value對應的內存數據庫,高效。
- value支持着五種豐富的數據類型,更加強大,memcache只是簡單地key-value存儲,但value的數據類型單一。
- 操作原子性(redis的每一個指令都是具有原子性的),支持簡單的事務(更類似於批處理,因爲不支持回滾)。
- 豐富的指令集合,可以設置key的過期時間等。
二、redis的高級特性
- redis有虛擬內存的概念,可以將不常訪問的數據放入磁盤,相對於memcache來說,它不是完全的內存數據庫。
- redis支持持久化操作,memcache不支持。
- redis支持主從同步配置,支持集羣搭建。
三、redis的持久化策略
redis有兩種持久化方案快照,RDB和aof:
1、快照
redis默認使用快照的方式持久化,當滿足一定條件時,redis就會將內存中的數據持久化到硬盤中,可在redis.conf中配置,如下:
save 900 1表示在900s內,如果至少有一條寫操作,就會發生持久化操作。
持久化文件爲二進制文件,是在redis的安裝目錄底下的rdb結尾文件:
若是redis突然宕機,此方法會丟失最後一次快照後修改的內容,具有不可靠性。
2、aof(日誌追加方式)
該方法需要手動開啓,將配置文件中的appendonly設置爲yes,默認是no:
開啓以後,持久化的文件爲appendonly.aof,也在redis的安裝路徑底下。
同時的,也可以設置append發生時機,有如下三種:
分別代表每一次寫操作都持久化,每一秒執行一次持久化,以及第三種方式,完全依賴操作系統,性能最好,持久化沒保證。
aof方式會將每一次寫的命令都寫進文件中,也就意味着,文件會越來越大,如,當操作了一百次incr時,就會記錄一百條該指令進持久化文件,但實際上,只需要記錄一條set就可以了。
兩者孰優孰劣很難確定,後者用性能換可靠,前者用青春賭明天(啊呸,是可靠換性能)。
四、redis的主從同步
redis支持一個master可以配多個slave服務器,master服務器的數據將會被同步到slave上,可以大大地提高讀性能。
配置slave的方式很簡單,只需要在slave的配置文件中寫slaveof的ip地址加端口號即可:
可以禁用主節點的持久化,以提高性能。
主從複製不會阻塞主節點,但是會阻塞從節點,從節點阻塞時無法響應客戶端請求。
redis的哨兵機制
redis主從同步會有一個問題--若是主節點宕機,主從複製就扯淡了。
這時,可以起一個哨兵服務,來監控主節點的狀態,當主節點發生故障時,可以讓從節點轉化爲主節點。
需要注意的是,哨兵最好應該是奇數個,因爲,當有哨兵監控到主節點故障,會發生選舉,即,多個哨兵節點通過投票選舉是否讓發現故障的哨兵節點處理這次主節點轉移。
五、redis的應用場景
- 實現會話緩存(session cache)
- 隊列,由於redis中value數據結構的特性,可以實現一些緩存隊列
- 排行榜,同樣的sorted set能輕易地幫我們實現這一功能
- 發佈/訂閱,redis支持這一特性,但是使用較少