redis ICallback接口

这个接口如何实现有例子吗。

评论区

JFinal

2016-12-14 10:42

下面这样用即可:
Redis.call(new ICallback(){
public void call(Jedis jedis) {
}
}
这个接口本质上的好处就是在 call 方法中为你提供一个未封装过的 jedis 对象,可以使用原生的 jedis 的各种方法,而 jfinal 封装过的 Cache 里面并不会覆盖所有 jedis 的方法

jacok

2016-12-14 10:48

@JFinal 那序列化操作也要自己在做一次吗。操作的是jedis

jacok

2016-12-14 10:49

@JFinal 我想用select 方法 最好的办法是怎么样做。

jacok

2016-12-14 10:54

@JFinal Cache cache = Redis.use();
cache.select(1);
cache.set("1", "2");
我想操作Cache 能做到吗。

JFinal

2016-12-14 10:56

操作 select 最好的办法是创建多个 Redis 实例,不同的 Redis 对象连接上不同的 db

jacok

2016-12-14 10:59

@JFinal 好的,谢谢您

JFinal

2016-12-14 11:05

@jacok 多说一句,直接用 Redis.use().select(n) 切换这个方法切换数据库是无法使用的,因为 select(int) 这个方法中切换完成以后,会调用 jedis.close(),关联连接以后又会回到原来的数据库,相当于切换不成功, jedis 这样设计是为了线程安全,所以当某线程获取到连接的时间点是可以切换,但 close() 了以后,其它线程会再次获取到这个连接,如果不恢复到最初的 db,就会造成混乱

综上,select 这个方法本质上只有在 ICallback 接口中才可以正常使用,因为这个接口中的方法是处于一个连接中,并且处在连接关闭之前

还有一种 select 的使用方式是通过创建多个 RedisPlugin,让每一个不同的 RedisPlugin 通过不同的 db 参数连到不同的 db,这样在用的时候,不同的 Cache 天然就连到了不同的库,不用使用 select 这个方法即可实现多数据库的访问

jacok

2016-12-14 22:11

@JFinal 恩 已经明白了。谢谢波总。只是觉得db0-db15只用了db0 是不是没用对,就研究了一下。创建多个RedisPlugin这个我明白了,只是变成要连接多个redis服务 ,多个RedisPlugin对象 每个对象要连接不同的端口或者不同的ip。没有使用到db0-db15这个redis自动分库的功能。

JFinal

2016-12-14 22:43

多个 RedisPlugin 的用法分为三种情况:
1:每个 RedisPlugin 对象连接到不同的 redis 服务端
2:每个 RedisPlugin 对象连接到同一个 redis 服务端的不同 db
3:以上两种情况的混合

第一种情况的例子:
new RedisPlugin("r1", "192.168.1.111");
new RedisPlugin("r2", "192.168.1.222");
通过 Redis.use("r1") 就能访问 ip 后缀为 111 的服务端,通过Redis.use("r2") 就能访问 ip 后缀为 222 的服务端

第二种情况的例子:
new RedisPlugin("r1", "localhost", 6379, 3000, "myPasswrod", 1);
new RedisPlugin("r2", "localhost", 6379, 3000, "myPasswrod", 2);
以上两个 RedisPlugin 同时连接到了 localhost 这同一个服务端的不同的 database,第一个为 db 1 第二个为 db2,注意看最后一个参数就是 db 号
通过 Redis.use("r1") 可直接访问 db1,通过 RedisUse("r2") 则直接访问 db2,通过这种方式就不再需要使用 select(db) 来切换 redis 的 db

第三种情况是上面两种情况的混用,在此不在赘述

热门反馈

扫码入社