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作者写的一个banch框架,具体测试数据可以在上面的网址的wiki里找到,经过分析,我认为Redis从作为缓存使用的角度来看,完全可以替换掉Memcached,因为两者性能基本相当,而Redis提供了更为丰富的功能,对各种列表、集合等数据结构提供了方便的支持,更适合缓存复杂的数据,使用也更为灵活。

解决方案 »

  1.   

    Redis4J是一个以高性能、简单易用为目标的Redis java client,支持当前Reids 2.0之后的版本,使用二进制协议实现,通信层使用了基于java nio的Netty框架。  
    能不能不要使用 netty 框架?直接使用 NIO?这样可以保证框架依赖性最小。
      

  2.   


    从技术角度来说肯定没问题的,不过站在巨人的肩膀上总会看的更远,毕竟java nio的api不太易用,需要考虑socket的很多细节,而netty又是一个成熟且性能不错的框架,所以我选择了netty,可以最大的减少整个项目的bug。
    你说的框架依赖最小的问题,我也考虑了,在开发这个项目的时候能不引用的jar包我都没有引用,比如log4j之类的基础包我都没有引用。而netty本身也是这样,它除了依赖jdk,别的没什么依赖了。
      

  3.   

    这倒也是,NIO 用起非常费劲。PS:在 github 上你咋把 eclipse 的工程信息文件和目录也传上去了 
      

  4.   

    我看了一下你写的 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 其中并没有引用到外部类中的东西,因此应该改为静态内部类。
      

  5.   

    主要是贪图省事,呵呵,如果后面有精力的话可能会用maven之类的管理一下,不过这都不重要。
      

  6.   

    多谢建议哈,我对日志没有过多研究,基本是满足我内部使用即可,至于用户日志我是觉得不需要和客户端的日志混到一起,而且用户一般也不会关心这部分日志,就像jdbc一样,用户是不关心其内部日志的,这与tomat的日志不太一样,所以我的实现很简单,主要精力放在了api的开发和线程管理上面了。
      

  7.   

    org.elk.redis4j.impl.database.BatchCommandlist为什么这个抽象类中很多方法的返回值都是 null?如果不需要返回值的话方法签名中的返回值应该是 void
      

  8.   

    你对日志的看法不正确哦。如果某一个程序能保证 100% 的无 BUG,那么用户肯定是不会去关心其中的日志的,但是调用的结果与想象中的不一致时,用户就会打开框架的日志进一步进行分析,看看是自己代码的问题,还是框架本身的问题。org.elk.redis4j.impl.transfers.Session#executeAsyncCommand 这个方法最好能使用卫语句重构一下,这 if...else 缩进的。呵呵,能自己实现 Redis 的 Java 客户端相当不错了,加油!
      

  9.   


    哈哈,你看的还挺细的,这部分我有些偷懒了,当初这样做主要是因为redis支持的函数太多了,就没另写一份接口,我还是加上void版的接口吧,呵呵。
      

  10.   


    你的说法也很对,我考虑一下吧,也实现用户自己配置自己喜欢的log方式。不过我认为这种功能属于锦上添花吧。
      

  11.   

    我用jedis 的bench测试 单线程, 跨主机访问ops 只有1000-2000 , 不跨主机 达到27712 , 超过10倍。有谁碰到过吗?
    比c客户端, hiredis 的10000 差1个数量级, 同样的网络环境。后定位到RedisInputStream.readLine() 方法慢导致。
      

  12.   

    我用你代码BenchOfRedis4j 类,单线程
    static int repeats = 40000;// 每个线程循环执行的次数
    static int corePoolSize = 1;// 测试程序启动的工作线程数
    static int dataLength = 200;// 数据长度,单位byte
    跑下来 tps 1617。和我用jedis一个水平,比hiredis 这种c 客户端慢很多。后者至少1万多,同样跨网络环境下。你自己跑的BenchOfRedis4j  单线程,tps多少呢?