1 快速上手

2 JFinalConfig

3 Controller

4 AOP

5 ActiveRecord

6 Enjoy 模板引擎

7 EhCachePlugin

8 RedisPlugin

9 Cron4jPlugin

10 Validator

11 国际化

12 Json 转换

13 JFinal架构及扩展

14 升级到 5.2.2

8.3 Redis与Cache

1、基本用法

    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) 。

2、新用法(建议)

   高版本 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 官方推荐的使用方法