程序對批量數據寫入數據庫的優化--引入Redis並通過定時器來觸發


沒錯,還是上篇文章提到的那個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

這樣就可以通過定時器來定時出發這個方法,減少數據庫連接池的壓力,同時也提高效率。至於定時器,我想如果有空的話我寫一個定時器的專欄,然后自己也試試不同的方法來實現

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM