Redis与Cache联合起来可以非常方便地使用Redis服务,Redis对象通过use()方法来获取到Cache对象,Cache对象提供了丰富的API用于使用Redis服务,下面是具体使用示例:
public void redisDemo() { // 获取名称为bbs的Redis Cache对象 Cache bbsCache = Redis.use("bbs"); bbsCache.set("key", "value"); bbsCache.get("key"); // 获取名称为news的Redis Cache对象 Cache newsCache = Redis.use("news"); newsCache.set("k", "v"); newsCache.get("k"); // 最先创建的Cache将成为主Cache,所以可以省去cacheName参数来获取 bbsCache = Redis.use(); // 主缓存可以省去cacheName参数 bbsCache.set("jfinal", "awesome"); }
以上代码中通过”bbs”、”news”做为use方法的参数分别获取到了两个Cache对象,使用这两个对象即可操作其所对应的Redis服务端。
通常情况下只会创建一个RedisPlugin连接一个redis服务端,使用Redis.use().set(key,value)即可。
注意:使用 incr、incrBy、decr、decrBy 方法操作的计数器,需要使用 getCounter(key) 进行读取而不能使用 get(key),否则会抛反序列化异常。同理:incrBy(key, value) 操作不能使用 set(key, value) 。
高版本 jfinal 针对 Redis、Cache 这两个类新增了 call 方法,该方法直接暴漏出 Jedis 对象供使用,可以绕过序列化、反序列化过程
// 使用 lambda 开放 Jedis API Long ret = Redis.call(j -> j.incrBy("key", 1)); Long ret = Redis.call(jedis -> { return jedis.incrBy("key", 1); });
如果配置了多个 cache 可以通过 Redis.use(...) 先获取对应的 cache 对象再进行操作
// 指定 cacheName 参数再操作 Long ret = Redis.use("mycache").call(j -> j.incrBy("key", 1)); // Redis.use() 不带参表示获取默认 cache Long ret = Redis.use().call(j -> j.incrBy("key", 1));
存入 String 以外类型数可以将其先转成 json 再操作
User user = dao.findById(userId); String userJson = JsonKit.toJson(user); Redis.call(jedis -> { return jedis.set("user", userJson); }); // 或者简化为下面代码 Redis.call(j -> j.set("user", JsonKit.toJson(user)));
以上 call 用法,不涉及对象的序列化、反序列化,直接操作 jedis 对象,在当下 json 非常普及的背景下是 jfinal 官方推荐的使用方法