微信企業號會議助手---redis的應用
前面已經搭建好了大概的專案結構,現在開始寫一些必要的工具類,今天先講講我所用到的redis應用。redis在一些專案中有很多種應用方式,我今天就講講spring的StringRedisTemplate。在這個專案中redis用到的功能就是快取下微信的一些資訊。所以可以看做是當map集合來用差不多。
下面就開始介紹下StringRedisTemplate的API:
stringRedisTemplate.opsForValue().set("test", "100",60*10,TimeUnit.SECONDS);//向redis裡存入資料和設定快取時間
stringRedisTemplate.boundValueOps ("test").increment(-1);//val做-1操作
stringRedisTemplate.opsForValue().get("test")//根據key獲取快取中的val
stringRedisTemplate.boundValueOps("test").increment(1);//val +1
stringRedisTemplate.getExpire("test")//根據key獲取過期時間
stringRedisTemplate.getExpire("test",TimeUnit.SECONDS)//根據key獲取過期時間並換算成指定單位
stringRedisTemplate.delete ("test");//根據key刪除快取
stringRedisTemplate.hasKey("546545");//檢查key是否存在,返回boolean值
stringRedisTemplate.opsForSet().add("red_123", "1","2","3");//向指定key中存放set集合
stringRedisTemplate.expire("red_123",1000 , TimeUnit.MILLISECONDS);//設定過期時間
stringRedisTemplate.opsForSet().isMember("red_123", "1")//根據key檢視集合中是否存在指定資料
stringRedisTemplate.opsForSet ().members("red_123");//根據key獲取set集合
再講下spring的redis配置:
<!-- redis配置 -->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxTotal" value="${redis.maxTotal}" />
<property name="maxWaitMillis" value="${redis.maxWait}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.host}" />
<property name="port" value="${redis.port}" />
<!-- <property name="password" value="${redis.pass}" /> -->
<property name="poolConfig" ref="poolConfig" />
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="enableTransactionSupport" value="false"/>
<property name="connectionFactory" ref="connectionFactory" />
</bean>
<bean id="redisUtil" class="com.supcon.mo.util.RedisUtil">
<property name="redisTemplate" ref="redisTemplate" />
</bean>
這個在上一章搭建後端架構的時候就講過,這裡再宣告一下,org.springframework.data.redis.core.StringRedisTemplate是spring的自帶的redis模板。
bean id=”redisUtil”將這個模板傳入com.supcon.mo.util.RedisUtil這個類。不過這些都要在spring啟動的時候才能用。
下面來講一個工具類的方法案例:
public static RedisTemplate<String, Object> redisTemplate;
public static void setStringByTime(String key,Object obj, Long timeout, TimeUnit unit) {
if (obj == null) {
return;
}
if (timeout != null) {
redisTemplate.opsForValue().set(key, obj, timeout, unit);
} else {
redisTemplate.opsForValue().set(key, obj);
}
}
public RedisTemplate<String, Object> getRedisTemplate() {
return redisTemplate;
}
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
這裡注意一下,很多人都會犯的一個小錯誤,IOC物件注入元素的時候必須要在bean中寫set,get方法。
我這裡寫的是一個存入redis的鍵值對,設定一定時間的有效期。
timeout寫數字,unit寫單位。如TimeUnit.SECONDS代表秒。
當然這樣是無法寫main方法測試的,需要用junit來測試。首先要匯入
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-servlet-config.xml"})
這兩個註釋,能夠呼叫的IOC容器。
然後在寫的方法前加@test來測試,如:
@test
public void say(){
....一大堆測試程式碼,當main方法來寫。
}
因為這個工具類在spring的配置檔案中註冊了,所以再其他類中呼叫的時候只要採用@Autowired標籤注入就好了。
當然這裡還有一個疑問,如果是要在其他靜態工具類中引用怎麼辦?
下面我講下解決辦法:
方法一:
@Autowired<br>//注意這裡非靜態
private RedisUtil redisUtil;
private static LogUtil logUtil;
@PostConstruct //@PostConstruct修飾的方法會在伺服器載入Servle的時候執行,並且只會被伺服器執行一次。PostConstruct在建構函式之後執行,init()方法之前執行
public void init() {
logUtil = this;
logUtil.redisUtil = this.redisUtil;
}
public AdminLogService getUserService() {
return logService;
}
public void setUserService(rRdisUtil redisUtil) {
this.redisUtil= redisUtil;
}
下面呼叫的時候直接用logUtil.redisUtil.方法來呼叫。
方法二:
去掉redisTemplate的注入。直接匯入靜態模板。
public static RedisTemplate<String, Object> redisTemplate;
綜上都是個人專案對redis的應用,沒有研究太深。比如一些redis的原理啊,優點啊。我雖然看過,也清楚一些,但感覺講的不夠專業就不講了,免得誤導各位。
一起加油!!!
有什麼不足之處,或者錯誤的歡迎指點,本人每天保持工作日早上更新。