<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 一、概述 應用緩存一般分兩種,一是**進程內緩存**,就是使用應用內存的緩存(java應用就是虛擬機的內存);另一個是**進程外緩存**,也就是分布式緩存; 對于單體應用,可使用進程內緩存;但對于分布式應用(包括普通的多進程應用,如appServer,jobServer等并存的情況),需使用進程外分布式緩存; 緩存的使用,必須要謹慎考慮,使用不當會導致數據不一致的問題; ## 二、快速啟用 ### **配置項** 平臺已經內置了依賴及啟用配置,使用的是SpringBoot緩存機制,只需選擇緩存類型,無需其他額外配置,可直接使用; 選擇了redis做完緩存機制之后,平臺提供了具體的redis連接配置選項; ``` rayframework.redis.main.host=ENC(209300309509305308507304600307309) rayframework.redis.main.port=ENC(306309404308) rayframework.redis.main.password=ENC(906211211118906419406409906117904510516317) ``` 可以支持很多種緩存供應商類型,但平臺默認選擇redis作為緩存供應商,你可以選擇其他的緩存供應商,但如果選擇外部緩存供應商的話,建議就用redis好了:如果不指定具體其他第三方實現的時候,SpringBoot緩存機制會使用ConcurrentHashMap來作為緩存; >[danger] 注意: >1、平臺內置緩存類型配置項`spring.cache.type=redis`與`rayframework.default.cache-provider=redis`不同,后者僅僅是平臺自制緩存機制的選項,與這里使用的SpringBoot緩存機制不一樣; > 2、平臺配置項中`rayframework.redis.second.*`主機及數據庫配置,與這里使用的SpringBoot緩存機制的配置完全無關,它們都是平臺自制緩存機制選項; > 3、這里使用的SpringBoot緩存機制,僅使用`rayframework.redis.main`的`rayframework.redis.main.database.cache`配置項數據庫,除此之外,`rayframework.redis.main`的其他配置項數據庫(rayframework.redis.main.database.platform.\*)也都是平臺自制緩存機制選項; ### **未使用緩存代碼** ``` public interface SysLogDao extends BaseDao<SysLog, Long> { SysLog findByInfoCode(String infoCode); } ``` ``` @RayServiceMethod public ResponseObject view(long logId) { SysLog log = sysLogDao.findByInfoCode("log2022032314482228a"); // SysLog log = sysLogDao.findById(logId).get(); model.setLog(log); return responseObj; } ``` 兩次訪問該接口,兩次都會訪問數據庫,產生查詢語句記錄; ### **啟用緩存代碼** ``` @CacheConfig(cacheNames = "logcache") public interface SysLogDao extends BaseDao<SysLog, Long> { @Cacheable SysLog findByInfoCode(String infoCode); } ``` 兩次訪問該接口,只有第一次會訪問數據庫,后面查詢,不會產生查詢語句記錄了,表明緩存奏效了,但是,如果傳入的infoCode不同,則還是會去數據庫取數據; ``` @RayServiceMethod public ResponseObject view(long logId) { SysLog log = sysLogDao.findByInfoCode("1"); SysLog log2 = sysLogDao.findByInfoCode("2"); SysLog log3 = sysLogDao.findByInfoCode("1"); SysLog log4 = sysLogDao.findByInfoCode("2"); // SysLog log = sysLogDao.findById(logId).get(); model.setLog(log); return responseObj; } ``` 如上,有兩個不同的傳入參數,總共去數據庫查詢兩次; 查看redis緩存數據的效果: ![](https://img.kancloud.cn/c0/07/c007db92bade30d5aebd95c35e289a09_1895x333.png) ## 三、核心標注 ### **@CacheConfig** 統一配置本類的緩存注解的屬性;也可以不使用該注解,直接通過`@Cacheable`自己配置緩存集的名字來定義; ### **@Cacheable** @Cacheable 注解在方法上,表示該方法的返回結果是可以緩存的。也就是說,該方法的返回結果會放在緩存中,以便于以后使用相同的參數調用該方法時,會返回緩存中的值,而不會實際執行該方法。 對于同一個方法,如果參數相同,那么返回結果也是相同的。但是如果參數不同,緩存只能假設結果是不同的,所以對于同一個方法,你的程序運行過程中,使用了多少種參數組合調用過該方法,理論上就會生成多少個緩存的 key; | 參數 | 描述 | | --- | --- | | value | 緩存名稱,不能為空,如果使用EHCache,就是ehcache.xml中聲明的cache的name| | key |緩存的key,默認為空,支持SpEL| | condition | 觸發條件,只有滿足條件的情況才會加入緩存,默認為空,既表示全部都加入緩存,支持SpEL| ### **@CachePut** @CachePut 注解的緩存方法總是會執行,而且會嘗試將結果放入緩存(當然,是否真的會緩存還跟一些注解參數有關,比如:unless 參數); @CachePut 跟 @Cacheable 有相同的參數屬性;與@Cacheable不同的是使用@CachePut標注的方法在執行前不會去檢查緩存中是否存在之前執行過的結果,而是每次都會執行該方法,并將執行結果以鍵值對的形式存入指定的緩存中; >[danger] > @Cacheable 的邏輯是:查找緩存 - 有就返回 -沒有就執行方法體 - 將結果緩存起來; > @CachePut 的邏輯是:執行方法體 - 將結果緩存起來; > 所以 @Cacheable 適用于查詢數據的方法,@CachePut 適用于更新數據的方法; ### **@CacheEvict** 標注在需要清除緩存元素的方法或類上,清空緩存;當標記在一個類上時表示其中所有的方法的執行都會觸發緩存的清除操作; ## 四、特別注意 1、緩存機制是通過AOP代理實現的,因此,同一個類的內部方法之間調用不走代理,因此,必須確保是通過非內部類來做;建議是把緩存機制單獨抽出一層來實現,具體可參考分布式緩存的實例;
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看