自研高性能的Redis中間件
本文轉(zhuǎn)載自微信公眾號「漫漫技術(shù)路」,作者劉蒞。轉(zhuǎn)載本文請聯(lián)系漫漫技術(shù)路公眾號。
接口請求量越來越大,為了縮短服務(wù)的響應(yīng)時間、減輕數(shù)據(jù)庫的壓力,我們通常會在數(shù)據(jù)庫前架設(shè)Redis。
但是單臺Redis的內(nèi)存有限,所以我們需要部署多個Redis節(jié)點。在業(yè)務(wù)里,我們可以根據(jù)key,將讀寫請求轉(zhuǎn)發(fā)到不同的Redis節(jié)點,或者業(yè)務(wù)直連一個代理Proxy,請求路由規(guī)則由Proxy處理。
Proxy對于客戶端來說,就相當(dāng)于一個Redis,客戶端連接到Redis上和連接到Proxy上,從本質(zhì)上沒什么區(qū)別。
目前業(yè)界有很多Redis Proxy,比如鼎鼎大名的Codis。用別人的產(chǎn)品多少會感覺內(nèi)心不爽。作為一個愛造的程序員,當(dāng)然也要自己寫一個Redis Proxy了。
本文就為大家介紹一個筆者自研的Redis Proxy——Nedis。
架構(gòu)圖
特點
1、無狀態(tài),Nedis節(jié)點可水平擴展
2、數(shù)據(jù)分片、讀寫分離
3、支持多種路由
4、基于Netty開發(fā),性能良好、輕量級
實現(xiàn)原理
我們從架構(gòu)圖中可以看到,Nedis主要由兩大組件組成,netty-client和netty-server。
netty-client作用如下
Redis的客戶端,如Jedis、redis-cli可以直接連接到Nedis。準(zhǔn)確的說,Redis客戶端連接到Nedis的netty-client組件,netty-client組件是處理Redis客戶端發(fā)送的請求,然后對請求進(jìn)行簡單的解碼,解析到key以后,根據(jù)key的hash值,將請求轉(zhuǎn)發(fā)到相應(yīng)的netty-server上。
netty-server作用如下
netty-server起到一個承上啟下的作用。上承netty-client,接收Redis客戶端的請求,下接Redis讀寫分離集群,將Redis客戶端的請求發(fā)送給Redis,Redis的響應(yīng)給netty-server,netty-server再把數(shù)據(jù)通過channel返回給Redis客戶端。
Nedis啟動后,會啟動多個netty-server,每個netty-server會連接到一個Redis讀寫分離集群中。Nedis的端口、Redis讀寫分離集群的信息,都在配置文件中進(jìn)行配置。
下面給大家演示一下吧
信息 |
IP |
端口 |
角色 |
redis1 |
127.0.0.1 |
6379 |
redis-server |
redis2 |
127.0.0.1 | 6381 | redis-server |
Nedis |
127.0.0.1 |
6380 |
proxy |
啟動了兩個Redis,端口分別是6379和6381,然后啟動Nedis連接這兩個Redis,Nedis端口是6380。通過redis-cli分別連接redis和Nedis,然后在連接Nedis的客戶端輸入命令,可以在monitor中看到,達(dá)到了根據(jù)key的hash值,對數(shù)據(jù)分片。
一些小細(xì)節(jié)
遇到keys命令怎么辦?
對于數(shù)據(jù)庫的Proxy,分庫分表中間件MyCat、Shardingsphere等,我們通過分表字段,比如userId、主鍵,是很容易查到我們想要的數(shù)據(jù)。但是通過非分表字段,如user_name,create_time,查詢需要掃描全部數(shù)據(jù)。
對于Redis的Proxy也一樣,如keys命令、info命令等,需要查全部Redis節(jié)點,然后把數(shù)據(jù)匯總后返回給客戶端。
在Nedis里,是禁止keys等命令的。如果Nedis收到keys等命令,Nedis會隨機選擇一臺Redis,將單臺Redis的數(shù)據(jù)返回給客戶端。
單臺Nedis扛不住怎么辦?
Jedis等客戶端連接一個Nedis節(jié)點,如果一個Nedis節(jié)點性能不足,可以將Nedis分散步部署多臺,水平擴展提高Nedis集群性能和可用性。
未來規(guī)劃
總的來說,Nedis還有很多功能需要完善。
1、支持讀寫分離
2、配置熱更新
3、支持指定key路由到指定Redis上
4、支持多種路由規(guī)則,如一致性哈希,減少由于Redis擴容或縮容,導(dǎo)致緩存穿透問題