redis-server:redis 服務端,用於啓動 redis 服務
redis-cli:redis 命令行客戶端,能夠直接鏈接到 redis 服務,提供了豐富的鍵值操做的命令
redis-benchmark: redis 提供的性能測試工具
redis-check-aof:aof 文件修復工具
redis-check-dump:adb 文件檢查工具
redis-sentinel:哨兵服務器,能夠啓動哨兵用於監控 redis 服務的運行狀況
複製代碼
redis 默認支持 16 個數據庫,能夠經過啓動參數 databases 來修改該值
數據庫編號從 0 開始,不支持自定義名稱
在客戶端能夠經過 select 來隨時切換數據庫
數據庫之間的數據不是徹底隔離的,咱們能夠經過 flushAll 命令清空一個實例下全部數據庫的數據
這些數據庫更像一個命名空間,不適合存放不一樣應用下的數據
複製代碼
字符串類型的鍵容許存放的最大數據類型爲 512 M,經常使用命令以下:php
SET key value # 設置鍵值
GET key # 獲取鍵值
INCR numKey # 讓鍵值遞增,返回遞增後的數值,鍵值非數字會報錯,不存在時默認爲 0
INCRBY numKey num # 和 INCR 相似,支持每次動態加指定數值的數據
DECR numKey # 自減
DECRBY numKey num # 減小指定數值
INCRBYFLOAT numKey num # 增長指定的浮點數值
APPEND key value # 向尾部追加值,返回追加後的字符長度
STRLEN key # 返回鍵值的字符串長度
MSET/MGET # 和 GET/SET 相似,批量設置和獲取
GETBIT key offset # 獲取一個字符串指定位置的二進制值
SETBIT key offset value # 設置指定位置的二進制的值
BITCOUNT key # 統計鍵值對應的二進制位數
BITOP operation destkey key1... # 對多個鍵 key1,key2... 對應的值進行位運算,並存儲在 destkey 鍵對應的值中
複製代碼
散列類型的鍵值是也是一種字典類型,存儲了字段和字段值的映射關係,字段值只支持字符串,散列類型適合存儲對象,能夠每次獲取或者更新某個屬性的值,減小解析整個對象的時間,經常使用命令以下:mysql
HSET key field value # 設置散列類型 key 對應的對象的某個屬性
HGET key field # 獲取散列類型 key 對應的對象的某個屬性
HMSET key field value ... # 批量設置散列類型 key 對應的多個屬性的值
HMGET key field ... # 批量獲取散列類型 key 對應的多個屬性的值
HGETALL key # 獲取散列類型中某個 key 對應的全部屬性及值,也就是整個對象
HEXISTS key field # 判斷散列類型中某個字段是否存在
HSETNX key field value # 判斷散列類型中某個字段是否存在,不存在則賦值
HDEL key field ... # 刪除散列類型中對象裏的一個或者多個字段
HKEYS key # 獲取散列類型中對象裏的全部字段屬性名
HVALS key # 獲取散列類型中對象裏的全部字段屬性對應的值
HLEN # 獲取散列類型中對象裏的字段數量
複製代碼
列表類型能夠存儲一個有序的字符串列表,經常使用的操做是向列表兩頭添加元素或者列表某個片斷,列表類型使用雙向鏈表實現,訪問首尾元素的速度很是快,經常使用命令以下:redis
LPUSH key value1 value2... # 向列表左邊增長多個元素
RPUSH key value1 value2... # 向列表右邊增長多個元素
LPOP key # 從列表左邊彈出一個元素
RPOP key # 從列表右邊彈出一個元素
BRPOP key # 與 RPOP 相似,只是若是列表中沒有元素時會一直等待直到新元素加入,能夠接受多個 key 值,優先使用第一個 key
BLPOP key... # 與 BRPOP 相似
LLEN key # 獲取列表中元素個數,時間複雜度爲O(1)
LRANGE key start stop # 獲取列表中從 start 到 stop 之間的元素,從 0 開始索引
LREM key count value # 刪除列表中前 count 個值爲 value 的元素,count>0 從左邊刪除,count<0 從右邊刪除,count=0 所有刪除
LINDEX key index # 獲取列表中指定索引的元素
LSET key index value # 設置列表中指定索引的元素
LTRIM key start end # 刪除列表中指定範圍之外的全部元素
LINSERT key BEFORE/AFTER pivot value # 從列表中查找值等於 pivot 的第一個元素,而後在其前面或者後面插入 value 元素
RPOPLPUSH source destination # 從 source 列表右邊彈出一個元素,插入到 destination 列表左邊
複製代碼
集合類型的元素是無序的、惟一的,經常使用的操做是向集合中加入某個元素或者刪除某個元素、判斷某個元素是否存在,大部分操做的時間複雜度基本都爲 O(1),經常使用命令以下:算法
SADD key value1 value2... # 向集合中加入多個元素
SREM key value1 value2... # 從集合中刪除多個元素
SMEMBERS key # 獲取集合中的全部元素
SISMEMBER key value # 判斷元素是否存在集合中
SDIFF key1 key2... # 對多個集合求差集運算
SDIFFSTORE destination key1 key2... # 對多個集合求差集運算,並將結果存儲在 destination 集合中
SINTER key1 key2... # 對多個集合求交集運算
SINTERSTORE destination key1 key2...# 對多個集合交差集運算,並將結果存儲在 destination 集合中
SUNION key1 key2... # 對多個集合求並集運算
SUNIONSTORE destination key1 key2...# 對多個集合並差集運算,並將結果存儲在 destination 集合中
SCARD key # 獲取集合中的元素個數
SRANDMEMBER key count # 隨機從集合中獲取 count 個不相同的元素
SPOP key # 隨機從集合中彈出一個元素
複製代碼
有序集合類型使用散列表和跳躍表實現的,比列表類型更消耗內存,有序集合經過給每一個元素存放一個 score 進行排序,對於須要排序分頁的場景很是適用,經常使用命令以下:sql
ZADD key score member ... # 向有序集合中添加元素,若是存在則更新元素對應的 score
ZSCORE key member # 獲取有序集合中某個元素的分數
ZRANGE key start stop # 獲取有序集合中排名在某個範圍的元素,結果集從小到大排序
ZREVRANGE key start stop # 獲取有序集合中排名在某個範圍的元素,結果集從大到小排序
# 獲取有序集合中分數在某個範圍的元素,WITHSCORES 表示是否把分數返回,LIMIT 表示是否須要分頁
# 默認狀況下是包含最大值和最小值,若是想不包好最大值最小值,能夠加個左括號:ZRANGEBYSCORE hello 3 (5
# -inf 和 +inf 表示無窮小和無窮大
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
# ZREVRANGEBYSCORE 和 ZRANGEBYSCORE 類似,只是從大到小排序
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
ZINCBY key increment member # 增長有序集合中某個元素的分數
ZCARD key # 獲取有序集合中元素的數量
ZCOUNT key min max # 指定分數範圍內元素的個數
ZREM key member... # 刪除有序集合中一個或者多個元素
ZREMRANGEBYRANK key start stop # 刪除有序集合中某個排名範圍的元素
ZREMRANGEBYSCORE key min max # 刪除有序集合中某個score範圍的元素
ZRANK key member # 獲取某個元素的排名
# 計算有序集合的交集,能夠經過 AGGREGATE 指定聚合類型,默認是求和,最終將key1,key2 集合中的元素經過不一樣的聚合方式放入 destinationKey 集合中
ZINTERSTORE destinationKey numkeys key1 key2... [AGGREGATE SUM | MIN | MAX]
複製代碼
CONFIG set loglevel warning # 動態修改 redis 的部分配置
CONFIG get loglevel # 獲取 redis 的部分配置
SELECT 1 # 更改數據庫編號,默認從 0 開始
KEYS pattern # 獲取知足 glob 風格的全部鍵值,當鍵值較多時會影響性能,生產不建議這樣作
EXISTS key # 判斷某個鍵值是否存在,存在返回 1, 不然返回 0
DEL key1 key2 # 能夠刪除一個或者多個鍵,返回刪除的個數
KEYS "user*" | xargs | del # 實現通配符匹配刪除多個鍵值
TYPE key # 獲取鍵值的數據類型,string | hash | list | set | zset(有序集合)
複製代碼
> MULTI
> SADD "user:1" 2
> SADD "user:2" 1
> EXEC
複製代碼
# 經過 BY 咱們能夠實現使用其餘參考鍵值進行排序
# 使用列表中的每一個元素替換參考值中的第一個 *,並獲取對應的散列類型的 time 字段進行排序
SORT tag:ruby:posts BY post:*-> time DESC
複製代碼
# 經過 post:* 中 time 字段進行排序,並返回 post:* 中的 title 字段,同時返回原始列表中的信息(#)
# 同一個 SORT 命令能夠返回使用多個 GET 參數
SORT tag:ruby:posts BY post:*-> time DESC GET post:*->title GET #
複製代碼
- 儘可能減小排序鍵中元素的個數
- 使用 LIMIT 參數獲取必要的數據
- 若是排序結果較大,使用 STORE 參數進行緩存,以避免屢次排序
複製代碼
redis 對不一樣的數據類型都提供了多種編碼方式,以節省空間和加快查詢效率,經過命令 OBJECT ENCODING key 命令能夠查看某個鍵值對應的編碼方式shell
如下是每種數據類型可能才用的內部編碼方式:數據庫
數據類型 | 內部編碼方式 | OBJECT ENCODING 命令結果 |
---|---|---|
字符串類型 | REDIS_ENCODING_RAW | "raw" |
REDIS_ENCODING_INT | "int" | |
REDIS_ENCODING_EMBSTR | "embstr" | |
散列類型 | REDIS_ENCODING_HT(散列表) | "hashtable" |
REDIS_ENCODING_ZIPLIST(緊湊順序表) | "ziplist" | |
列表類型 | REDIS_ENCODING_LINKEDLIST(雙向鏈表) | "linkedlist" |
REDIS_ENCODING_ZIPLIST | "hashtable" | |
集合類型 | REDIS_ENCODING_HT | "hashtable" |
REDIS_ENCODING_INTSET | "intset" | |
有序集合類型 | REDIS_ENCODING_ZIPLIST | "ziplist" |
REDIS_ENCODING_SKIPLIST(跳躍表) | 「skiplist」 |
# 第一個參數是要執行的腳本,第二個參數表示後面傳入 key 的數量,後面是 key 和 arg 傳入的參數,能夠在腳本里直接使用
eval 腳本內容 key參數數量 [key...] [arg...]
複製代碼
- 和 eval 同樣是執行 Lua 腳本,只不過每次執行時是將腳本的摘要傳遞給 redis 服務端
- redis 服務端會檢查緩存是否存在該摘要的腳本並執行,不存在則拋出異常
- 由於 eval 命令每次都會將腳本發到遠端,帶寬消耗大,因此通常 evalsha 命令執行失敗時再使用 eval 命令並設置緩存
複製代碼
- 減小網絡開銷
- 原子操做
- 代碼的複用
複製代碼
redis 提供兩種持久化的方式,一種是 RDB 方式,一種是 AOF 方式:緩存
- 配置指定規則自動同步,好比 save 300 10, 表示每 300 內至少有 10 條數據被修改則進行快照
- 用戶執行 SAVE 或者 BGSAVE 命令,SAVE 命令同步執行會阻塞其它客戶端的請求,BGSAVE 異步同步數據
- 執行 FLUSHALL 命令
- 主從複製時
複製代碼
- 經過參數 appendonly 開啓 AOF 數據備份
- 經過參數 appendfsync 設置磁盤緩存刷新機制
- 由於每條更新數據的命令都會被記錄到磁盤,因此磁盤數據會愈來愈大,所以 redis 提供了重寫 AOF 的功能
- 經過 auto-aof-rewrite-percentage 參數和 auto-aof-rewrite-min-size 參數能夠設置自動重寫 AOF 文件策略
複製代碼
- min-slaves-to-write 3:表示只有當 3 個或者 3 個以上的從數據庫鏈接到主數據庫時,主數據庫纔是可寫的
- min-slaves-max-lag 10:表示容許從數據庫最長失去鏈接的時間(秒),超過該時間,主數據庫變爲只讀。
複製代碼
Redis 2.8 之後提供了哨兵工具來實現自動化監控和故障恢復功能:安全
- slvae-priority:從數據庫的優先級設置,當主數據庫掛掉後,選擇優先級最高的從數據庫升級爲主數據庫
- down-after-milliseconds: 指定時間後,若是 ping 的數據庫節點仍然未回覆,則認爲該數據庫實例主觀下線
- quorum:多多個哨兵系統都認爲某個數據庫節點主觀下線且超過 quorum 個數,則認爲該數據庫實例客觀下線
複製代碼
- 爲每一個節點部署一個哨兵,避免單點問題
- quorum 的值至少設置爲 N/2 + 1, 保證大部分哨兵節點贊成後才進行故障恢復
複製代碼
- 和 mysql 同樣, redis 也能夠記錄慢查詢日誌
- 經過 slowlog-log-slower-than 參數設置多長時間的執行時間會被記錄到耗時日誌裏
- 經過參數 slowlog-max-len 來限制耗時日誌記錄的條數
- SLOWLOG GET 命令能夠獲取當前的耗時命令日誌
複製代碼
- REDIS_CMD_WRITE:擁有該屬性的命令會修改數據庫的數據
- REDIS_CMD_DENYOOM:擁有該屬性的命令可能會增長 Redis 佔用的存儲空間
- REDIS_CMD_NOSCRIPT:擁有該屬性的命令沒法再 Redis 腳本中被執行
- REDIS_CMD_RANDOM:一個腳本執行了擁有了 REDIS_CMD_RANDOM 屬性的命令後,就不能執行擁有 REDIS_CMD_WRITE 的命令了
- REDIS_CMD_SORT_FOR_SCRIPT:擁有該屬性的命令會產生隨機結果,在腳本中調用這些命令時 Redis 會對結果結果進行排序
- REDIS_CMD_LOADING:Redis 會在啓動時執行擁有該屬性的命令
複製代碼
- volatile-lru: 使用 LRU 算法刪除一個設置了過時時間的鍵
- allkeys-lru: 使用 LRU 算法刪除一個鍵
- volatile-random:隨機刪除一個設置了過時時間的鍵
- allkeys-random:隨機刪除一個鍵
- volatile-ttl:刪除過時時間最近的一個鍵
- noeviction:不刪除鍵值,插入數據時返回錯誤
複製代碼
everysec: 默認策略,每秒執行一次刷新
always:每次執行寫操做都會刷新磁盤緩存
no:不主動刷新磁盤緩存,交個操做系統,即每 30 秒一次
複製代碼