Fork me on GitHub

RedisClient使用说明

Published on:
Tags: Redis

项目地址

redis-client

   

Maven引入

<dependency>
  <groupId>cn.tsoft.framework</groupId>
  <artifactId>redis-client</artifactId>
  <version>1.1.0-SNAPSHOT</version>
</dependency>

Spring引入

<import resource="classpath:spring-redis.xml" />

Api使用说明

ps.本次版本增加了namespace、泛型的支持(存、取直接使用java对象),namespace可以有效的避免key名称冲突和对以后做sharding提供了基础,泛型则是提升使用友好度,本次版本包装了驱动(jedis)的95%的方法,有一些性能不好的方法没有开放,新增了一些使用上更加友好的方法。

常规操作的command实现:RedisClientImpl

二进制操作的command实现:BinaryRedisClientImpl

两者都支持直接存、取java对象,区别在于前者序列化为json以string的方式发送到redis服务器,后者序列化为byte[]以字节方式发送到redis服务,通过redis-cli工具前者可以很明确的看到存的值,后者看到的是二进制编码。

接口方法

1.png

回调接口

cn.tsoft.framework.redis.callback.GetDataCallBack

接口提供两个方法

    /**
     * ttl时间,不是所有命令都支持ttl设置
     * */
    int getExpiredTime();
 
    /**
     * 执行回调方法
     */
    R invoke();

ps.int getExpiredTime();这个方法并不是所有命令都支持(hget系列不支持,因为hash的attr是不支持ttl设置的,ttl必须设置在hash的key上并不是hash的attr上),因此不支持ttl的命令就采用默认的空实现。 在使用get*和hget*方法时,如果key返回为null,则通过该接口的R invoke();方法获取数据并放到redis中。 hgetAllObjects方法上的GetDataCallBack gbs参数是无效的传入null即可。 如果在get方法获取不到值时不想走数据回调时传入null即可。

示例:

//不设置回调
Metadata resule = redisClient.get(bizkey, nameSpace, Metadata.class, null);
 
List<Metadata > resule = redisClient.get(bizkey, nameSpace, new TypeReference<List<Metadata>>() {}, null);
 
//设置回调
List<Long> resule = redisClient.get(bizkey, nameSpace, new TypeReference<List<Long>>() {}, new GetDataCallBack<List<Long>>() {
            @Override
            public int getExpiredTime() {
                return 3600;
            }
            @Override
            public List<Long> invoke() {
                return getMetadataSourceProvider().getUserRoles(uid);
            }
        });
 
List<Long> resule = redisClient.hgetObject(bizkey, nameSpace, String.valueOf(uid), new TypeReference<List<Long>>() {}, new GetDataCallBack<List<Long>>() {
            @Override
            public int getExpiredTime() {
                return 0;
            }
            @Override
            public List<Long> invoke() {
                return getMetadataSourceProvider().getUserRoles(uid);
            }
        });

参数说明

get*方法的参数Class value和TypeReference type的区别,前者不支持嵌套泛型,后者支持嵌套泛型,举一个例子说明

Metadata value = redisClient.get(bizkey, nameSpace, Metadata.class, null);
 
List<Metadata> list = redisClient.get(bizkey, nameSpace, new TypeReference<List<Metadata>>(){}, null);

综合使用示例

redisClient.set(bizkey, namespace, new Metadata(), 60);//set并设置ttl60秒
redisClient.set(bizkey, namespace, new Metadata(), -1);//set不设置ttl
redisClient.setnx(bizkey, namespace, "aaaa");//key不存在时才设置值
redisClient.setex(bizkey, namespace, 60, new Metadata());//set一个key并设置ttl60秒,等价于第一行的用法
//setbit和setrange用法不多做说明,参考redis.io上面的command说明
 
redisClient.get(bizkey, namespace, new GetDataCallBack<String>(){
            @Override
            public int getExpiredTime() {
                return 60;
            }
            @Override
            public String invoke() {
                return "aaaa";
            }
});//获取,找不到取数据并set进去
 
redisClient.get(bizkey, namespace, Metadata.class, new GetDataCallBack<Metadata>(){
            @Override
            public int getExpiredTime() {
                return 60;
            }
            @Override
            public Metadata invoke() {
                return new Metadata();
            }
});//获取值,类型:Metadata
 
redisClient.get(bizkey, namespace, new TypeReference<List<Metadata.class>>(){}, new GetDataCallBack<List<Metadata>>(){
            @Override
            public int getExpiredTime() {
                return 60;
            }
            @Override
            public List<Metadata> invoke() {
                return new ArrayList<Metadata>;
            }
});//获取值,类型:List<Metadata>
 
redisClient.get(bizkey, namespace, new TypeReference<List<Metadata.class>>(){}, null);//获取值,类型:List<Metadata>
 
//getbit、getrange、getSet、hget、hgetAll、hgetObject、hgetAllObjects,用法不多做说明,参考redis.io上面的command说明
 
//管道,批量发送多条命令,但是不支持namespace需要手动添加namespace
Pipeline pipelined = redisClient.pipelined();
pipelined.set(key, value);
pipelined.get(key);
pipelined.syncAndReturnAll(); //发送命令并接受返回值
pipelined.sync();//发送命令不接受返回值
 
//其他z*、incr、decr、h*、s*命令不做说明,参考redis.io上面的command说明

Comments