精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

張開濤:京東業務數據應用級緩存示例

開發 開發工具
我們的業務數據如商品類目、店鋪、商品基本信息都可以進行適當的本地緩存,以提升性能。對于多實例的情況時不僅會使用本地緩存,還會使用分布式緩存,因此需要進行適當的API封裝以簡化緩存操作。

一、多級緩存API封裝

我們的業務數據如商品類目、店鋪、商品基本信息都可以進行適當的本地緩存,以提升性能。對于多實例的情況時不僅會使用本地緩存,還會使用分布式緩存,因此需要進行適當的API封裝以簡化緩存操作。

[[189271]]

1. 本地緩存初始化

  1. public class LocalCacheInitService extends BaseService { 
  2.    @Override 
  3.     publicvoid afterPropertiesSet() throws Exception { 
  4.         //商品類目緩存 
  5.         Cache<String, Object> categoryCache = 
  6.                CacheBuilder.newBuilder() 
  7.                         .softValues() 
  8.                         .maximumSize(1000000) 
  9.                        .expireAfterWrite(Switches.CATEGORY.getExpiresInSeconds()/ 2, TimeUnit.SECONDS) 
  10.                         .build(); 
  11.        addCache(CacheKeys.CATEGORY_KEY, categoryCache); 
  12.     } 
  13.   
  14.     privatevoid addCache(String key, Cache<??> cache) { 
  15.         localCacheService.addCache(key,cache); 
  16.     } 

本地緩存過期時間使用分布式緩存過期時間的一半,防止本地緩存數據緩存時間太長造成多實例間的數據不一致。

另外,將緩存KEY前綴與本地緩存關聯,從而匹配緩存KEY前綴就可以找到相關聯的本地緩存。

2. 寫緩存API封裝

先寫本地緩存,如果需要寫分布式緩存,則通過異步更新分布式緩存。

  1. public void set(final String key, final Object value, final intremoteCacheExpiresInSeconds) throws RuntimeException { 
  2.     if (value== null) { 
  3.         return; 
  4.     } 
  5.   
  6.     //復制值對象 
  7.     //本地緩存是引用,分布式緩存需要序列化 
  8.     //如果不復制的話,則假設之后數據改了將造成本地緩存與分布式緩存不一致 
  9.     final Object finalValue = copy(value); 
  10.     //如果配置了寫本地緩存,則根據KEY獲得相關的本地緩存,然后寫入 
  11.     if (writeLocalCache) { 
  12.        Cache localCache = getLocalCache(key); 
  13.         if(localCache != null) { 
  14.            localCache.put(key, finalValue); 
  15.         } 
  16.     } 
  17.     //如果配置了不寫分布式緩存,則直接返回 
  18.     if (!writeRemoteCache) { 
  19.         return; 
  20.     } 
  21.     //異步更新分布式緩存 
  22.     asyncTaskExecutor.execute(() -> { 
  23.         try { 
  24.             redisCache.set(key,JSONUtils.toJSON(finalValue), remoteCacheExpiresInSeconds); 
  25.         } catch(Exception e) { 
  26.             LOG.error("updateredis cache error, key : {}", key, e); 
  27.         } 
  28.     }); 

此處使用了異步更新,目的是讓用戶請求盡快返回。而因為有本地緩存,所以即使分布式緩存更新比較慢又產生了回源,也可以在本地緩存***。

3. 讀緩存API封裝

先讀本地緩存,本地緩存不***的再批量查詢分布式緩存,在查詢分布式緩存時通過分區批量查詢。

  1. private Map innerMget(List<String> keys, List<Class> types) throwsException { 
  2.    Map<String, Object> result = Maps.newHashMap(); 
  3.    List<String> missKeys = Lists.newArrayList(); 
  4.    List<Class> missTypes = Lists.newArrayList(); 
  5.     //如果配置了讀本地緩存,則先讀本地緩存 
  6.     if(readLocalCache) { 
  7.         for(int i = 0; i < keys.size(); i++) { 
  8.            String key = keys.get(i); 
  9.            Class type = types.get(i); 
  10.            Cache localCache = getLocalCache(key); 
  11.             if(localCache != null) { 
  12.                Object value = localCache.getIfPresent(key); 
  13.                result.put(key, value); 
  14.                if (value == null) { 
  15.                    missKeys.add(key); 
  16.                     missTypes.add(type); 
  17.                } 
  18.            } else { 
  19.                missKeys.add(key); 
  20.                missTypes.add(type); 
  21.            } 
  22.         } 
  23.     } 
  24.     //如果配置了不讀分布式緩存,則返回 
  25.     if(!readRemoteCache) { 
  26.         returnresult; 
  27.     } 
  28.     finalMap<String, String> missResult = Maps.newHashMap(); 
  29.   
  30.     //對KEY分區,不要一次性批量調用太大 
  31.     final List<List<String>>keysPage = Lists.partition(missKeys, 10); 
  32.    List<Future<Map<String, String>>> pageFutures = Lists.newArrayList(); 
  33.   
  34.     try { 
  35.         //批量獲取分布式緩存數據 
  36.         for(final List<String>partitionKeys : keysPage) { 
  37.            pageFutures.add(asyncTaskExecutor.submit(() -> redisCache.mget(partitionKeys))); 
  38.         } 
  39.         for(Future<Map<String,String>> future : pageFutures) { 
  40.            missResult.putAll(future.get(3000, TimeUnit.MILLISECONDS)); 
  41.         } 
  42.     } catch(Exception e) { 
  43.        pageFutures.forEach(future -> future.cancel(true)); 
  44.         throw e; 
  45.     } 
  46.     //合并result和missResult,此處實現省略 
  47.     return result; 

此處將批量讀緩存進行了分區,防止亂用批量獲取API。

二、NULL Cache

首先,定義NULL對象。

  1. private static final String NULL_STRING =new String(); 

當DB沒有數據時,寫入NULL對象到緩存

  1. //查詢DB 
  2. String value = loadDB(); 
  3. //如果DB沒有數據,則將其封裝為NULL_STRING并放入緩存 
  4. if(value == null) { 
  5.     value = NULL_STRING
  6. myCache.put(id, value); 

讀取數據時,如果發現NULL對象,則返回null,而不是回源到DB

  1. value = suitCache.getIfPresent(id); 
  2. //DB沒有數據,返回null 
  3. if(value == NULL_STRING) { 
  4.     return null; 

通過這種方式可以防止當KEY對應的數據在DB不存在時頻繁查詢DB的情況。

三、強制獲取***數據

在實際應用中,我們經常需要強制更新數據,此時就不能使用緩存數據了,可以通過配置ThreadLocal開關來決定是否強制刷新緩存(refresh方法要配合CacheLoader一起使用)。

  1. if(ForceUpdater.isForceUpdateMyInfo()) { 
  2.     myCache.refresh(skuId); 
  3. String result = myCache.get(skuId); 
  4. if(result == NULL_STRING) { 
  5.     return null; 

四、失敗統計

  1. private LoadingCache<String, AtomicInteger> failedCache = 
  2.        CacheBuilder.newBuilder() 
  3.                .softValues() 
  4.                .maximumSize(10000) 
  5.                .build(new CacheLoader<String, AtomicInteger>() { 
  6.                    @Override 
  7.                     public AtomicIntegerload(String skuId) throws Exception { 
  8.                         return new AtomicInteger(0); 
  9.                    } 
  10.                }); 

當失敗時,通過failedCache.getUnchecked(id).incrementAndGet()增加失敗次數;當成功時,使用failedCache.invalidate(id)失效緩存。通過這種方式可以控制失敗重試次數,而且又是內存敏感緩存。當內存不足時,可以清理該緩存騰出一些空間。

五、延遲報警

  1. private static LoadingCache<String, Integer> alarmCache = 
  2.        CacheBuilder.newBuilder() 
  3.                 .softValues() 
  4.                .maximumSize(10000).expireAfterAccess(1, TimeUnit.HOURS) 
  5.                .build(new CacheLoader<String, Integer>() { 
  6.                    @Override 
  7.                    public Integer load(String key) throws Exception { 
  8.                         return 0; 
  9.                    } 
  10.                }); 
  11.   
  12. //報警代碼 
  13. Integer count = 0
  14. if(redis != null) { 
  15.     StringcountStr = Objects.firstNonNull(redis.opsForValue().get(key), "0"); 
  16.     count =Integer.valueOf(countStr); 
  17. } else { 
  18.     count = alarmCache.get(key); 
  19. if(count % 5 == 0) { //5次報一次 
  20.     //報警 
  21. countcount = count + 1; 
  22. if(redis != null) { 
  23.     redis.opsForValue().set(key,String.valueOf(count), 1, TimeUnit. HOURS); 
  24. } else { 
  25.     alarmCache.put(key,count); 

如果一出問題就報警,則存在報警量非常多或者假報警,因此,可以考慮N久報警了M次,才真正報警。此時,也可以使用Cache來統計。本示例還加入了Redis分布式緩存記錄支持。

六、性能測試

筆者使用JMH 1.14進行基準性能測試,比如測試寫。

  1. @Benchmark 
  2. @Warmup(iterations = 10time = 10timeUnit =TimeUnit.SECONDS) 
  3. @Measurement(iterations = 10time = 10timeUnitTimeUnit.SECONDS) 
  4. @BenchmarkMode(Mode.Throughput) 
  5. @OutputTimeUnit(TimeUnit.SECONDS) 
  6. @Fork(1) 
  7. public void test_1_Write() { 
  8.     counterWritercounterWriter= counterWriter + 1; 
  9.     myCache.put("key"+ counterWriter, "value" + counterWriter); 

使用JMH時首先進行JVM預熱,然后進行度量,產生測試結果(本文使用吞吐量)。建議讀者按照需求進行基準性能測試來選擇適合自己的緩存框架。

【本文是51CTO專欄作者張開濤的原創文章,作者微信公眾號:開濤的博客( kaitao-1234567)】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2017-05-01 17:03:01

Java緩存分布式

2017-05-05 10:13:03

應用級緩存緩存代碼

2017-05-10 11:40:29

緩存Nginx HTTP

2017-05-18 16:07:23

回滾數據庫代碼

2017-04-18 14:49:38

應用層API代碼

2017-07-02 16:50:21

2017-06-04 16:24:27

線程線程池中斷

2017-06-16 15:16:15

2012-12-13 17:38:48

2012年度IT博客大IT博客大賽博客

2016-01-04 15:16:01

京東詳情頁實踐

2016-06-17 14:19:52

數據中心

2022-05-12 14:34:14

京東數據

2010-06-02 17:46:54

MySQL 查詢緩存

2015-07-24 12:38:00

吳靜濤

2010-10-19 08:59:40

PHP緩存技術

2016-11-10 14:38:44

京東深度學習

2024-11-01 10:37:31

2009-08-13 17:50:49

Hibernate 3

2018-01-18 19:11:36

點贊
收藏

51CTO技術棧公眾號

日韩亚洲欧美中文高清在线| 色一情一伦一子一伦一区| 91影院在线免费观看视频| 久久亚洲AV无码| 欧美激情99| 欧美亚洲一区三区| 人人妻人人澡人人爽欧美一区| 五月婷婷久久久| 久久99精品国产.久久久久久 | 99久久久无码国产精品衣服| 激情不卡一区二区三区视频在线| 婷婷成人综合网| 亚洲国产日韩综合一区| 国产 日韩 欧美 综合| 午夜一级久久| 久久久久久美女| 天天操天天摸天天舔| 日韩精品福利一区二区三区| 7777女厕盗摄久久久| 日韩成人三级视频| 日本中文字幕视频在线| www.日韩精品| 亚洲自拍中文字幕| 伊人22222| 免费精品视频| 国语自产精品视频在线看一大j8| 色撸撸在线视频| 国产免费久久| 亚洲精品美女久久| 911亚洲精选| 激情综合五月| 欧美三级在线播放| av免费在线播放网站| caoprom在线| 国产精品区一区二区三区| 欧美xxxx黑人又粗又长密月| wwwxxxx国产| 激情欧美日韩一区二区| 国产精品女人久久久久久| 日韩一区二区视频在线| 亚洲大片在线| 欧美激情一二区| 久久久久免费看| 欧美三区视频| 欧美激情视频三区| 欧美人妻精品一区二区免费看| 四虎成人av| 日韩中文理论片| 欧美另类69xxxx| 日本大胆欧美| 最新中文字幕亚洲| 特级西西人体高清大胆| 日本不卡免费一区| 北条麻妃一区二区三区中文字幕| 2019男人天堂| 成人一级毛片| 日韩小视频在线| 99久久婷婷国产综合| 雨宫琴音一区二区三区| 欧美成人网在线| 免费一级片在线观看| 欧美午夜不卡| 午夜精品在线视频| 天天干在线播放| 久久久精品网| 国产女人18毛片水18精品| 国产一区二区三区黄片| 国内精品久久久久影院色| 亚洲精品日产aⅴ| 午夜精品久久久久久久爽 | 久久99国产精品99久久| 午夜影院免费视频| www国产亚洲精品久久麻豆| 麻豆av一区| 成人性生交大片免费看午夜 | 一区二区三区我不卡| 成人无遮挡免费网站视频在线观看| 亚洲精品乱码久久久久| 欧美日韩一道本| 亚洲综合在线电影| 91麻豆精品国产无毒不卡在线观看 | 一起操在线播放| 国内自拍视频一区二区三区| 午夜精品久久久久久久久久久久久| 日本中文字幕第一页| 看片的网站亚洲| 波多野结衣一区二区三区在线观看| 国产成人自拍一区| 国产人伦精品一区二区| 奇米777四色影视在线看| 欧美办公室脚交xxxx| 欧美蜜桃一区二区三区| 亚洲成人福利视频| 精品国产91乱码一区二区三区四区 | 男人影院在线观看| 一区二区免费看| 久草精品在线播放| 日韩激情精品| 亚洲偷熟乱区亚洲香蕉av| 五月天婷婷色综合| 久久精品三级| av激情久久| av资源网在线观看| 亚洲成a人v欧美综合天堂| 无需播放器的av| 久久国产精品免费精品3p| 色噜噜久久综合伊人一本| 91蜜桃视频在线观看| 国产自产2019最新不卡| 美日韩免费视频| 少妇视频在线| 欧美日韩国产高清一区二区| 亚洲中文字幕无码av| 91成人精品| 国产精品爽爽爽爽爽爽在线观看| 天天av天天翘| 亚洲一区在线观看网站| 国产九九在线观看| 国产毛片一区二区三区| 91超碰中文字幕久久精品| 99热这里只有精品在线| 国产精品沙发午睡系列990531| 免费观看国产精品视频| 亚洲午夜精品| 久久夜色精品国产亚洲aⅴ| 五月婷婷丁香在线| 91一区二区在线观看| 国产情侣第一页| 91麻豆精品| 色爱av美腿丝袜综合粉嫩av| 中文字幕在线欧美| 久久中文字幕电影| 国产午夜大地久久| 国内视频在线精品| 久久久久国产精品免费| 亚洲产国偷v产偷v自拍涩爱| 日韩理论在线观看| 在线观看日本一区二区| 波多野结衣在线观看一区二区 | 国产精品成人**免费视频| 伊人伊人伊人久久| 日本妇乱大交xxxxx| 久久精品人人做| 国内自拍视频一区| 欧美偷拍综合| 国产精品人人做人人爽| 91视频在线观看| 欧美吻胸吃奶大尺度电影| 色综合99久久久无码国产精品| 免费日韩av片| 视频一区亚洲| 日本免费成人| 久久久国产视频91| 国产成人毛毛毛片| 亚洲成人资源在线| 中文字幕 亚洲一区| 鲁大师成人一区二区三区| 秋霞久久久久久一区二区| 国产成人精品一区二三区在线观看 | 国产三级在线观看完整版| 老司机午夜精品| 中文字幕中文字幕在线中心一区| 精品国产伦一区二区三区观看说明 | 91精品国产黑色紧身裤美女| 国产少妇在线观看| 波多野洁衣一区| 四虎永久在线精品无码视频| 日本一区二区高清不卡| 91久久精品美女高潮| free性欧美| 国产一区二区三区18| 国产片在线播放| 亚洲第一狼人社区| 三上悠亚ssⅰn939无码播放| 免费久久精品视频| 蜜桃视频一区二区在线观看| 一区三区在线欧| 成人在线观看视频网站| hd国产人妖ts另类视频| 伊人久久久久久久久久久| 99这里有精品视频| 狠狠做深爱婷婷久久综合一区| 中文字幕欧美激情极品| 国产成人av电影在线| 粉嫩虎白女毛片人体| 亚洲综合激情在线| 美国av一区二区三区| 国产精品免费精品自在线观看| 国内精品400部情侣激情| 成人在线免费电影| 欧美zozo另类异族| 性色av一区二区三区四区| 亚洲精品国产一区二区精华液 | 欧美中文字幕久久| 欧美成人精品一区二区免费看片| 2024国产精品| 午夜诱惑痒痒网| 久久午夜视频| 精品人妻大屁股白浆无码| 日韩av有码| 久久久久久久久久码影片| 国产精品久久久久久av公交车| 热久久免费视频精品| www久久日com| 影音先锋日韩有码| 亚洲aaa在线观看| 日韩西西人体444www| 羞羞色院91蜜桃| 亚洲成人自拍网| 日本妇女毛茸茸| 亚洲国产精品激情在线观看| 亚洲av成人片色在线观看高潮| 久久丁香综合五月国产三级网站 | 在线观看爽视频| 欧美日韩成人网| 麻豆系列在线观看| 国产午夜精品一区二区三区| 五月婷婷六月丁香| 欧美草草影院在线视频| 国产又黄又大又粗的视频| 一本久道中文字幕精品亚洲嫩| 久久人人爽人人爽人人| 亚洲丝袜制服诱惑| 调教驯服丰满美艳麻麻在线视频| 99riav一区二区三区| 国产乱国产乱老熟300部视频| 久久99热狠狠色一区二区| 黄色一级大片在线观看| 99精品国产福利在线观看免费 | 国产麻豆精品久久一二三| 污色网站在线观看| 美女网站视频久久| 丝袜制服一区二区三区| 视频一区中文字幕国产| 18岁网站在线观看| 日韩午夜免费| 热99这里只有精品| 在线一区欧美| 免费一级特黄毛片| 精品不卡视频| 黄色大片中文字幕| 一区二区91| www.爱色av.com| 亚洲永久免费| 少妇高清精品毛片在线视频| 老牛影视一区二区三区| 成人在线观看黄| 日本美女一区二区三区| 182午夜在线观看| 精品在线亚洲视频| 一级日本黄色片| 成人夜色视频网站在线观看| 亚洲欧洲日韩综合| 盗摄精品av一区二区三区| 丰满人妻一区二区三区免费视频棣| 国产成人精品亚洲日本在线桃色| 国产乱国产乱老熟300部视频| 成人精品小蝌蚪| 不卡一区二区在线观看| 国产亚洲精品精华液| 精品丰满少妇一区二区三区| 亚洲三级久久久| 精品无码m3u8在线观看| 精品国产老师黑色丝袜高跟鞋| 久久国产视频播放| 欧美午夜精品一区二区蜜桃| 国产精品九九九九| 精品区一区二区| 欧美成人综合在线| www.久久久久| 欧美性爽视频| 国产精品成人一区二区| 亚洲福利影视| 国产伦精品一区二区三区四区免费| 亚洲国产最新| 宅男在线精品国产免费观看| 欧美三级网页| 999在线免费视频| 国产一区二区在线影院| 日韩av手机在线播放| 国产日韩欧美一区二区三区乱码| 亚洲综合视频网站| 欧美日韩亚洲一区二区| 亚洲无码久久久久| 精品国产a毛片| av在线之家电影网站| 欧美大片欧美激情性色a∨久久| 自拍网站在线观看| 成人在线视频网| 日韩三级毛片| 色哟哟免费网站| 葵司免费一区二区三区四区五区| 亚洲三级在线视频| 国产日韩精品一区| 国产一级做a爰片在线看免费| 91国偷自产一区二区开放时间| 精品人妻无码一区二区三区蜜桃一 | 国产精品久久久久久av福利软件 | 欧美国产一二三区| 午夜国产精品视频| 亚洲激情在线观看视频| 成人午夜视频网站| 女性裸体视频网站| 色先锋久久av资源部| 亚洲成人黄色片| 日韩在线中文字幕| 日本欧美不卡| 国产嫩草一区二区三区在线观看| 久久国产电影| 久久无码高潮喷水| 岛国精品在线播放| 国产色无码精品视频国产| 色婷婷亚洲综合| 亚洲三区在线观看无套内射| 九九热r在线视频精品| 国产精品无码久久久久| 欧美裸体网站| 9国产精品视频| 一区二区三区人妻| 亚洲欧美怡红院| japanese国产在线观看| 日韩精品在线视频观看| 日本天码aⅴ片在线电影网站| 国产一区二区视频在线观看| 韩日一区二区三区| 日本久久久精品视频| www.av亚洲| 久青草免费视频| 日韩视频国产视频| 永久免费网站在线| 99re国产| 欧美黄色一区二区| 日韩欧美中文视频| 成人免费视频在线观看| 国产又粗又猛视频| 日韩在线视频二区| 少妇精品视频在线观看| 亚洲国产精品日韩| 老司机精品视频在线| 国产精品久久久免费看| 欧美精品久久一区二区三区| 香蕉视频在线播放| 国产精品自拍网| 欧美呦呦网站| 亚洲精品www.| √…a在线天堂一区| 国产视频www| 欧美精品免费在线观看| 51vv免费精品视频一区二区| 日韩精品免费一区| 成人综合在线网站| 香蕉免费毛片视频| 亚洲人成伊人成综合网久久久 | 欧美波霸videosex极品| 欧美中文字幕不卡| 麻豆传媒在线免费| 91传媒视频在线观看| 亚洲一级一区| 偷拍女澡堂一区二区三区| 91福利精品第一导航| 五月天婷婷在线视频| 91精品在线观看视频| 国产主播精品| 91精品国产自产| 91久久精品日日躁夜夜躁欧美| a√在线中文网新版址在线| 成人精品久久久| 极品av少妇一区二区| 美女100%无挡| 在线播放中文字幕一区| 国产高清在线a视频大全| 精品国产乱码久久久久久久软件| 久久尤物视频| 91嫩草|国产丨精品入口| 亚洲成人xxx| 性欧美hd调教| 麻豆一区二区三区在线观看| gogo大胆日本视频一区| 国产三级理论片| 久久999免费视频| 蜜桃国内精品久久久久软件9| 婷婷激情四射五月天| 一区二区在线观看视频| 麻豆国产在线播放| 5566中文字幕一区二区| 免费视频一区| 印度午夜性春猛xxx交| 日韩久久精品成人| 国产精品高清一区二区| 国产精品97在线| 亚洲精品欧美综合四区| 青草久久伊人| 亚洲综合在线中文字幕| 久热re这里精品视频在线6| 美女福利视频在线观看| 在线电影av不卡网址| 国产精品自在线拍| 岛国av免费在线| 色综合夜色一区| av在线不卡免费|