46 Star 91 Fork 46

小路 / async-redis-client

Create your Gitee Account
Explore and code with more than 6 million developers,Free private repositories !:)
Sign up
This repository doesn't specify license. Without author's permission, this code is only for learning and cannot be used for other purposes.
Clone or download
README.md 3.75 KB
Copy Edit Web IDE Raw Blame History
thor.lee authored 2013-05-13 15:59 . 文档的简单修改

async-redis-client

基于netty实现的非阻塞redis客户端

	AsyncRedisClient client = new NettyRedisClient("172.16.3.213:6379", 1, null);
	String result = client.set("TEST_KEY2", "CACHED").get(1, TimeUnit.SECONDS);
    String cached = (String) client.get("TEST_KEY2").get(1, TimeUnit.SECONDS);

    RedisClient client = new SyncRedisClient("172.16.3.213:6379", 1, null, 1, TimeUnit.SECONDS);
    String result = client.set("TEST_KEY2", "CACHED");
    String cached = (String) client.get("TEST_KEY2");

mvn

mvn 仓库 :https://oss.sonatype.org/content/repositories/snapshots/

	<dependency>
		<groupId>mobi.51app</groupId>
		<artifactId>async-redis-client</artifactId>
		<version>0.1.4-SNAPSHOT</version>
	</dependency>

优势

  • 基于netty的非阻塞的实现。相比较jedis, 在多线程并发访问的情况下有更好的性能。
  • 更简单的java api。jedis的api完全基于redis的command来抽象,只提供了基于string和byte[]的操作接口,在实际使用中并不方便。async-redis-client针对常用的操作做了更好的抽象,集成了序列化和反序列化的实现,使用上更符合java编程的习惯

限制

  • 目前没有实现所有的redis命令。将实现并覆盖大部分常用的redis命令,包括strings,hashes, lists,sets, sort sets...。但是其中部分命令可能不会被实现。
  • 由于默认采用了java 序列化方案,因此async-redis-client操作的数据可能无法和其他语言实现的redis客户端协同工作
  • scritps的使用是受限的。由于redis的协议限制,很难判断eval script后返回的响应边界,所以目前使用eval命令时需要确保执行的script只返回一个reply,不能是多个reply。

其他

  • 不打算实现pipeline功能。(因为pipeline主要是为了解决在bio模式下io利用率较低的问题??是否只有这一个好处?),使用async-redis-client不需要再使用pipeline的功能了。 如下的使用方式即可:

      Future<String> result = client.set("TEST_KEY2", "CACHED");
     	Future<String> cached = (Future<String>) client.get("TEST_KEY2");
     	String str = result.get();
     	String cachedValue = cached.get();
  • 为set和get方法提供了几个不同的覆盖实现,以区别数值类型和其他对象类型。对象类型默认会使用内建的序列化机制序列化存储。数值类型则按照redis的字符串方式存储,以保证incr和decr操作可以正常工作。如下:

      Future<String> set(String key, int o);
      Future<String> set(String key, long o);
      Future<String> set(String key, double o);
      Future<String> set(String key, Object o);
      
      Future<Object> get(String key);
      Future<Integer> getInt(String key);
      Future<Long> getLong(String key);
      Future<Double> getDouble(String key);
  • 对象的序列化代码来自于 spymemcached 。默认有大对象的压缩机制。

HA方案

尝试下的引入了一些高可用方案

  • Master-Slave支持。 支持Redis的Master-Slave配置。:

      RedisClient client = new MSRedisClient(master, slaves);

在这种情况下会启用读写分离,读操作会访问slave节点。

  • Router支持。 定义了一个简单的Router接口用来水平切分数据, 默认提供了一个一致性Hash方式的实现,使用Redis做缓存时可考虑这种方式,如果是用作DB的话,可以自定义Router实现定制的切分规则。

      RedisClient client = new RoutedRedisClient(new KetamaRouter(clients));
  • 多写方案。双写或者多写Master的方案,也在考虑支持中。

  • 组合使用。 Router和Master-Slave已经双写Master的方案是可以组合使用的,即Router的水平切分可以对应到Master-Slave或者多Master的一组节点。

Comment ( 0 )

Sign in for post a comment

Java
1
https://gitee.com/xulu/async-redis-client.git
git@gitee.com:xulu/async-redis-client.git
xulu
async-redis-client
async-redis-client
master

Search