1. 程式人生 > >Redis相關註意事項

Redis相關註意事項

all 清理 不同的 swap 內存數據庫 known 個推 空間 value

本文介紹了五個使用Redis使用時的註意事項。如果你在使用或者考慮使用Redis,你可以學習一下下面的一些建議,避免遇到以下提到的問題。

一、配置相關註意事項

1、涉及到內存的單位註意添加 b

1k => 1000 bytes   
1kb => 1024 bytes

2、daemonize為 yes 後臺運行時,記得配置 pidfile

daemonize yes
pidfie /var/run/redis.pid

3、配置了最大內存 maxmemory 之後記得配置過期刪除策略

maxmemory 5gb
maxmemory-policy volatile-lru

## 補充
# volatile-lru -> 根據LRU算法生成的過期時間來刪除。
# allkeys-lru -> 根據LRU算法刪除任何key。
# volatile-random -> 根據過期設置來隨機刪除key。
# allkeys->random -> 無差別隨機刪。
# volatile-ttl -> 根據最近過期時間來刪除(輔以TTL)
# noeviction -> 誰也不刪,直接在寫操作時返回錯誤。

4、Redis 慢查詢,只計算命令運行的實際時間

## 配置慢查詢
# 單位是微妙
slowlog-log-slower-than 10000
# 服務器內存最多保存多少條慢查詢日誌,先進先出的方式覆蓋
slowlog-max-len 128

## 查看慢查詢
    SLOWLOG GET
## 慢查詢清理
    slowlog reset
## slowlog總數
    SLOWLOG LEN 
## slowlog get 1, 1 是得到一條 slowlog
       1) (integer) 13     // slowlog唯一編號id
       2) (integer) 1466499110  // 查詢的時間戳
       3) (integer) 41349  // 查詢的耗時(微妙)
       4) 1) "scan"  // 查詢命令,slowlog最多保存前面的31個key和128字符
          2) "0"
          3) "MATCH"
          4) "*"
          5) "COUNT"
          6) "10000"

5、Redis 禁用某些命令

(error) ERR unknown command ‘CONFIG‘

## 上面的錯誤就是由於配置了如下命令導致的
rename-command config ""

## 也可以將其改名成你自己想改成的名字,別人不能猜到的
rename-command config "lcconfig"

二、使用註意事項

1、使用key值前綴來作命名空間

雖然說Redis支持多個數據庫(默認32個,可以配置更多),但是除了默認的0號庫以外,其它的都需要通過一個額外請求才能使用。所以用前綴作為命名空間可能會更明智一點。

另外,在使用前綴作為命名空間區隔不同key的時候,最好在程序中使用全局配置來實現,直接在代碼裏寫前綴的做法要嚴格避免,這樣可維護性實在太差了。

2、創建一個類似 ”registry” 的key用於標記key使用情況

為了更好的管理你的key值的使用,比如哪一類key值是屬於哪個業務的,你通常會在內部wiki或者什麽地方創建一個文檔,通過查詢這個文檔,我們能夠知道Redis中的key都是什麽作用。

與之結合,一個推薦的做法是,在Redis裏面保存一個registry值,這個值的名字可以類似於 __key_registry__ 這樣的,這個key對應的value就是你文檔的位置,這樣我們在使用Redis的時候,就能通過直接查詢這個值獲取到當前Redis的使用情況了。

3、註意垃圾回收

Redis是一個提供持久化功能的內存數據庫,如果你不指定上面值的過期時間,並且也不進行定期的清理工作,那麽你的Redis內存占用會越來越大,當有一天它超過了系統可用內存,那麽swap上場,離性能陡降的時間就不遠了。所以在Redis中保存數據時,一定要預先考慮好數據的生命周期,這有很多方法可以實現。

比如你可以采用Redis自帶的過期時間為你的數據設定過期時間。但是自動過期有一個問題,很有可能導致你還有大量內存可用時,就讓key過期去釋放內存,或者是內存已經不足了key還沒有過期。

如果你想更精準的控制你的數據過期,你可以用一個ZSET來維護你的數據更新程度,你可以用時間戳作為score值,每次更新操作時更新一下score,這樣你就得到了一個按更新時間排序序列串,你可以輕松地找到最老的數據,並且從最老的數據開始進行刪除,一直刪除到你的空間足夠為止。

4、設計好你的Sharding機制

Redis目前並不支持Sharding,但是當你的數據量超過單機內存時,你不得不考慮Sharding的事(註意:Slave不是用來做Sharding操作的,只是數據的一個備份和讀寫分離而已)。

所以你可能需要考慮好數據量大了後的分片問題,比如你可以在只有一臺機器的時候就在程序上設定一致性hash機制,雖然剛開始所有數據都hash到一臺機器,但是當你機器越加越多的時候,你就只需要遷移少量的數據就能完成了。

5、不要有個錘子看哪都是釘子

當你使用Redis構建你的服務的時候,一定要記住,你只是找了一個合適的工具來實現你需要的功能。而不是說你在用Redis構建一個服務,這是很不同的,你把Redis當作你很多工具中的一個,只在合適使用的時候再使用它,在不合適的時候選擇其它的方法。

Redis相關註意事項