數據類型
String
List
Set
Hash
Zset
使用場景
計數器
緩存
查找表
消息隊列
會話緩存
分佈式鎖實現
其它
數據淘汰策略
持久化
RDB 持久化
AOF 持久化
經常使用命令
簡介
Redis是開源的內存數據庫,它能夠用做數據庫、緩存和消息中間件。數據庫
Redis與其餘key-value 緩存產品有如下三個特色
Redis支持數據的持久化,能夠將內存中的數據保存在磁盤中,重啓的時候能夠再次加載進行使用。
Redis不只僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
Redis支持數據的備份,即master-slave模式的數據備份。緩存
數據類型
數據類型 | 能夠存儲的值 | 操做 |
---|---|---|
STRING | 字符串、整數或者浮點數 | 對整個字符串或者字符串的其中一部分執行操做對整數和浮點數執行自增或者自減操做 |
LIST | 列表 | 從兩端壓入或者彈出元素 對單個或者多個元素進行修剪,只保留一個範圍內的元素 |
SET | 無序集合 | 添加、獲取、移除單個元素 檢查一個元素是否存在於集合中計算交集、並集、差集從集合裏面隨機獲取元素 |
HASH | 包含鍵值對的無序散列表 | 添加、獲取、移除單個鍵值對獲取全部鍵值對檢查某個鍵是否存在 |
ZSET | 有序集合 | 添加、獲取、刪除元素 |
String
> set hello world OK > get hello "world" > del hello (integer) 1 > get hello (nil)
List
> rpush list-key item (integer) 1 > rpush list-key item2 (integer) 2 > rpush list-key item (integer) 3 > lrange list-key 0 -1 1) "item" 2) "item2" 3) "item" > lindex list-key 1 "item2" > lpop list-key "item" > lrange list-key 0 -1 1) "item2" 2) "item"
Set
> sadd set-key item (integer) 1 > sadd set-key item2 (integer) 1 > sadd set-key item3 (integer) 1 > sadd set-key item (integer) 0 > smembers set-key 1) "item" 2) "item2" 3) "item3" > sismember set-key item4 (integer) 0 > sismember set-key item (integer) 1 > srem set-key item2 (integer) 1 > srem set-key item2 (integer) 0 > smembers set-key 1) "item" 2) "item3"
Hash
> hset hash-key sub-key1 value1 (integer) 1 > hset hash-key sub-key2 value2 (integer) 1 > hset hash-key sub-key1 value1 (integer) 0 > hgetall hash-key 1) "sub-key1" 2) "value1" 3) "sub-key2" 4) "value2" > hdel hash-key sub-key2 (integer) 1 > hdel hash-key sub-key2 (integer) 0 > hget hash-key sub-key1 "value1" > hgetall hash-key 1) "sub-key1" 2) "value1"
Zset
> zadd zset-key 728 member1 (integer) 1 > zadd zset-key 982 member0 (integer) 1 > zadd zset-key 982 member0 (integer) 0 > zrange zset-key 0 -1 withscores 1) "member1" 2) "728" 3) "member0" 4) "982" > zrangebyscore zset-key 0 800 withscores 1) "member1" 2) "728" > zrem zset-key member1 (integer) 1 > zrem zset-key member1 (integer) 0 > zrange zset-key 0 -1 withscores 1) "member0" 2) "982"
使用場景
計數器
能夠對 String 進行自增自減運算,從而實現計數器功能。
Redis 這種內存型數據庫的讀寫性能很是高,很適合存儲頻繁讀寫的計數量。服務器
緩存
將熱點數據放到內存中,設置內存的最大使用量以及淘汰策略來保證緩存的命中率。數據結構
查找表
例如 DNS 記錄就很適合使用 Redis 進行存儲。
查找表和緩存相似,也是利用了 Redis 快速的查找特性。可是查找表的內容不能失效,而緩存的內容能夠失效,由於緩存不做爲可靠的數據來源。dom
消息隊列
List 是一個雙向鏈表,能夠經過 lpush 和 rpop 寫入和讀取消息
不過最好使用 Kafka、RabbitMQ 等消息中間件。分佈式
會話緩存
可使用 Redis 來統一存儲多臺應用服務器的會話信息。
當應用服務器再也不存儲用戶的會話信息,也就再也不具備狀態,一個用戶能夠請求任意一個應用服務器,從而更容易實現高可用性以及可伸縮性。性能
分佈式鎖實現
在分佈式場景下,沒法使用單機環境下的鎖來對多個節點上的進程進行同步。
可使用 Redis 自帶的 SETNX 命令實現分佈式鎖,除此以外,還可使用官方提供的 RedLock 分佈式鎖實現。spa
其它
Set 能夠實現交集、並集等操做,從而實現共同好友等功能。
ZSet 能夠實現有序性操做,從而實現排行榜等功能。操作系統
數據淘汰策略
策略 | 描述 |
---|---|
volatile-lru | 從已設置過時時間的數據集中挑選最近最少使用的數據淘汰 |
volatile-ttl | 從已設置過時時間的數據集中挑選將要過時的數據淘汰 |
volatile-random | 從已設置過時時間的數據集中任意選擇數據淘汰 |
allkeys-lru | 從全部數據集中挑選最近最少使用的數據淘汰 |
allkeys-random | 從全部數據集中任意選擇數據進行淘汰 |
noeviction | 禁止驅逐數據 |
持久化
RDB 持久化
將某個時間點的全部數據都存放到硬盤上。
能夠將快照複製到其它服務器從而建立具備相同數據的服務器副本。
若是系統發生故障,將會丟失最後一次建立快照以後的數據。
若是數據量很大,保存快照的時間會很長。code
AOF 持久化
將寫命令添加到 AOF 文件(Append Only File)的末尾。
使用 AOF 持久化須要設置同步選項,從而確保寫命令同步到磁盤文件上的時機。這是由於對文件進行寫入並不會立刻將內容同步到磁盤上,而是先存儲到緩衝區,而後由操做系統決定何時同步到磁盤。有如下同步選項:
選項 | 同步頻率 |
---|---|
always | 每一個寫命令都同步 |
everysec | 每秒同步一次 |
no | 讓操做系統來決定什麼時候同步 |
always | 選項會嚴重減低服務器的性能; |
everysec | 選項比較合適,能夠保證系統崩潰時只會丟失一秒左右的數據,而且 Redis 每秒執行一次同步對服務器性能幾乎沒有任何影響; |
no | 選項並不能給服務器性能帶來多大的提高,並且也會增長系統崩潰時數據丟失的數量。 |
隨着服務器寫請求的增多,AOF 文件會愈來愈大。Redis 提供了一種將 AOF 重寫的特性,可以去除 AOF 文件中的冗餘寫命令。
經常使用命令
#ttl Redis TTL 命令以秒爲單位返回 key 的剩餘過時時間。 #expire Redis Expire 命令用於設置 key 的過時時間。key 過時後將再也不可用。每次從新獲取過時時間都會重置。 #PERSIST Redis PERSIST 命令用於移除給定 key 的過時時間,使得 key 永不過時。 #Pttl Redis Pttl 命令以毫秒爲單位返回 key 的剩餘過時時間。