NutzCN Logo
问答 关于redis的问题
发布于 2644天前 作者 文涛(wentao) 2015 次浏览 复制 上一个帖子 下一个帖子
标签:

项目配置好jedis.js和redis.properties文件,注入和访问都没有问题,但是如果项目需要访问多个redis应该如何配置呢,我注入的是redisService,但是我发现jedis.js配置文件中redisService只是一个类的实例化,并没有办法区分它是跟哪个jedis对象捆绑在一起的,所以不知道如何扩展

jedis.js的配置

var ioc = {
    // 参考 https://github.com/xetorthio/jedis/wiki/Getting-started
    jedisPoolConfig : {
        type : "redis.clients.jedis.JedisPoolConfig",
        fields : {
            testWhileIdle : true, // 空闲时测试,免得redis连接空闲时间长了断线
            maxTotal : {java : "$conf.getInt('redis.maxTotal', 100)"} // 一般都够了吧
        }
    },
    jedisPool : {
        type : "redis.clients.jedis.JedisPool",
        args : [
            {refer : "jedisPoolConfig"},
            // 从配置文件中读取redis服务器信息
            {java : "$conf.get('redis.host', 'localhost')"},
            {java : "$conf.getInt('redis.port', 6379)"},
            {java : "$conf.getInt('redis.timeout', 2000)"},
            {java : "$conf.get('redis.password')"},
            {java : "$conf.getInt('redis.database', 0)"}
        ],
        fields : {},
        events : {
            depose : "destroy" // 关闭应用时必须关掉呢
        }
    },
    redis : {
        type : "org.nutz.integration.jedis.RedisInterceptor",
        fields : {
            jedisPool : {refer:"jedisPool"}
        }
    },
    redisService : {
        type : "org.nutz.integration.jedis.RedisService"
    },
    pubSubService : {
        type : "org.nutz.integration.jedis.pubsub.PubSubService",
        fields : {
            jedisPool : {refer:"jedisPool"}
        },
        events : {
            depose : "depose"
        }
    }
};
10 回复

你要访问多个redis服务器?

是的,要访问3个redis服务器,都是不同的业务,如果算上主从,有6个

估计得自己封装多个jedis对象,再使用Ioc注入了

有个不太合适的办法。。。 建3个ioc容器。。。

想了想,多个ioc容器也不行。。。

嗯,估计会有冲突,且不能随便使用,估计还是要重写redis插件,我先尝试下,如果可以希望可以做点贡献代码给Nutz,呵呵,谢谢

简单的做了一下
配置文件:

var ioc = {
    // 参考 https://github.com/xetorthio/jedis/wiki/Getting-started
    jedisPoolConfig : {
        type : "redis.clients.jedis.JedisPoolConfig",
        fields : {
            testWhileIdle : true, // 空闲时测试,免得redis连接空闲时间长了断线
            maxTotal : {java : "$conf.getInt('redis.maxTotal', 100)"} // 一般都够了吧
        }
    },
    jedisPool_xw : {
        type : "redis.clients.jedis.JedisPool",
        args : [
            {refer : "jedisPoolConfig"},
            // 从配置文件中读取redis服务器信息
            {java : "$conf.get('redis_xw.host', 'localhost')"},
            {java : "$conf.getInt('redis_xw.port', 6379)"},
            {java : "$conf.getInt('redis_xw.timeout', 2000)"},
            {java : "$conf.get('redis_xw.password')"},
            {java : "$conf.getInt('redis_xw.database', 0)"}
        ],
        fields : {},
        events : {
            depose : "destroy" // 关闭应用时必须关掉呢
        }
    },
    jedisPool_yfb : {
        type : "redis.clients.jedis.JedisPool",
        args : [
            {refer : "jedisPoolConfig"},
            // 从配置文件中读取redis服务器信息
            {java : "$conf.get('redis_yfb.host', 'localhost')"},
            {java : "$conf.getInt('redis_yfb.port', 6379)"},
            {java : "$conf.getInt('redis_yfb.timeout', 2000)"},
            {java : "$conf.get('redis_yfb.password')"},
            {java : "$conf.getInt('redis_yfb.database', 0)"}
        ],
        fields : {},
        events : {
            depose : "destroy" // 关闭应用时必须关掉呢
        }
    },
    redis_xw: {
        type: 'demo.hello.Redis',
        args: [{refer:'jedisPool_xw'}]
    }, redis_yfb:{
        type: 'demo.hello.Redis',
        args: [{refer:'jedisPool_yfb'}]
    }
};```

redis 类

@IocBean
public class Redis {
private JedisPool pool = null;

public JedisPool getPool() {
    return this.pool;
}


public Redis(JedisPool pool) {
    this.pool = pool;
}

}

调用代码:

@Inject(value = "redis_xw") protected demo.hello.Redis redis_xw;
@Inject(value = "redis_yfb") protected demo.hello.Redis redis_yfb;

@Test
public void x_test() {
Jedis redis = redis_xw.getPool().getResource();
System.out.println(redis.hashCode());
redis_xw.getPool().returnResource(redis);

    redis = redis_yfb.getPool().getResource();
    System.out.println(redis.hashCode());
    redis_yfb.getPool().returnResource(redis);

    redis = redis_xw.getPool().getResource();
    System.out.println(redis.hashCode());
    redis_xw.getPool().returnResource(redis);

    redis = redis_yfb.getPool().getResource();
    System.out.println(redis.hashCode());
    redis_yfb.getPool().returnResource(redis);

    redis = redis_xw.getPool().getResource();
    System.out.println(redis.hashCode());
    redis_xw.getPool().returnResource(redis);

    redis = redis_yfb.getPool().getResource();
    System.out.println(redis.hashCode());
    redis_yfb.getPool().returnResource(redis);
}

```
简单的实现了注入不同的redis池,只是需要自己获取连接和归还连接,不知道是不是需要AOP拦截实现

自定义的类, 用@IocBean和@Inject就好了,不需要配在js里面

我是用了js帮我读取参数后实例化对象

添加回复
请先登陆
回到顶部