发一个Redis的客户端应用程序

srz007 2011-04-21 06:02:21
  Redis是一个基于key/value的系统,如果你打算用Memcached或正在用,那么我建议可以考虑用Redis替换了。
  Redis目前最新版本是2.2.4,用着很不错,不过java版本的客户端比较的不给力,所以我自己写了一个,就叫Redis4J吧。
  Redis4J是一个以高性能、简单易用为目标的Redis java client,支持当前Reids 2.0之后的版本,使用二进制协议实现,通信层使用了基于java nio的Netty框架。
  经过与Redis.io上面推荐的客户端(JRedis、Jedis)做过对比后,个人认为要优于它们,因此以开源的方式发布出来,欢迎大家试用并反馈建议和意见。
  代码在这里【https://github.com/srz/RedisClient4Java】,目前还未发布任何正式版本,不过所有的redis功能已经基本完成,junit测试用例也都完成并全部通过测试了,后面的工作主要就是补文档、示例代码等。
  关于性能测试,我使用了XMemcached作者写的一个banchmark框架,具体测试数据可以在上面的网址的wiki里找到,经过分析,我认为Redis从作为缓存使用的角度来看,完全可以替换掉Memcached,因为两者性能基本相当,而Redis提供了更为丰富的功能,对各种列表、集合等数据结构提供了方便的支持,更适合缓存复杂的数据,使用也更为灵活。

...全文
1036 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ericsinstar 2012-08-16
  • 打赏
  • 举报
回复
没有看到下载链接
王海龙-南京 2012-04-28
  • 打赏
  • 举报
回复
我用你代码BenchmarkOfRedis4j 类,单线程
static int repeats = 40000;// 每个线程循环执行的次数
static int corePoolSize = 1;// 测试程序启动的工作线程数
static int dataLength = 200;// 数据长度,单位byte
跑下来 tps 1617。和我用jedis一个水平,比hiredis 这种c 客户端慢很多。后者至少1万多,同样跨网络环境下。你自己跑的BenchmarkOfRedis4j 单线程,tps多少呢?
王海龙-南京 2012-04-28
  • 打赏
  • 举报
回复
我用jedis 的benchmark测试 单线程, 跨主机访问ops 只有1000-2000 , 不跨主机 达到27712 , 超过10倍。有谁碰到过吗?
比c客户端, hiredis 的10000 差1个数量级, 同样的网络环境。后定位到RedisInputStream.readLine() 方法慢导致。
沭灬望月 2012-02-27
  • 打赏
  • 举报
回复
怎么下啊,难道要我一个文件一个文件的下吗
millerhan 2012-02-01
  • 打赏
  • 举报
回复
没有看到啊
wenshal 2011-05-06
  • 打赏
  • 举报
回复
lz强人,期待早日完善
srz007 2011-04-23
  • 打赏
  • 举报
回复
添加了日志配置文件,可以配置是输出到控制台还是输出到文件,以及输出的日志级别。
srz007 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 bao110908 的回复:]

你对日志的看法不正确哦。如果某一个程序能保证 100% 的无 BUG,那么用户肯定是不会去关心其中的日志的,但是调用的结果与想象中的不一致时,用户就会打开框架的日志进一步进行分析,看看是自己代码的问题,还是框架本身的问题。

org.elk.redis4j.impl.transfers.Session#executeAsyncCommand 这个方法最好能使用卫语句重构一下,这 if...e……
[/Quote]

你的说法也很对,我考虑一下吧,也实现用户自己配置自己喜欢的log方式。不过我认为这种功能属于锦上添花吧。
srz007 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bao110908 的回复:]

org.elk.redis4j.impl.database.BatchCommandlist

为什么这个抽象类中很多方法的返回值都是 null?如果不需要返回值的话方法签名中的返回值应该是 void
[/Quote]

哈哈,你看的还挺细的,这部分我有些偷懒了,当初这样做主要是因为redis支持的函数太多了,就没另写一份接口,我还是加上void版的接口吧,呵呵。
  • 打赏
  • 举报
回复
你对日志的看法不正确哦。如果某一个程序能保证 100% 的无 BUG,那么用户肯定是不会去关心其中的日志的,但是调用的结果与想象中的不一致时,用户就会打开框架的日志进一步进行分析,看看是自己代码的问题,还是框架本身的问题。

org.elk.redis4j.impl.transfers.Session#executeAsyncCommand 这个方法最好能使用卫语句重构一下,这 if...else 缩进的。

呵呵,能自己实现 Redis 的 Java 客户端相当不错了,加油!
  • 打赏
  • 举报
回复
org.elk.redis4j.impl.database.BatchCommandlist

为什么这个抽象类中很多方法的返回值都是 null?如果不需要返回值的话方法签名中的返回值应该是 void
srz007 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bao110908 的回复:]
我看了一下你写的 LogUtil,你用的是 JDK 的 logging,但是强行设置 log handler 为 ConsoleHandler 了,这样做的话只能将 log 信息写往控制台了,没有好的扩展性。

另外,这个只是一个 Redis 的客户端,用户在使用时肯定还会使用到其他框架,大多数的开源框架使用的是 Commons Logging 日志或者是 slf4j 的日志,而绝大数用的是 ……
[/Quote]
多谢建议哈,我对日志没有过多研究,基本是满足我内部使用即可,至于用户日志我是觉得不需要和客户端的日志混到一起,而且用户一般也不会关心这部分日志,就像jdbc一样,用户是不关心其内部日志的,这与tomat的日志不太一样,所以我的实现很简单,主要精力放在了api的开发和线程管理上面了。
srz007 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bao110908 的回复:]
这倒也是,NIO 用起非常费劲。

PS:在 github 上你咋把 eclipse 的工程信息文件和目录也传上去了
[/Quote]
主要是贪图省事,呵呵,如果后面有精力的话可能会用maven之类的管理一下,不过这都不重要。
  • 打赏
  • 举报
回复
我看了一下你写的 LogUtil,你用的是 JDK 的 logging,但是强行设置 log handler 为 ConsoleHandler 了,这样做的话只能将 log 信息写往控制台了,没有好的扩展性。

另外,这个只是一个 Redis 的客户端,用户在使用时肯定还会使用到其他框架,大多数的开源框架使用的是 Commons Logging 日志或者是 slf4j 的日志,而绝大数用的是 log4j 的实现。

作为用户来考虑的话,你认为是管理一个日志方便一些,还是管理多种日志方便一些呢?

JDK 的日志不需要在代码中写死,可以有配置文件,但必须在 JVM 启动时加上 -Djava.util.logging.config.file=xxx.properties 的参数进行设置,用起来也不方便。

像 tomcat 的日志默认使用的是 JDK logging,但是经过一些配置之后也是可以使用 log4j 的,这样的话就具有很高的扩展性。

PS:LogUtil 中的内部类 LogFormatter 其中并没有引用到外部类中的东西,因此应该改为静态内部类。
  • 打赏
  • 举报
回复
这倒也是,NIO 用起非常费劲。

PS:在 github 上你咋把 eclipse 的工程信息文件和目录也传上去了
srz007 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bao110908 的回复:]
Redis4J是一个以高性能、简单易用为目标的Redis java client,支持当前Reids 2.0之后的版本,使用二进制协议实现,通信层使用了基于java nio的Netty框架。


能不能不要使用 netty 框架?直接使用 NIO?这样可以保证框架依赖性最小。
[/Quote]

从技术角度来说肯定没问题的,不过站在巨人的肩膀上总会看的更远,毕竟java nio的api不太易用,需要考虑socket的很多细节,而netty又是一个成熟且性能不错的框架,所以我选择了netty,可以最大的减少整个项目的bug。
你说的框架依赖最小的问题,我也考虑了,在开发这个项目的时候能不引用的jar包我都没有引用,比如log4j之类的基础包我都没有引用。而netty本身也是这样,它除了依赖jdk,别的没什么依赖了。
  • 打赏
  • 举报
回复
Redis4J是一个以高性能、简单易用为目标的Redis java client,支持当前Reids 2.0之后的版本,使用二进制协议实现,通信层使用了基于java nio的Netty框架。


能不能不要使用 netty 框架?直接使用 NIO?这样可以保证框架依赖性最小。
srz007 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gentleboy2009 的回复:]

这个帖子什么意思??
[/Quote]

我写了个客户端,推荐给大家
gentleboy2009 2011-04-21
  • 打赏
  • 举报
回复
这个帖子什么意思??

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧