ef-Redis是java 版本的redis server
命令:仅支持服务连接与五大基本类型相关的命令
存储:仅支持AOF日志
key自动清除:目前只支持自动超时清除,暂不支持key淘汰策略
多路复用:支持 epoll,kqueue,select 默认优先级由高到低,同时支持本地和单路复用
强烈推荐使用单路select线程模型
作者开发这个软件的时,就职公司好未来正面临12k双减政策
1,启动简单,方便测试,可以嵌入式部署,无需申请redis云资源
2,基础架构部正在做redis proxy,开发提供技术参考
3,解除对大厂面试官面试redis相关问题的迷惑侧重点的迷惑
支持服务间的消息传递和数据共享
集群架构方式:客户端路由
见作者知乎文档:
1,Netty 2,数据结构 3,java io
Java + Netty
idea内部直接启动MyRedisServer
redis-client 或者 redis-desktop-manager 都可以
同样资源下 Java版Redis的QPS比C++ Redis性能高 15.6%
EF-Redis,与Redis相当
java版 Redis 请求耗时略逊于 C++版 Redis
redis-benchmark 在代码根目录中 测试命令: redis-benchmark.exe -h 127.0.0.1 -p 6378 -c 100 -n 1000000
| 命令 | C++ 版 QPS | C++ 版 3 毫秒占比 | Java 版 QPS | Java 版 3 毫秒占比 | 性能对比(Java/C++) |
|---|---|---|---|---|---|
| PING_INLINE | 100030.01 | 100.00% | 103156.59 | 100.00% | 103.13% |
| PING_BULK | 100030.01 | 100.00% | 102322.73 | 100.00% | 102.29% |
| SET | 100381.45 | 99.98% | 102061.64 | 100.00% | 101.67% |
| GET | 98068.06 | 99.99% | 101864.11 | 100.00% | 103.87% |
| INCR | 101214.57 | 100.00% | 101905.64 | 100.00% | 100.68% |
| LPUSH | 99522.29 | 99.99% | 83836.35 | 99.88% | 84.24% |
| RPUSH | 71880.39 | 100.00% | 98020.00 | 99.96% | 136.37% |
| LPOP | 68917.98 | 99.99% | 75007.50 | 99.92% | 108.83% |
| RPOP | 69084.62 | 100.00% | 75740.36 | 99.96% | 109.63% |
| SADD | 69925.18 | 100.00% | 104351.45 | 100.00% | 149.23% |
| HSET | 70363.07 | 100.00% | 102764.36 | 100.00% | 146.05% |
| SPOP | 69851.91 | 100.00% | 75585.79 | 99.96% | 108.21% |
| LPUSH (needed to benchmark LRANGE) | 84803.26 | 100.00% | 77802.85 | 99.98% | 91.74% |
| LRANGE_100 (first 100 elements) | 38105.40 | 100.00% | 38130.10 | 99.89% | 100.06% |
| LRANGE_300 (first 300 elements) | 17438.31 | 100.00% | 17464.50 | 99.97% | 100.14% |
| LRANGE_500 (first 450 elements) | 12150.37 | 100.00% | 12136.66 | 100.00% | 99.97% |
| LRANGE_600 (first 600 elements) | 9739.56 | 100.00% | 9695.18 | 100.00% | 99.54% |
| MSET (10 keys) | 76359.20 | 99.99% | 96946.20 | 99.99% | 126.96% |
| 合计值平均值 | 78491.85 | - | 90741.41 | - | 115.60% |
上图为豆包生成,感谢字节公司的工人朋友们开发出这么好的免费软件
左侧为C++版本redis ,右侧为Java 版本redis
➕ v 一起交流互联网
凭什么Java版本redis性能可以超越C++redis 15%?
1.1 NioEventLoopGroup指定单线程的线程池,并设置RingBlockingQueue。
1.2 ServerBootstrap指定了池化消息内存内存池
1.3 修改了最大帧大小,netty最大支持int最大值的大小帧,256mb,小于c++ redis版本的500mb,c++支持最大值500mb是因为c++支持无符号int
索性当前版本支持最大值的大小帧大小改为了50mb,设置太大jvm会频繁垃圾回收等操作,印象接口耗时稳定性
1.4 移除了以前的单线程执行redis存储业务线程,直接使用io处理消息线程执行redis存储业务
RingBlockingQueue开发意图原本是aof日志专用的单线程写单线程读的堵塞队列。
2.1 ,为什么自己开发,不用开源的?
java并没有scsp专用的堵塞队列,因为JCtools有开源的scsp堵塞队列,并没有实现BlockingQueue接口,而且性能并不好。
RingBlockingQueue用到了连续内存页技术,读写内存更快,内存预申请,是Java自带堵塞队列性能的10倍以上。
3.1 CPP Redis 5.0 版本用的是nio epool模型,EF-Redis 用的是 select 模型,在连接数100 这个量级,select优势更大一些
3.2 CPP Redis 5.0 最大帧支持500mb,EF-Redis 支持 50mb
3.3 二者数据结构不同
3.4 Java redis 没有实现 ttl超时探测,但这点不影响性能
3.5 Java redis 没有实现 哨兵 和 主从复制,但不影响性能
分支中有操作命令无gc的版本,gc分支合并master分支后,有望性能在提升2%左右
1,Java基础
b站搜索 “韩顺平java”
2,Netty基础
b站搜索 “韩顺平netty”
3,redis tcp 协议