背景
jredis是一个高性能、高可用、低延迟的内存数据库,服务端源码请移步这里
编写目的
加深对底层网络传输,文件存储,文件索引的认知,同时也巩固自身的知识点。
协议特征
兼容redis原生协议set getlpush rpush lrange blpop brpop llenhset hget hgetall hscanpub subselect keys scan expire delmulti exec discardincr incrbyflushdbslaveof....
支持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=8logging.level.root=error
高可用-主从配置
只需要加入如下配置项
主配置
replication.mode=master
从配置
replication.mode=slaveslaver.of=127.0.0.1:16379
项目地址:
/3kuai/jredis
/lmx_007/jredis
欢迎更多伙伴们一起来建议和完善它