Nutz集成Redis小結

在Nutz項目中須要用到Redis,其實網上已經有不少例子的了,特別是Wendal官方cookbook還有示例,但這畢竟不想操做數據庫那麼通用,已經有成熟的Dao系列包可用,對應Redis豐富的數據結構,和各類應用場景,仍是須要本身作一些封裝的,這裏小結一下項目中的用法。html

  • 首先,Java客戶端確定要用Jedis,項目中引用了2.8版的包
    <dependency>
    	<groupId>redis.clients</groupId>
    	<artifactId>jedis</artifactId>
    	<version>2.8.0</version>
    </dependency>

    使用maven導入的,也能夠直接下載Jarjava

  • 鏈接池是Jedis包內置的,池對象做爲一個單例存在,固然能夠直接new,保存在static變量裏,但若是能夠注入就更方便了,因此作了一個IoC配置文件:
     redis

    {
    	jedis_pool_config : {
    		type : "redis.clients.jedis.JedisPoolConfig",
    		fields : {
    			maxTotal : 10,
    			maxIdle : 5,
    			maxWaitMillis : 30000,
    			testOnBorrow : true
    		}
    	},
    	jedis_config:{
    		type: "com.nuanxinli.lib.cache.JedisConfig",
    		fields:{
    			poolConfig:{
    				refer : "jedis_pool_config"
    			},
    			port: 6379,
    			host: "192.168.1.53",
    			timeout: 30000,
    			password:123456
    		}
    	},
    	system_jedis_pooler : {
    		type : "com.nuanxinli.lib.cache.JedisPooler",
    		args : [ {
    			refer : "jedis_config"
    		}]
    	}
    }

    注意,JedisPool的API設計,是比較奇怪的,JedisPoolConfig是個配置實體類,裏面卻不包含host,port這些信息,要想設置IP和端口,只能在構造函數裏傳參,因此這裏又定義了一個JedisConfig類,把須要的其餘配置信息補充進去:
     數據庫

    @IocBean
    public class JedisConfig {
    	public JedisPoolConfig poolConfig;
    	public String host;
    	public Integer port;
    	public String password;
    	public Integer timeout;
    }

    新建一個JedisPooler類,做爲Pool單例的載體,本打算封裝一個相似於Dao的類,後來發現Jedis由於有各類數據結構,方法太多,沒法一一封裝,仍是僅僅作了一個載體類
     json

    package com.nuanxinli.lib.cache;
    
    import org.nutz.ioc.loader.annotation.IocBean;
    import org.nutz.json.Json;
    import org.nutz.log.Log;
    import org.nutz.log.Logs;
    
    import com.nuanxinli.util.StrUtil;
    
    import redis.clients.jedis.JedisPool;
    
    @IocBean(create = "getPool", depose = "onDepose")
    public class JedisPooler {
    	private static final Log log = Logs.getLog(JedisPooler.class);
    	private JedisPool pool;
    	JedisConfig config;
    
    	public JedisPooler(JedisConfig config) {
    		this.config = config;
    	}
    
    	public synchronized JedisPool getPool() {
    		log.debug("JedisPooler onCreate getPool...");
    		if (pool == null) {
    			log.debug("即將鏈接redis:\r\n"+Json.toJson(config));
    			if (StrUtil.isNotNullOrBlank(config.password)) {
    				pool = new JedisPool(config.poolConfig, config.host, config.port, config.timeout, config.password);
    			} else {
    				pool = new JedisPool(config.poolConfig, config.host, config.port, config.timeout);
    			}
    		}
    		return pool;
    	}
    
    	public void onDepose() {
    		pool.destroy();
    	}
    }

     

  • 這樣一個具體的業務類,在使用緩存時,注入JedisPooler對象就能夠了,例如
     緩存

    @Inject("refer:system_jedis_pooler")
    	private JedisPooler jedisPooler;
    
    	public Double add(String username, String providerName, double point) {
    		try (Jedis jedis = jedisPooler.getPool().getResource()) {
    			return jedis.zincrby(KEY_PREFIX+":" + providerName, point, username);
    		}
    	}
相關文章
相關標籤/搜索