Redis學習筆記
一、common item
1.1 redis-cli:
-
常用選項
redis-cli -h <hostname> -p <port> -a <passwd> -u <uri>
redis-cli -u redis://passwd@hostname:port/0
-
常見集羣操作命令:
- config get // 不用重啓情況下的配置更新和查看
- config set
- flushall 清庫
- select 2 // 切換db,一般一個redis實例可以有多個db,這個db可以通過配置調整,通過select進行切換, 默認連接db0
- dbsize 查看db大小
- ping pong // 實例可用性
- connect hostname port // 切換當前連接實例
- debug restart // 重啓本實例, redis-cli默認會一直重試至連接上未知,如果連不上,會顯示當前error和斷連接狀態, 一般這個命令不允許執行, 連接上之後,redis-cli會默認連接至上次連接的db
- 使用multi可以連續執行多個命令,如
multi 開始記錄 ping ping ... set a b get a exec 開始執行
- clear 清屏
- info
- info replication 可以查看當前實例的信息(主?從?)
- 特殊操作模式
redis-cli -p 5555 --stat -i <interval>
查看當前數據情況,負載情況, 默認15秒一次
redis-cli --bigkeys 查看大key
redis-cli --scan | head -10 使用scan參數,而非KEYS , 避免redis server阻塞
redis-cli --scan --pattern '-11*' 查找符合匹配規則的key
redis-cli Pub/Sub 模式暫時不看[TODO]
reids-cli monitor //打印當前實例收到的所有命令, 什麼時候,來自哪個套接字的哪個命令
redis-cli --latency //延遲監控 --latency-history, --latency-dist
redis-cli --rdb /tmp/dump.rdb // 遠程備份某個redis實例的數據至本地
redis-cli --slave // 讓當前cli模擬一個slave的狀態, 獲取master給slave發送的同步replication stream
當redis被用作cache服務器的時候,通過maxmemory來設定一個上限值,配合LRU算法進行內存驅逐,暫時不看詳情參考[TODO]
1.2 configration:
-
redis配置生效方式
- 命令行 redis-server -p 4444 --slaveof hostname port
- 通過配置文件指定(生產推薦) redis-server [/path/to/redis.conf]
- 通過交互更改 CONFIG GET CONFIG SET
- 官方配置參考5.0版本
- 我司配置樣例cluster模式參考最後附錄1
1.3 replication
- 機制:
- master會將所有的命令stream發送給replica, 包括cli write, keys expire, 和其他操作
- 當master replica斷鏈接重連後,replica會嘗試獲取在斷鏈期間丟失的數據,部分同步
- 當部分同步行不通時,replica會請求一個全同步,觸發master的snapshot,然後將其發送個replica,然後再去重寫數據
- 同步方式
- 默認async, sync可選,sync暫時不瞭解
- 其他
- 當master沒有配置持久化的時候,不能打開其自動重啓功能,一般重啓功能都在k8s中定義,因爲一旦master沒有持久化,而且重啓了,會導致旗下所有slave同步它的空數據
- redis replication原理,replication中的每個節點,不管是master還是replica,都有一個基於數據集產生的一個replicationID, 類似這樣
ReplicationID, offset
, 每當有master將自己的replicationstream發送給slvae時,這個offset就會增加相應的字節數 - 當slave鏈接到master的時候,會使用PSYNC命令,將之前他鏈接的masterReplicationID,連同他當前的處理進度(他自己的offsetS), 然後master就會將相比於offsetS,新增的replicationStream發送給slave
- 到底哪個slave在failover的時候能夠當選?——<font color='red'>不能配置某個必須當選,但是可以配置某些絕對不能當選</font>
- replication的創建
- 加入master: 5.0 使用replicaof, 其他版本使用slaveof
- 配置只讀 slave-read-only yes
- master添加密碼
masterauth <master-password>
,requirepass <your passwd>
- a -> b -> c集羣,c仍然會和a的dataset保持一致
- replication如何處理keys過期
- 不能總是依賴master往replica去同步時鐘來完成
- 具體實現方式如下
- replicas不會讓keys過期,他們只等待master讓keys過期,如果master的某個key過期了,那就把DEL命令傳輸給replicas
- 其他待學習
- [TODO]docker中的replication網絡NAT[TODO]
-
[TODO]當master restart之後,可能其他replica已經成爲master了, 那麼之前沒傳完的數據該如何部分重傳?
1.4 persistency
<font color='red'>當redis實例啓動的時候,如果appendonly no, 則無論是否打開rdb,都會默認加載指定目錄下的dbfilename,如果appendonly yes, 則優先加載appendfilename, 如果appendfilename不存在,則不會加載dbfilename</font>
- RDB
默認redis會以快照方式,將redisDB保存在dump.rdb中
觸發方式有三種- save
- bgsave
save <sec> <num of keyschange>
save 60 10 每六十秒統計一次,如果有超過10個key發生變更,則觸發一次快照- 如果使用save '',rdb會被關閉或者
redis-cli config set save ''
- AOF
fsync的方式,最高提供命令級別的fsync策略,支持(有新命令,秒級別,從不)的fsync策略
默認關閉
appendonly yes // 打開aof
appendfilename "appendonly.aof"
appendfsync everysec(default)|always|no // fsync頻率
AOF提供”BGREWRITEAOF“命令,重新生成一個新的AOF,其中包含更少的命令來創建當前數據集
redis-check-aof –fix 提供aof文件corrupt情況下的文件修復
aof工作原理[TODO] -
aof和RDB
BGSAVE和BGREWRITEAOF命令不能同時執行
aof過大時,支持aof文件的重寫,用於達到複製相同複製集的情況下的,減小aof文件大小 - diff
當一個單實例模型重啓時
rdb:DB loaded from disk: xxxx seconds
aof: DB loaded from append only file: xxx seconds
rdb+aof: DB loaded from append only file: 0.010 seconds- 當rdb+aof時,會產生兩個文件,一個aof文件,一個rdb文件
- 重啓時,當rdb文件丟失,redis啓動之後,通過aof文件,仍然能夠恢復服務
- 重啓時,當aof文件丟失,redis啓動之後,通過rdb文件,不能正常啓動(<font color='red'>這種情況如何修復?這個時候,需要將aof配置關閉,以單rdb方式打開,此時redis處於rdb狀態,需要重新使用config set appendonly yes打開aof纔可以迴歸正常</font>)
二、sentinel知識總結
爲redis instance的一種HA方案,同時提供monitor,notification(API觸發接口),auto failover 和 configration provider
2.1 有關sentinel集羣
- sentinel的啓動必須指定配置文件,配置文件只需指定監控master即可
- sentinel集羣的每個實力必須互通,默認26379端口
- sentinel集羣至少sentinel * 3
- (異步複製原因)sentinel + redis<font color='red'>不保證failover期間的write操作是被保留的</font>,【TODO】這裏要再繼續學習
- sentinel, docker, NAT, port mapping , 使用docker的端口映射,將會打斷sentinel的自動發現功能,也會影響master的對應的slave列表功能,【TODO】稍後查看相關sentinel with docker
- sentinel是依靠master的INFO信息來進行replica發現
- 有關sentinel master mymaster 這個信息裏面的flags, 正常情況下值爲master,也有可能出現s_down或者o_down, 分別表示對應Subjectively Down(主觀)和Objectively Down(客觀), 比如debug sleep 30和直接ctrl+c終止redis-server進程,都會觸發S_down, O_down暫時還沒去了解
2.2 sentinel啓動配置
-
sentinel monitor <master-group-name> <ip> <port> <quorum>
quorum解釋:- 集羣中至少有
<quorum>
個sentinel認爲master不可用,failover纔會被授權執行。 - 這個failover又是誰來啓動呢?又是被誰授權呢?
如果: sentinel集羣有5個sentinel: 且都配置sentinel monitor mymaster ip port 2
那麼: 有兩個(至少)sentinel說master不可用了,這2箇中的其中一個sentinel就會發起failover初始化,然後,集羣中的5個sentinel如果至少有3個sentinel認爲該master不可用了,那麼這個failover就會被授權執行 - 這麼多sentinel是怎樣標記那個故障master的狀態,並完成判斷的呢?
答:sentinel集羣的每個sentinel都是有互相交流的,當集羣中的sentinel發現一個master不可用(通過down-after-milliseconds斷定)時,這個sentinel就會對這個master標記一個sdown狀態,當第二個sentinel也發現同樣情況時,也對master打一個sdown狀態,當這個sdown超過2的時候,sentinel集羣就會failover初始化,並獲取所有sentinel對master的評價進行投票,當這個集羣中總sdown的個數超過3時,sentinel集羣中的所有sentinel都會將這個master標記爲odown(客觀下線),然後由第一個收到odown通知的sentinel去執行failover。 - 結論:
sentinel集羣中的個數不能少於 quorum個,否則,此sentinel集羣已經失去failover的功能,而且能不能?正常對外提供服務
- 集羣中至少有
-
sentinel <option_name> <master_name> <option_value>
optionname如下:- down-after-milliseconds
<ms>
//超過這個時間,sentinel將認爲實例不可達 - parallel-syncs
<nums>
//出現故障,failover完成後,最多有多少個replica去從master同步 - failover-timeout
<ms>
// failover進程最長執行時間,超過時間將認定failover失敗<font color='red'>【TODO】這時集羣的狀態是ERROR嗎?</font>
- down-after-milliseconds
-
樣例
bind <my_ip> 127.0.0.1 protected-mode no syslog-enabled no syslog-ident "redis-sentinel" syslog-facility local0 port 26379 dir /home/redis/data/conf maxclients 50000 sentinel monitor redis_sentinel_zhk022702 <my_ip> 6379 2 sentinel down-after-milliseconds redis_sentinel_zhk022702 20000 sentinel parallel-syncs redis_sentinel_zhk022702 2
2.3 安全機制:
-
redis實例本身的認證,
- for replica的
masterauth <master-password>
, - for client的
requirepass <yourRequirePasswd>
- 如果redis集羣配置了上述兩個配置,那麼sentinel實例也必須配置
sentinel auth-pass <master-group-name> <pass>
如sentinel auth-pass mymaster <yourRequirePasswd>
- for replica的
- sentinel認證
- sentinel認證配置——sentinel在5.0版本之後也支持client到sentinel自己的認證,只需要在sentinel配置
requirepass <yourSentinelPasswd>
, 這個指令將直接限制client --> sentinel的訪問和sentinels集羣間的認證
- sentinel認證配置——sentinel在5.0版本之後也支持client到sentinel自己的認證,只需要在sentinel配置
2.4 sentinel集羣模型及其搭建步驟
# redis-server
# redis-server --port 6380
# redis-server --port 6381
# cat conf/sentinel*.conf
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 40000
sentinel parallel-syncs mymaster 2
port 26380
...同上
port 26381
...同上
# redis-sentinel conf/sentinel1.conf
# redis-sentinel conf/sentinel2.conf
# redis-sentinel conf/sentinel3.conf
# cat conf/sentinel*.conf
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2 #如果發生failover,本配置文件會被更改
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 40000
sentinel parallel-syncs mymaster 2
# Generated by CONFIG REWRITE
dir "/data"
sentinel config-epoch mymaster 0 ## 表示這兩個自動添加的內容不知道意思
sentinel leader-epoch mymaster 0
sentinel known-sentinel mymaster 127.0.0.1 26380 119690834a6925435edeeccf6a98df1152d342a5
sentinel known-sentinel mymaster 127.0.0.1 26381 c75d2e225a353d23881d63e5a383cc620f0c1d44
sentinel current-epoch 0
port 26380
...與上類似
port 26381
...與上類似
2.5 常用sentinel相關命令
redis-cli -p 26379
localhost:26379> sentinel master mymaster # 用於顯示 本sentinel所監控的master信息
SENTINEL slave mymaster # 查master的slaves
SENTINEL sentinels mymaster #查sentinel的其他sentinels
SENTINEL get-master-addr-by-name mymaster #獲取master的<ip:port>
SENTINEL failover <master name>
SENTINEL reset <pattern>
SENTINEL ckquorum <master name>
SENTINEL flushconfig
# 實時重配置sentinel
SENTINEL MONITOR <name> <ip> <port> <quorum>
SENTINEL REMOVE <name>
SENTINEL SET <name> <option> <value>
# 測試failover
redis-cli -p 6379 DEBUG sleep 30
# 安全相關
2.6 客戶端如何使用sentinel集羣
在這個例子中, ForClient: 三個 < sentinelIP: sentinelPORT >
https://redis.io/topics/sentinel-clients
三、主從版sentinel總結
- sentinel集羣配置同sentinel
- 對外服務,使用lbc --> masterIP:port, 暴露lbc vip:vport,
- sentinel vs 主從版
- lbc
- sentinel集羣的sentinel和redis實例是在同一個主機內,也就是一個sentinel集羣服務一個reidis實例
- 主從版的sentinel集羣會監控多個redis實例,
- failover,當發生failover的時候,sentinel集羣不僅會負責切換,而且會負責調用lbc接口,讓lbc的realserver指向切換後新的master
四、cluster模式
4.1 What
- Automatically sharded data across multiple redis nodes
- Continue operations when a subset of nodes are failures
4.2 集羣實現及其特徵
- Redis cluster集羣,是一個自識別的過程,通過cluster enabled的方式,激活redis-server的啓動模式,再通過redis-cli —cluster模式,來讓他自己完成master -slave的識別和nodes的創建
- 兩個端口: 一個for client, 一個集羣內nodes間通信,失敗檢測,配置更新,failover授權等
- client端口可開白,可開黑,cluster bus port 必須集羣內互通
- redis cluster 和Docker(也是NAT環境問題[TODO])
- Cluster data sharding:沒有使用一致性哈希,而是給對應的KEY的CRC16校驗值給16384取模,比如一個三節點的cluster集羣,三個節點就有三個對應的哈希槽位【TODO,具體算法可後續查看】
- 【redis clusterCAP評估】: 雷同於mongod集羣,所有nodes作爲cluster sharding, 單個節點使用replication模型提供master-slave高可用保障, 有關Consistency一致性,redis cluster不支持特別強的一致性,因爲是異步複製,在一些情況下(如果client往Master上面寫,但是master上還沒有個其replica上告知數據write就掛了)
4.3 redis cluster配置, Jetis配置
cluster-enabled <yes/no>
cluster-config-file <filename>
# 這個配置不是由用戶編輯,而是有集羣生成,當啓動時,cluster節點信息,狀態,變量信息等就會記錄在內cluster-node-timeout <ms>
# 類似於sentinel的down-after-, master超過多少毫秒不可達, 將觸發改節點的主從切換cluster-slave-validity-factor <factor>
[TODO 待學習]- cluster-migration-barrier <count>[TODO 待學習]
cluster-require-full-coverage <yes/no>
默認是yes,當一個key計算出的hash slot未被cluster集羣覆蓋時,該redis節點將不再提供查詢服務,這時候異常的節點將會導致集羣不可用,但是你又希望集羣的其他正常的節點能夠正常提供接受請求,這時候設置此項目爲no- cluster-allow-reads-when-down <yes/no>[TODO 待學習]
4.4 集羣搭建
# redis.conf // 啓動redis cluster實例 * 6
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
port 7001-7005
或者這樣: ../../src/redis-server --port 30009 --cluster-enabled yes --cluster-config-file nodes-30009.conf --cluster-node-timeout 2000 --appendonly yes --appendfilename appendonly-30009.aof --dbfilename dump-30009.rdb --logfile 30009.log --daemonize yes
…
# redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
// 6個redis instance, 按照master:slave = 1:1 ==> 組成nodes * 3,並且三個nodes參與sharding,並分配好三個nodes的hash slot
# 執行完成後,redis會自動將master-slave劃分好,並提供對應關係
# > cluster nodes查看當前集羣狀態
# > cluster info查看集羣信息
# > cluster failover做主從切換
4.5 集羣搭建2
create-cluster start
create-cluster create
create-cluster stop
# 集羣reshard
交互式:redis-cli --cluster reshard 127.0.0.1:30001 //如果不滿意redis劃分的shard落點,可以自行劃分
腳本: redis-cli reshard <host>:<port> --cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes
狀態查看: redis-cli --cluster check 127.0.0.1:30001 // 用於查看reshard之後集羣的狀態是否正常
# 手動主從切換(failover)
在slave上執行 cluster failover
# 添加節點
redis-cli --cluster add-node <new_to_add> <existed_node>
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
//這樣添加的節點默認都是master節點,第一: 雖然是master節點,但是卻沒有對應的hashslots,二來,當其他slave想failover爲master時,這些無slots的master不參與選舉過程
# 添加replica
方法:1 這種類似上面,添加一個slave,但是默認將這個slave分配到master上對應slave較少的master上, 即便配置了master-slave1:1, 當有新的slave加入時,可能會變成1:2
redis-cli --cluster add-node <new_to_add> <existed_node> --cluster-slave
方法:2 直接指定對應的master
redis-cli --cluster add-node <new_to_add> <existed_node> --cluster-slave --cluster-master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
方法:3 鏈接到對應的節點,手動通過CLUSTER REPLICA
redis <new_to_add>> cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
# 刪除replica
主機:端口這個是集羣隨意一個即可,後面是要刪除的node_id
redis-cli --cluster del-node 127.0.0.1:7000 `<node-id>`
注意:replica可以直接刪除,但是如果要刪除master,必須要保證master節點上無數據(使用reshard,將該節點的數據全都遷移到其他節點)
# replica遷移(暫未具體學習)
# nodes升級(暫未具體學習)
# cluster集羣遷移(暫時未學習)
4.6 用戶接口
[
{"host": "localhost", "port": "30001"},
{"host": "localhost", "port": "30002"},
{"host": "localhost", "port": "30003"},
{"host": "localhost", "port": "30004"},
{"host": "localhost", "port": "30005"},
{"host": "localhost", "port": "30006"},
]
五、擴縮容
- 普通redis節點的擴縮容
直接通過更改maxmemory即可,sentinel通過主從切換方式來解決本機mem上限問題 -
redis+shard
redis-cli --cluster add-node <new_to_add> <existed_node> // 加master redis-cli --cluster add-node <new_to_add> <existed_node> --cluster-slave --cluster-master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e // 加對應replica redis-cli reshard <host>:<port> //後面參數可選[--cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes], host:port爲擴容前已存在的節點(existed_node) redis-cli --cluster check 127.0.0.1:30001 // 檢查reshard的結果是否有異常
七、備份&&恢復
- 無aof: 不提供備份恢復,唯一觸發方式爲客戶端自行觸發的rdb
- 半aof: 當半aof的集羣需要做數據恢復時,如果需要修復數據,只需要將replica上的修改後的aof文件轉移到master上啓動即可
- 全aof: 按需對aof進行修改,直接啓動集羣即可
- RDB:
- 默認都不打開,只有當有需要遷移,或者主動備份時,纔會採用bgsave,或者redis-cli -h 10.160.167.5 -p 2004 –rdb mobile4_bak.rdb)的方式進行RDB備份
- 前者不佔用大量網絡io,後者會佔用大量網絡IO
- 可以藉助外部工具協助恢復[待學習]https://github.com/alibaba/RedisShake
- 其他注意:
- 當down機的redis實例需要從rdb文件中恢復時,如果appendonly yes時,此時workdir不能有對應的aof文件,redis實例啓動時的默認行爲就是從aof文件中加載
八、附錄
8.1. 附錄1(我司cluster模式配置樣例)
#common配置:
bind <my_ip> 127.0.0.1 // 綁定地址
daemonize no // 非daemon模式運行(也是默認)
pidfile /home/redis/var/run/redis.pid //當redis被啓動爲一個daemon的時候,需要一個pid文件
protected-mode no //保護模式:默認(yes),如果yes, 且沒有指定bind,而且沒有配置密碼,那麼本實例僅支持本地client接入,不支持remote client access
port 6379
tcp-backlog 511 // 在高QPS(requests-per-sec)環境中這個值會影響當前服務器能夠處理的tcp鏈接請求的速率(rate), 參考http://dwz.date/Rsd和官方配置文檔
timeout 0 // 客戶端閒置N秒後,自動關閉,(0 to disable)
tcp-keepalive 300 // tcp長鏈接相關
loglevel notice // 日誌通告級別
logfile "/home/redis/var/log/redis.log" // log path
databases 16 // 實例最大db數, default DB0, select # 進行切換
save 900000000 1 // RDB trigger on disk save <secs> <changes>, 表示 sec秒內(也就是過了sec秒後),如果有超過changes個keys發生改變,就主動落地一次, 本例表示9xxxx秒後,如果有1個key發生變更,就刷一次rdb,當然這裏永遠不可能觸發,一般用bgsave執行, 他不會阻塞進程
stop-writes-on-bgsave-error yes // 如果rdb snapshots失敗了,或者最近一次bgsave也失敗了,redis默認會拒絕本實例的寫操作,本設置爲了警告用戶當前實例的persistent已經失敗了
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /home/redis/data/db // workdir
slave-serve-stale-data yes // 用於處理slave和master鏈接丟失,或者replication還是正常服務,如果yes(default) --> 那slave仍然會響應client的請求,但是數據可能是過期的,或者是空的(第一次sync from master), 如果no,client在給slave發命令時,會直接給client反饋“SYNC with master in progress”,
slave-read-only yes
repl-diskless-sync no // replication的同步策略,無盤 or socket, 目前disk是實驗性能,建議no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no // 有關同步之後套接字的TCP_NODELAY的禁用, TODO, 暫時不瞭解
repl-backlog-size 64mb // 當slave與master斷開連接時的一個sync緩衝,積壓緩衝區的大小,體積越大,能夠容忍的disconnection時間越長
repl-timeout 600 // replication 超時定義,如果1. 站在repl角度,如果sync時bulk傳輸i/o超時,如果給masterping超過600s則認爲超時,站在master角度,如果repl響應超時600s,則認定爲超時 【TODO】這裏可以瞭解瞭解bulk transfer
slave-priority 100 // 5.0中叫 replica-priority, 整型數值,用於sentinel模式中,當master異常時,replica需要晉升時的優先度,值越小,優先級越高,0默認不被選擇,default 100
maxmemory 36gb // 內存管理: 當實例使用的內存數量超過時,將根據maxmemory-policy策略進行key的刪除
maxmemory-policy noeviction // 有很多策略,根據使用場景,sa自行設定,這裏默認不進行key的eviction,而是反饋writes error
maxclients 50000
## 備份相關
appendonly no //fsync是否開啓,內存flush --> disk的性能 vs persistent
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no //暫未了解[TODO]
auto-aof-rewrite-percentage 100 //暫未了解[TODO]
auto-aof-rewrite-min-size 4gb //暫未了解[TODO]
aof-load-truncated yes
lua-time-limit 5000
## reids-cluster
cluster-enabled yes
cluster-config-file /home/redis/data/conf/nodes.conf
cluster-node-timeout 15000 ## 類似於sentinel的down-after- 每個nodes的master-slave探測時間爲多長時,會觸發主從切換
cluster-require-full-coverage no ## 默認是yes,當一個key計算出的hash slot未被cluster集羣覆蓋時,該redis節點將不再提供查詢服務,這時候異常的節點將會導致集羣不可用,但是你又希望集羣的其他正常的節點能夠正常提供接受請求,這時候設置此項目爲no
slowlog-log-slower-than 100000
slowlog-max-len 128
latency-monitor-threshold 1000
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 0 0 0
client-output-buffer-limit pubsub 512mb 256mb 60
hz 10
aof-rewrite-incremental-fsync yes