java重寫redis服務端
阿新 • • 發佈:2019-01-12
背景
最近研究了下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
儲存設計
jredis檔案結構
預設8個分割槽,相當於8個db,資料在程式執行時同步寫入,重啟會自動讀取恢復資料到記憶體。
db檔案內容
分為一個key區+三個value型別區,對應磁碟檔案結構為:
檔案詳細介紹
key區載入所有值型別的key
value區僅載入同類型的值
緩衝區設計
線性儲存,自定義訊息格式,訊息定長,一個單元最大儲存1024位元組,檔案寫滿暫不支援動態擴容。