日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kv缓存用法指南

發(fā)布時間:2024/3/7 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kv缓存用法指南 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

8-27 kv緩存初步學(xué)習(xí)

一、理解業(yè)務(wù)中的使用緩存優(yōu)勢

舉個簡單的例子,我們可以類比去圖書館看書
沒有使用緩存的情況
當(dāng)我們想要查看某本書的時候(查看數(shù)據(jù)庫的記錄),需要先去圖書館找到這本書所在的類目(記錄存在的表),然后再找到這本書,看一會后再把這本書還回去。
但是如果有幾本我們常看的數(shù),我們每次看都要去圖書館取,取完了再放回去太麻煩。

使用緩存的情況
當(dāng)我們想要查看某本書的時候(查看數(shù)據(jù)庫的記錄),需要先去圖書館找到這本書所在的類目(記錄存在的表),然后再找到這本書,把這本書借回去放到自己的書架上。
這樣做我們可以對一些我們頻繁閱讀的書籍放在觸手可及的書架上,大大節(jié)約了時間成本。

  • 就像書架(redis占據(jù)的內(nèi)存)和圖書館(數(shù)據(jù)庫占據(jù)的磁盤)一樣,書架的資源和空間非常的寶貴,因此一些不必要的書籍沒有必要放在書架(redis中)上。
  • 就像去圖書館和用手拿書一樣,內(nèi)存的讀取速度時磁盤的500-1000倍,當(dāng)我們需要對一些熱點數(shù)據(jù)訪問的時候,大大節(jié)約了時間成本。

總結(jié):redis緩存是一種key-value緩存數(shù)據(jù)庫,是對數(shù)據(jù)庫頻繁訪問的某些熱點字段的一種優(yōu)化方案。

二、搭建kv緩存使用環(huán)境

kv是把熱點數(shù)據(jù)作為Key-Value形式存儲的一種

2.1 連接redis服務(wù)器

  • 引入redis服務(wù)端依賴
  • 配置redis相關(guān)信息
  • 啟動redis服務(wù)和spring程序
  • <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>2.5.1</version></dependency>

    2.2 引入jedis客戶端

    <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency>

    2.3 引入Kv緩存框架

    • 引入所需要的包

    三、使用Kv緩存框架

    3.1 通過kv工廠創(chuàng)建 特定kvCacheWrapper(服務(wù)包裝接口)

    kv緩存框架采用的是工廠設(shè)計模式創(chuàng)建指定存儲的kvCacheWrapper
    當(dāng)然,這些CacheWrapper我們需要隨著spring的啟動而被創(chuàng)建(就像Repository一樣),因此我們需要指定在springbean初始化的時候?qū)ζ溥M(jìn)行創(chuàng)建。@PostConstruct注解下的方法可以在spring加載這個類的時候自動調(diào)用。

    首先,我們通過依賴注入的方式引入KvCacheFactory。

    @Autowiredprivate KvCacheFactory kvCacheFactory;

    接著,在初始化方法下通過kvCacheFactory.create()創(chuàng)建特定的kvCacheWrapper接口
    在創(chuàng)建之前,先來了解一下KvCacheFactory.created()所需的參數(shù)

    • CacheOptions:緩存配置項。(key:redis某一類數(shù)據(jù)的標(biāo)識,相當(dāng)于mysql中的表明。version:版本號。expireIn:每條緩存記錄的時限。)
    • RepositoryProvider:持久層的支持(這里支持我們訪問數(shù)據(jù)庫)。我們需要實現(xiàn)兩個方法
      -
      findByKey是指定,我們通過什么類型的key來獲取緩存中的value,當(dāng)然這里也意味著我們存數(shù)據(jù)的時候key與這個類型一致,這個約定是在keyWrapper中約定的。
    • ModelConverter:模型和json的轉(zhuǎn)換,這里寫我們需要存取數(shù)據(jù)的model模型,當(dāng)我們在存取的時候參與轉(zhuǎn)換。

    比如說我們這里創(chuàng)建一個User的緩存接口。

    @PostConstructpublic void init(){userCache = kvCacheFactory.create(new CacheOptions("user", 1, DateUtils.SECOND_PER_DAY),new RepositoryProvider<Long, User>() {@Overridepublic User findByKey(Long key) throws Exception{return repository.findById(key).orElse(null);}@Overridepublic Map<Long, User> findByKeys(java.util.Collection<Long> keys) throws Exception{return repository.findByIdIn(keys).stream().collect(Collectors.toMap(User::getId, t -> t));}}, new BeanModelConverter<>(User.class)); }

    3.2 使用cacheWrapper

    通過查看KvCache接口我們可以查看它的所有用法

    public interface KvCache<K, T> {// 只從緩存中查找,如果緩存中沒有,則返回null(不進(jìn)入數(shù)據(jù)庫)。T findByKey(K key, boolean cacheOnly);// 先從緩存中查找,如果緩存中沒有進(jìn)入數(shù)據(jù)庫中查找,找到后緩存到redis中。T findByKey(K key);// 同上Map<K, T> findByKeys(Collection<K> keys, boolean cacheOnly) throws KvCacheException;// 同上Map<K, T> findByKeys(Collection<K> keys) throws KvCacheException;// 保存到緩存中void save(K key, T value) throws KvCacheException;// 批量保存void saveMany(Map<K, T> items) throws KvCacheException;// 刷新緩存(重新加載內(nèi)容,寫入緩存并返回)T refresh(K key) throws Exception;// 從緩存中刪除void remove(K key) throws KvCacheException;// 根據(jù)prefix清理全部數(shù)據(jù)(這個prefix是我們在配置Policy配置的)void flush() throws KvCacheException;}

    Policy策略
    policy默認(rèn)的為我們提供了一些策略

    • 過期時間使用的是我們在CacheOption中配置的過期時間
    • 前綴策略(供定制批量刪除策略):是我們的 CacheOption中key(也就是redis的表明)+:+版本號+:組成的,比如 admin:1:xxx
    flush()

    通過前綴策略,批量刪除某個數(shù)據(jù)組的某個版本的所有數(shù)據(jù)。

    因為我們在通過工廠create cacheWrapper的時候,我們自動在這里的前綴策略默認(rèn)使用的是:“組名:版本號:”

    flush源碼:

    3.3 如何使用緩存

    因為內(nèi)存資源的珍貴,我們并不能任意的緩存數(shù)據(jù)庫記錄到緩存中,如何合理的使用緩存在業(yè)務(wù)中至關(guān)重要。

  • 緩存中應(yīng)該存入頻繁訪問的熱點數(shù)據(jù)。比如每次請求都需要包裝的上下文信息。
  • 不允許緩存重要數(shù)據(jù),比如密碼。我們可以設(shè)置該字段禁用反序列化來達(dá)到不緩存的目的。
  • 做redis緩存的時候,注意以下幾點:
    • 是否從緩存中獲取的模型有被禁止序列化的字段,如果需要用到這些字段應(yīng)該從數(shù)據(jù)庫中直接查詢
    • 修改和刪除數(shù)據(jù)庫記錄的時候要注意及時清除臟數(shù)據(jù)(刪除緩存信息,下一次訪問該緩存信息的時候直接在從數(shù)據(jù)庫中查詢最新數(shù)據(jù)),避免臟讀
    • 緩存的session字段,如果過期了也要及時清除:(可以設(shè)置緩存過期時間跟session過期一樣的時間,因為在用戶初次登錄產(chǎn)生session的時候,就會把session緩存起來(通過token獲取wrapper的時候),讓兩者的存在時間保持同步)
  • 總結(jié)

    以上是生活随笔為你收集整理的Kv缓存用法指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。