1 什麼是Redis
Redis(REmote DIctionary Server,遠程數據字典服務器)是開源的內存數據庫,經常使用做緩存或者消息隊列。redis
Redis的特色:
- Redis存在於內存,使用硬盤做爲持久化;每秒十萬讀寫。
- 具備豐富的數據結構,字符串、哈希表、列表、集合、有序集合;提供交集、並集、差集等操做。
- 設置TTL存活時間,到期自動刪除。
- Redis單線程、Memcached多線程;對於通常的應用場景,單線程也足夠使用,優點仍是在於多數據類型、持久化。
- 能夠將數據複製到任意數量的從服務器。
2 Redis中的數據結構
字符串
- SET keyname value 設置鍵值keyname的值是value
- KEYS * 獲取全部的鍵值
- GET keyname 獲取keyname的值
- EXISTS keyname 判斷是否存在鍵值keyname
- DEL keyname 刪除鍵值keyname
- TYPE keyname 判斷keyname的類型(string字符串,hash哈希表,list列表,set集合,zset有序集合)
哈希表
- HSET keyname key value 添加一個哈希屬性和值
- HGET keyname key 獲取值
- HKEYS keyname 獲取所有的key值
- HVALS keyname 獲取所有的value值
- HGETALL keyname 獲取全部的值
列表
經過雙向鏈表實現,頭尾操做均爲O(1),獲取指定元素比較慢。數據庫
- LPUSH keyname value1或者LPUSH keyname value1 value2 在左邊插入
- RPUSH keyname value2 在右邊插入
- LRANGE keyname 0 -1 查詢全部的元素
- LPOP keyname
- RPOP keyname
集合
元素惟一,可是沒有順序。使用值爲空的哈希表實現,操做都是O(1)。緩存
- SADD keyname value1 value2 添加值
- SREM keyname value1 刪除
- SMEMBERS keyname查詢全部元素
有序集合
使用哈希和跳躍表實現,中間速度也很快。服務器
- ZADD keyname key value 添加
- ZRANGE keyname start end 獲取指定範圍的元素
與列表的比較:數據結構
相同:多線程
不一樣:app
- 列表經過雙向鏈表實現,兩端數據存取極快,中間緩慢
- 有序集合經過哈希和跳躍表實現,中間速度也很快,爲O(log(N))
- 列表不能簡單地調整某個元素的位置,有序集合能夠
- 有序集合比列表更好費內存
3 Redis持久化
Redis提供了兩種持久化方式:1 RDB快照方式 2 AOF方式優化
RDB方式:線程
知足必定條件時,會建立一個子進程,複製當前的數據,把數據寫入到硬盤中某個文件,寫入完成後替換原來的存儲文件。數據通常存儲在dump.rdb中。UNIX系統中支持寫時複製,即剛開始會執行持久化寫入磁盤的操做,若是此時有其餘的數據發生改變,就複製一份數據執行。隊列
除了這種自動的快照方式,還支持命令方式持久化:
- SAVE:經過阻塞的方式,用父進程來持久化,此時沒法執行其餘的請求。
- BGSAVE:經過fork子進程的方式,持久化。
AOF方式:
每次操做都會記錄命令,這樣會形成某些命令的冗餘,好比添加了一個屬性,再刪除,那麼這兩個操做都是冗餘的。redis提供了一些優化,因此能夠避免這些冗餘信息。命令記錄在appendonly.aof中
4 Redis的消息隊列
Redis用於消息隊列,一般有兩種種使用方式:
LIST:基於列表的方式,全部的消費者數據加起來是列表中的全部數據.
發佈/訂閱:每一個消費者訂閱獨立的channel,每一個數據都是獨立的。