Guava的使用

Guava 是什麼?

  Guava是一種基於開源的Java庫,其中包含谷歌正在由他們不少項目使用的不少核心庫。這個庫是爲了方便編碼,並減小編碼錯誤。這個庫提供用於集合,緩存,支持原語,併發性,常見註解,字符串處理,I/O和驗證的實用方法。redis

Guava的好處

一、標準化 - Guava庫是由谷歌託管。spring

二、高效 - 可靠,快速和有效的擴展JAVA標準庫緩存

三、優化 -Guava庫通過高度的優化安全

 

guava能夠設置key值大小,初始、最終容量,有LRU機制,滿了以後根據LRU策略淘汰非熱點數據網絡

Guava Cache:可控制的大小和超時時間,可配置的LRU策略,線程安全

  本地熱點緩存,有這麼幾個特色:session

    熱點數據,髒讀特別不敏感,內存必須可控等併發

    本地緩存和redis緩存相比有何優勢?快!能夠節省網絡傳輸的時間開銷app

實戰:

  一、導包

<!--這個是補充的,redis也能夠使用redisTemplate-->ide

<dependency>優化

      <groupId>org.springframework.session</groupId>

      <artifactId>spring-session-data-redis</artifactId>

      <version>2.0.5.RELEASE</version>

</dependency>

<!--這個是guava的包-->

    <dependency>

      <groupId>com.google.guava</groupId>

      <artifactId>guava</artifactId>

      <version>18.0</version>

    </dependency>

 

  二、編寫接口:

//封裝本地緩存操做類

public interface CacheService {

    //存方法

    void setCommonCache(String key,Object value);

    //取方法

    Object getFromCommonCache(String key);

}

 

  三、編寫實現類

@Service

public class CacheServiceImpl implements CacheService {

    private Cache<String,Object> commonCache = null;

    @PostConstruct

    public void init(){

        commonCache = CacheBuilder.newBuilder()

                //設置緩存容器的初始容量爲10

                .initialCapacity(10)

                //設置緩存中最大能夠存儲100個KEY,超過100個以後會按照LRU的策略移除緩存項

                .maximumSize(100)

                //設置寫緩存後多少秒過時

                .expireAfterWrite(60, TimeUnit.SECONDS).build();

    }

    @Override

    public void setCommonCache(String key, Object value) {

            commonCache.put(key,value);

    }

    @Override

    public Object getFromCommonCache(String key) {

        return commonCache.getIfPresent(key);

    }

}

 

  四、項目中使用

 

@RequestMapping(value = "/get",method = {RequestMethod.GET})

@ResponseBody

public CommonReturnType getItem(@RequestParam(name = "id")Integer id){

        ItemModel itemModel = null;

        //先取本地緩存

        itemModel = (ItemModel) cacheService.getFromCommonCache("item_"+id);

        if(itemModel == null){

            //根據商品的id到redis內獲取

            itemModel = (ItemModel) redisTemplate.opsForValue().get("item_"+id);

            //若redis內不存在對應的itemModel,則訪問下游service

            if(itemModel == null){

                itemModel = itemService.getItemById(id);

                //設置itemModel到redis內

                redisTemplate.opsForValue().set("item_"+id,itemModel);

                redisTemplate.expire("item_"+id,10, TimeUnit.MINUTES);

            }

            //填充本地緩存

            cacheService.setCommonCache("item_"+id,itemModel);

        }

        ItemVO itemVO = convertVOFromModel(itemModel);

        return CommonReturnType.create(itemVO);

}

相關文章
相關標籤/搜索