91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

阿里P7架構師分享:15分鐘快速掌握SpringCache(使用詳解)

發布時間:2020-06-03 20:45:44 來源:網絡 閱讀:633 作者:wx5d78c87dd0584 欄目:編程語言

緩存的策略有很多,在應用系統中可根據情況 選擇,通常會把一些 靜態數據后者變化頻率不高的數據放到緩存中,如配置參數、字典表等。而有些場景可能要尋找替代方案,比如,想提升全文檢索的速度,在復雜場景下建議使用搜索引擎,如Solr或 ElasticSearch。

通常在Web開發中,不同層級對應的緩存要求和緩存策略全然不同,如下圖:
阿里P7架構師分享:15分鐘快速掌握SpringCache(使用詳解)
下面了解一下緩存中的兩個比較重要的基本概念:

1. 緩存命中率

即從緩存中讀取數據的次數與總讀取次數的比率。一般來說,命中率越高越好。

命中率 = 從緩存中讀取的次數 /(總讀取次數【從緩存中讀取的次數 + 從慢速設備上讀取的次數】)

Miss 率 = 沒有從緩存中讀取的次數 /(總讀取次數[從緩存中讀取的次數 + 從慢速設備上讀取的次數])

如果要做緩存,就一定要監控這個指標,來看緩存是否工作良好。

2.過期策略

  • FIFO(First In First Out):先進先出策略。
  • LRU(Least Recently Used): 最久未使用策略,即一定時間段內使用率最少的那個數據被溢出。
  • TTL(Time to Live): 存活期,即從緩存中創建時間點開始直至到期的一個時間段。
  • TTI(Time To Idle): 空閑期,即一個 數據多久沒被訪問就從緩存中移除的時間。
    自定義實現一個緩存管理器:

首先自定義一個User實體類。

public class User implements Serializable {
    private String userId;
    private String userName;
    private int age;

    public User(String userId) {
        this.userId = userId;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

接下來定義一個緩存管理器:

public class CacheManager<T> {
    private Map<String, T> cache = new ConcurrentHashMap<String, T>();

    public T getValue(Object key) {
        return cache.get(key);
    }

    public void addOrUpdate(String key, T value) {
        cache.put(key, value);
    }

    public void delCache(String key) {
        if (cache.containsKey(key)) {
            cache.remove(key);
        }
    }

    public void clearCache() {
        cache.clear();
    }
}

提供用戶查詢的服務類,此服務類使用緩存管理器來支持用戶查詢。

public class UserService {

    private CacheManager<User> cacheManager;

    public UserService() {
        cacheManager = new CacheManager<User>();
    }

    @Cacheable(cacheNames = "users")
    public User getUserById(String userId) {
        // 方法內部實現不考慮緩存邏輯,直接實現業務
        System.out.println("read quert user. " + userId);
        return getFromDB(userId);
    }

    public void reload() {
        cacheManager.clearCache();
    }

    private User getFromDB(String userId) {
        return new User(userId);
    }

}

使用SpringCache 來實現上面的例子:

public class UserServiceUseSpringCache {

    private CacheManager<User> cacheManager;

    public UserServiceUseSpringCache() {
        cacheManager = new CacheManager<User>();
    }

    public User getUserById(String userId) {
        User result = cacheManager.getValue(userId);
        if (result != null) {
            System.out.println("get from cache..." + userId);
            // 如果在緩存中,則直接返回緩存的結果
            return result;
        }

        // 否則從數據庫查詢
        result = getFromDB(userId);
        if (result != null) {
            // 將數據庫查詢的結果更新到緩存中
            cacheManager.addOrUpdate(userId, result);
        }
        return result;

    }

    public void reload() {
        cacheManager.clearCache();
    }

    private User getFromDB(String userId) {
        return new User(userId);
    }

}

現在還需要一個Spring 配置文件來支持基于注解的緩存:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:cache="http://www.springframework.org/schema/cache"
 xmlns:p="http://www.springframework.org/schema/p"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans.xsd 
 http://www.springframework.org/schema/cache 
 http://www.springframework.org/schema/cache/spring-cache.xsd"> 

 <!-- 啟動基于注解的緩存驅動 這個配置項默認使用了一個定義為cacheManager的緩存管理器。 -->
 <cache:annotation-driven />

 <bean id="accountServiceBean" class="cacheOfAnno.AccountService"/> 

 <!-- generic cache manager -->
 <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
 <property name="caches"> 
 <set> 
 <bean
 class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="default" /> 

 <bean
 class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="users" /> 
 </set> 
 </property> 
 </bean> 
</beans>

上面在UserService代碼中沒有看到任何緩存邏輯代碼,只需一個注解@Cacheable(cacheNames="users"),就實現了基本的緩存方案,代碼變得非常優雅、簡潔。使用Spring Cache 只需完成以下兩個步驟:

  • 緩存定義: 確定需要緩存的方法和緩存策略
  • 緩存配置: 配置緩存
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德安县| 灵璧县| 抚顺县| 乐平市| 治县。| 航空| 营山县| 资兴市| 大悟县| 屯昌县| 芦山县| 大港区| 辽源市| 皋兰县| 保山市| 台北市| 池州市| 东明县| 黄骅市| 临海市| 武汉市| 南江县| 府谷县| 阿拉善右旗| 临猗县| 钟山县| 阳山县| 安远县| 黎城县| 张家川| 从江县| 丽水市| 任丘市| 三台县| 方山县| 疏附县| 安陆市| 桃园市| 余干县| 景泰县| 依兰县|