沒錯,還是上篇文章提到的那個SpringMVC+Mybatis的項目,在客戶調我方接口,瘋狂的給我們insert數據的時候,應該想到一些優化方案,於是Redis就被引用了。
關於Redis的客戶端,服務端的一些用法引用了這篇微博http://blog.csdn.net/joyhen/article/details/47358999,這里我就不搬磚了,這個微博寫的也算中規中矩,如果你不笨的話完全是可以搞定的。
我詳細來講一下程序里的調用好了。
這是一個Maven項目,於是在pom.xml里增加一下dependency,Spring.xml的配置就不上圖了
1 <dependency> 2 <groupId>org.redisson</groupId> 3 <artifactId>redisson</artifactId> 4 <version>1.0.2</version> 5 </dependency>
這樣,我們的redisson的jar包就有了,然后進行簡單的調用,封裝一個固定的方法,便於后期的維護。然后調用Redis時候只需 Redisson redisson =RedisConnect.connect();就可以
1 public static final String CONF_RESOURCE = "resource"; 2 public static final String redis_address = Resources.instance(CONF_RESOURCE).getAttributeValue("redis_address");//redis服務IP 3 public static final String redis_password = Resources.instance(CONF_RESOURCE).getAttributeValue("redis_password");//redis密碼 4 5 6 public static final Redisson connect(){ 7 Config config = new Config(); 8 config.setConnectionPoolSize(10); 9 config.addAddress(redis_address); 10 config.setPassword(redis_password); 11 Redisson redisson = Redisson.create(config); 12 13 return redisson; 14 }
個人的一個膚淺的看法(勿噴,剛接觸Redis,還沒有高級點兒的理解):Redis就是一個放在內存或者說是緩存上的一個Map,通過<key,Value>來維護。於是就有了下面的寫法:當controler傳過來一個對象的時候,可以將對象的未來的主鍵作為Key,然后將對象轉換成JSON放到Value中,期間我試過將對象作為Value放到map里,但是在我本地的windows系統下自己搭建的Redis服務器測試是沒問題的,但是放到公司的Linux服務器上,如果在定時器處理時,如果沒有插入到表里,map會無理由的將這條記錄移出去,如果有同仁知道原因希望跟我聯系。所以我選擇了json格式,這樣在服務器上是沒有問題的。
1 public void redisAdd(Order order) { 2 3 Redisson redisson =RedisConnect.connect(); 4 5 ConcurrentMap<String,Object> newMap = redisson.getMap("newMap"); 6 order.setPushCount(0); 7 String params = FastJsonUtil.toJSONString(order); 8 newMap.put(order.getOrderNo(), params); 9 // 關閉連接 10 redisson.shutdown(); 11 }
然后看一下取數據的代碼:
1 Redisson redisson = RedisConnect.connect(); 2 3 ConcurrentMap<String,Object> newMap = redisson.getMap("newMap"); 4 Set<String> mapKey= newMap.keySet(); 5 for(String orderNo : mapKey){ 6 params = (String)newMap.get(orderNo); 7 order = JSONObject.parseObject(params, Order.class); 8 orderService.add(order); 9 newMap.remove(orderNo);//保存成功后將該條記錄從map中刪除 10 } 11 redisson.shutdown();//關閉redis
這樣就可以通過定時器來定時出發這個方法,減少數據庫連接池的壓力,同時也提高效率。至於定時器,我想如果有空的話我寫一個定時器的專欄,然后自己也試試不同的方法來實現
