redis使用问题

您好有问题请教。我在使用redis插件时,使用除database0以外的数据库时,获取所有的对象,只要对象不是空的,都报空指针,com.jfinal.plugin.redis.serializer.FstSerializer.valueFromBytes(FstSerializer.java:78)


但使用数据库0时候,就不会出现任何问题

评论区

JFinal

2017-01-04 11:10

为 database 0 以外的数据库再创建别一个 RedisPlugin 对象,使用 Redis.use(...) 的方式切换过去再调用其方法: Redis.use(otherDb).get(...)

注意:指定 database 创建 RedisPlugin 有相应的构造方法可以使用,注意看一下

super超

2017-01-04 11:16

@JFinal 构造方法我都看了呀。
RedisPlugin(String cacheName, String host, int port, int timeout, String password, int database)
报错是
0 = {StackTraceElement@1400} "com.jfinal.plugin.redis.serializer.FstSerializer.valueFromBytes(FstSerializer.java:78)"
1 = {StackTraceElement@1401} "com.jfinal.plugin.redis.Cache.valueFromBytes(Cache.java:1211)"
2 = {StackTraceElement@1402} "com.jfinal.plugin.redis.Cache.get(Cache.java:91)"
3 = {StackTraceElement@1403} "cc.superlink.api.ScannersApiController.main(ScannersApiController.java:55)"

super超

2017-01-04 11:18

@JFinal 我试一下哈。谢谢~~~

JFinal

2017-01-04 11:19

创建另一个,指向 database 2
RedisPlugin rp = new RedisPlugin("db2", ip, 8888, 30, pass, 2);
me.add(rp)

然后用的时候 Redis.use("db2").get(...) 不要使用 select(2) 来切换数据库,这个 select 方法是需要配合 Redis.call(...) 来使用的

JFinal

2017-01-04 11:20

再提醒一下,获取 incr incrBy decr decrBy 设置的数据,需要使用 getCounter(key) 方法,而不能使用 get(key) 方法

super超

2017-01-04 11:22

@JFinal 谢谢谢谢,~~ 是这个的问题。 找到原因了,是方法调用出的错。谢啦~~

JFinal

2017-01-04 11:24

@super超 通过这种方式解决后,有多少数据库,只需要通过 Redis.use(...) 切换过去就好,非常方便,当然这个 Redis.use(...) 方法并不仅仅是用来切换数据库,还可以事先指向另一台 redis 服务器,这样就可以切换到不同的服务端

super超

2017-01-04 11:34

@JFinal 那个我理解的,我刚试了下有些问题。 redis中存储的是json格式数据, 数据库是3,通过cache.get方法报空指针,就是刚才说的错。但是用getcounter()能获取到数据,只不过不是数字类型报NumberFormatException ,可能哪里出的问题呢?

super超

2017-01-04 11:36

@JFinal 试了一下,需要cache.getpool.get()才能获取到数据

super超

2017-01-04 11:37

@JFinal 说错了,是getjedis

JFinal

2017-01-04 11:38

对 Jedis 有些了解是最好的,因为 jfinal 的 redis plugin 是对 Jedis 这个工具的二次封装,可以通过 cache.getJedis() 直接获取到 Jedis 对象,这样就能直接绕过 jfinal 去使用更加底层的 Jedis 了

JFinal

2017-01-04 11:39

自行获取 Jedis 对象,注意一下资源的回收问题,可以看看 Cache 类里面是如何回收 jedis 对象资源的,照此办理就好

super超

2017-01-04 11:40

@JFinal 是的,但这样一来就跳过插件了呀,每次用完都要手动关闭连接池,出的错很让人郁闷

JFinal

2017-01-04 11:42

@super超 可以对 RedisPlugin 做些自行扩展,都是开源的东西,扩展起来很方便

sdfsf

2017-01-04 16:07

@JFinal JFinal中duang有什么用 不理解

热门反馈

扫码入社