接口使用了緩存,想看看緩存命中率,到底提高了多少了?固想到作個統計方法,單機狀況下使用 AtomicImteger,考慮到分佈式集羣中多臺服務器調用,因此考慮使用redis進行統計 原來的想法很簡單用分佈式鎖 控制每次只有一個線程進行操做,可是須要進行獲取數據 數據+1 再進行數據放入 三步過程 沒有獲取到鎖的線程 進行等待後重試獲取鎖 可是此種狀況會出現某些線程餓死,爲了防止線程餓死又要作成 重試次數限制 超過次數就放棄統計 這種統計出來會使的大致趨勢是正確的,數字會有誤差.機制須要考慮 ,就一個統計方法不想廢太多腦細胞,因此pass此方案 看到redis本身有RedisAtomicLong 這個因此考慮使用這個去作.redis
直接甩代碼緩存
/** * * @Title: incrementAndGet * @Description: 計數+1 * @param @param redisTemplate * @param @param key 設定文件 * @return void 返回類型 * @throws */ private static void incrementAndGet (String key) { ExecutorService es = Executors.newFixedThreadPool(1); try { es.execute(new Runnable() { @SuppressWarnings("unchecked") @Override public void run() { boolean flag = false; RedisTemplate<Serializable, Serializable> redisTemplate =(RedisTemplate<Serializable, Serializable>) ApplicationContextHolder.getBean("redisTemplate"); //判斷存在key if(!CacheUtil.getCache().exists(key)){ flag = true; } RedisAtomicLong counter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory()); //不存在設置過時時間 if(flag){ counter.expire(DataConstants.GOOD_TTL, TimeUnit.SECONDS); } counter.incrementAndGet(); } }); } finally { es.shutdown(); } } /** * * @Title: countAll * @Description: 獲取計數 * @param @param redisTemplate * @param @return 設定文件 * @return long 返回類型 * @throws */ @SuppressWarnings("unchecked") private static String countAll(String key) { RedisTemplate<Serializable, Serializable> redisTemplate = (RedisTemplate<Serializable, Serializable>) ApplicationContextHolder.getBean("redisTemplate"); RedisAtomicLong counter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory()); return String.valueOf(counter.get()); }
本人的邏輯是隻統計一天因此設置超時時間爲24小時,key也加了日期區分服務器
具體使用用法能夠百度RedisAtomicLong ,本文只是淺顯的使用,如有不正確地方,但願你們不吝賜教.分佈式