1. 程式人生 > >微信企業號會議助手---redis的應用

微信企業號會議助手---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的原理啊,優點啊。我雖然看過,也清楚一些,但感覺講的不夠專業就不講了,免得誤導各位。

一起加油!!!

有什麼不足之處,或者錯誤的歡迎指點,本人每天保持工作日早上更新。