背景
jredis是一个高性能、高可用、低延迟的内存数据库,服务端源码请移步这里
编写目的
加深对底层网络传输,文件存储,文件索引的认知,同时也巩固自身的知识点。
协议特征
- 兼容redis原生协议
set get
lpush rpush lrange blpop brpop llen
hset hget hgetall hscan
pub sub
select keys scan expire del
multi exec discard
incr incrby
flushdb
slaveof
....
- 支持db分区隔离(select)
- 支持事务机制(multi、exec、discard)
- 支持阻塞队列(blpop、brpop)
- 支持发布订阅
内存消耗
仅key和索引占用JVM堆内存,value则存储在堆外内存上
数据持久
- mmap技术,对比Redis的RDB和AOF更有优势,尽可能的保证数据不丢失(除非掉电或宕机),因为数据同步写入在page-cache,而它只受os的调度。
- 动态扩容
系统概述
以netty为网络框架,解析和编码redis协议,并对相关操作进行持久。
核心类图
基准测试
单机(4核8g),1000连接,随机value set,tps大致在3W+
参考下图,16379为java手撸的jredis,7003为redis
存储设计
jredis文件结构
默认8个分区,相当于8个逻辑DB,数据在程序运行时同步写入,重启自动恢复数据到内存。
db文件内容
分为一个index(key)区+三个value(data)类型区,对应磁盘文件结构为:
内存&存储设计
内存区:存储key和对应的value值索引
映射区/磁盘区:存储key和value
buffer设计
线性存储,消息定长,一个单元默认最大存储1024字节,支持配置。
单节点配置
#服务地址
server.host=127.0.0.1
#服务端口
server.port=16379
#内存大小
memorySize=32
#db数量
dbSize=8
logging.level.root=error
高可用-主从配置
只需要加入如下配置项
主配置
replication.mode=master
从配置
replication.mode=slave
slaver.of=127.0.0.1:16379
项目地址:
https://github.com/3kuai/jredis
https://gitee.com/lmx_007/jredis
欢迎更多伙伴们一起来建议和完善它