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

存储设计

jredis文件结构

默认8个分区,相当于8个db,数据在程序运行时同步写入,重启会自动读取恢复数据到内存。

db文件内容

分为一个key区+三个value类型区,对应磁盘文件结构为:

文件详细介绍

key区加载所有值类型的key
value区仅加载同类型的值

缓冲区设计

线性存储,自定义消息格式,消息定长,一个单元最大存储1024字节,文件写满暂不支持动态扩容。

原文地址:http://blog.51cto.com/14171137/2341997

时间: 2024-10-29 22:26:42

java重写redis服务端的相关文章

delphi调用 java 的 WebService服务端.

// InvRegistry.RegisterInvokeOptions(TypeInfo(ModelADServicePortType), ioLiteral); InvRegistry.RegisterInvokeOptions(TypeInfo(ModelADServicePortType), ioDocument); delphi调用 java 的 WebService服务端.,布布扣,bubuko.com

用java做thrift服务端,php做thrift客户端简单例子

注意: 1).需要的包以及路径问题要注意修改为自己本地的 2)详细情况见  http://pan.baidu.com/s/1qW8xI0k 这里以Hello.thrift为例 namespace java hellodemo namespace php hellodemo service Hello{ string helloString(1:string para) i32 helloInt(1:i32 para) bool helloBoolean(1:bool para) void hel

Java Se : Java NIO(服务端)与BIO(客户端)通信

Java目前有三种IO相关的API了,下面简单的说一下: BIO,阻塞IO,最常用的Java IO API,提供一般的流的读写功能.相信学习Java的人,都用过. NIO,非阻塞IO,在JDK1.4中开始出现,大量应用与服务器端编程,用于提高并发访问的性能,常用的NIO框架有Netty,Mina. AIO,异步IO,在JDK1.7开始出现.还没有了解过,等以后了解了再说. 阻塞.非阻塞,同步.异步 在写这篇文章前,在网上了解了一下,其中争议最的问题要数阻塞.非阻塞怎么理解,异步.同步怎么理解.

WebSocket集成XMPP网页即时通讯1:Java Web Project服务端/客户端Jetty9开发初探

Web 应用的信息交互过程通常是客户端通过浏览器发出一个请求,服务器端接收和审核完请求后进行处理并返回结果给客户端,然后客户端浏览器将信息呈现出来,这种机制对于信息变化不是特别频繁的应用尚能相安无事,但是对于那些实时要求比较高的应用来说,比如说在线游戏.在线证券.设备监控.新闻在线播报.RSS 订阅推送等等,当客户端浏览器准备呈现这些信息的时候,这些信息在服务器端可能已经过时了.所以保持客户端和服务器端的信息同步是实时 Web 应用的关键要素,对 Web 开发人员来说也是一个难题.在 WebSo

Redis 服务端配置——Could not connect to Redis at 127.0.0.1:6379: Connection refused

[[email protected] 桌面]# redis-cli Could not connect to Redis at 127.0.0.1:6379: Connection refused Could not connect to Redis at 127.0.0.1:6379: Connection refused not connected> exit [[email protected] 桌面]# redis-server /etc/redis.conf [[email prote

java TCP客户端 服务端 互访

服务端: 1, 创建socket服务器服务,服务器端为了让客户端可以连接上,必须提供端口,监听一个端口 2,获取客户端对象,通过客户端的socket流和对应的客户端进行通信 3,获取客户端的socket流的读取流 4,读取数据并显示在服务器端 5,关闭资源 package cn.net.tcp; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.

Java的HTTP服务端响应式编程

为什么要响应式编程? 传统的Servlet模型走到了尽头 传统的Java服务器编程遵循的是J2EE的Servlet规范,是一种基于线程的模型:每一次http请求都由一个线程来处理. 线程模型的缺陷在于,每一条线程都要自行处理套接字的读写操作.对于大部分请求来讲,本地处理请求的速度很快,请求的读取和返回是最耗时间的.也就是说大量的线程浪费在了远程连接上,而没有发挥出计算能力.但是需要注意一点,线程的创建是有开销的,每一条线程都需要独立的内存资源.JVM里的-Xss参数就是用来调整线程堆栈大小的.而

window10 64位系统下redis服务端的下载-安装-配置-卸载

redis下载 windows下载地址:https://github.com/microsoftarchive/redis/releases 自己定义一个目录,解压一下,我的目录是这个,其中:redis-cli.exe是客户端,redis-server.exe是服务端 redis启动 之后cmd打开一个窗口,将目录切换到redis的目录下,运行启动命令 redis-server.exe redis.windows.conf .如图 这个时候就是启动成功了,此时另外启动一个cmd窗口,切换到red

info查看redis服务端信息详解

#主要查看参数: # Server uptime_in_seconds:83904           #redis服务运行时间 uptime_in_days:0                  #redis运行天数 # Clients  connected_clients:1               #已连接的客户端数量(不包括从slave服务器过来的连接) blocked_clients:0                 #正在等待&阻塞命令(BLPOP/BRPOP/BRPOPLPU