用Netty实现Redis

这是一个用Netty实现的Redis(服务器版本)

github地址:https://github.com/pyb1993/JavaRedis

目的有三:

  1. 深入理解redis,将redis上的各种功能慢慢迁移到java上来
    用C语言来实现太麻烦了,而且一般工作中用不到C,加上我前两个项目(编译器和http服务器)都是用c写的,正好练习一下Java
    降低开发难度,对于一些功能可以更轻松的实现
    未来可以用JNI将重要数据结构封装起来,提高性能(另开一个branch)
  2. 理解现代服务器的网络/线程模型
    最近刚刚学习了Netty,顺便熟悉netty的使用
  3. 可以用来学习分布式,实现简单的主从,集群功能
    学习分布式不可能只动眼不动手,所以以后可以这个项目为出发点开始魔改

Version-1架构

因为使用了Netty,所以不需要过于操心网络,针对redis本身的特点(来往的数据量比较小,全是纯内存操作,其实cpu开销也不是很大),所以单次操作非常的快,这种情况下,cpu并不是瓶颈,往往网络先达到瓶颈(这里不是指网卡流量跑满,而是说处理各种链接的开销)
所以采取单线程(多线程带来的线程同步的开销相当大,暂时没有必要)
也就是 网络 + 业务 都在一个线程里面(一开始也尝试使用额外的线程池来执行,后面发现没有必要)

Handler
用一个Map维护命令和Handler之间的关系,来一个命令就去查找对应的Handler,然后调用对应的handler
编码/解码:
先不考虑性能
直接使用阿里的FastJson,用来序列化参数(command 对应的类型都利用一个hashMap提前注册好)
协议格式 :
每个单元 长度 + bytes
一共三个单元:
requestId(用来校验)
command(命令类型)
content(结果,也是FastJson序列化的字节)
数据库部分:
在RedisDb.java文件里面,核心是一个 
HashMap<String,RedisObject>

RedisObject定义如下:

class RedisObject{
   
    int type;
    Object data;
    .....
}   
实现了HyperLogLog数据结构:
基本原理:
  • 令K 为n次投掷「硬币」面最大的投掷次数
  • P(A) = 所有投掷次数 P(Xi<=K)=(1(1/2)k
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值