在Nutz項目中須要用到Redis,其實網上已經有不少例子的了,特別是Wendal官方cookbook還有示例,但這畢竟不想操做數據庫那麼通用,已經有成熟的Dao系列包可用,對應Redis豐富的數據結構,和各類應用場景,仍是須要本身作一些封裝的,這裏小結一下項目中的用法。html
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.0</version> </dependency>
使用maven導入的,也能夠直接下載Jar包java
鏈接池是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); } }