1. 程式人生 > >java重寫redis服務端

java重寫redis服務端

背景

最近研究了下redis的協議、持久化策略以及單執行緒模型,突然覺得和java很搭配。原始碼請用力戳這裡

目的

鑑於redis是c編寫,java的同學讀起來比較費力,所以寫java版。讓更多的開發者理解高效能設計的精髓,同時加深底層傳輸,儲存,索引的認知。

特徵

1. 相容大多數redis原生協議
2. 相容redis桌面客戶端0.9+
3. db分割槽隔離和事務機制
4. 高階特性:如阻塞佇列,釋出訂閱
5. 資料持久採用jdk原生MappedByteBuffer同步刷盤(虛擬記憶體技術)
6. key,value儲存隔離,僅key空間佔虛擬機器記憶體,而value只在使用時才載入,所以優於redis
7. 相容jedis,spring-data-redis,spring-boot-data等常用redis java客戶端工具

基準測試

單機(4核8g),1000連線,隨機value set,tps大致在3W+
參考下圖,16379為jredis,7003為redis
image
image

儲存設計

jredis檔案結構

預設8個分割槽,相當於8個db,資料在程式執行時同步寫入,重啟會自動讀取恢復資料到記憶體。
image

db檔案內容

分為一個key區+三個value型別區,對應磁碟檔案結構為:
image

檔案詳細介紹

key區載入所有值型別的key
value區僅載入同類型的值
image

緩衝區設計

線性儲存,自定義訊息格式,訊息定長,一個單元最大儲存1024位元組,檔案寫滿暫不支援動態擴容。
image