成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用上這個開源本地緩存工具,Redis讀寫完全沒壓力!

開發 開發工具 新聞
高頻數據流處理系統中,Redis的壓力也會很大,同時I/0開銷才是耗時的主要原因。

圖片

前言

我們開發中經常用到Redis作為緩存,將高頻數據放在Redis中能夠提高業務性能,降低MySQL等關系型數據庫壓力,甚至一些系統使用Redis進行數據持久化,Redis松散的文檔結構非常適合業務系統開發,在精確查詢,數據統計業務有著很大的優勢。

但是高頻數據流處理系統中,Redis的壓力也會很大,同時I/0開銷才是耗時的主要原因,這時候為了降低Redis讀寫壓力我們可以用到本地緩存,Guava為我們提供了優秀的本地緩存API,包含了過期策略等等,編碼難度低,個人非常推薦。

設計示例

Redis懶加載緩存

數據在新增到MySQL不進行緩存,在精確查找進行緩存,做到查詢即緩存,不查詢不緩存。

1)流程圖

圖片

2)代碼示例

// 偽代碼示例 Xx代表你的的業務對象 如User Goods等等
public class XxLazyCache {

@Autowired
private RedisTemplate<String, Xx> redisTemplate;

@Autowired
private XxService xxService;// 你的業務service

/**
* 查詢 通過查詢緩存是否存在驅動緩存加載 建議在前置業務保證id對應數據是絕對存在于數據庫中的
*/
public Xx getXx(int id) {
// 1.查詢緩存里面有沒有數據
Xx xxCache = getXxFromCache(id);
if(xxCache != null) {
return xxCache;// 衛語句使代碼更有利于閱讀
}
// 2.查詢數據庫獲取數據 我們假定到業務這一步,傳過來的id都在數據庫中有對應數據
Xx xx = xxService.getXxById(id);
// 3.設置緩存、這一步相當于Redis緩存懶加載,下次再查詢此id,則會走緩存
setXxFromCache(xx);
return xx;
}
}

/**
* 對xx數據進行修改或者刪除操作 操作數據庫成功后 刪除緩存
* 刪除請求 - 刪除數據庫數據 刪除緩存
* 修改請求 - 更新數據庫數據 刪除緩存 下次在查詢時候就會從數據庫拉取新的數據到緩存中
*/
public void deleteXxFromCache(long id) {
String key = "Xx:" + xx.getId();
redisTemplate.delete(key);
}

private void setXxFromCache(Xx xx) {
String key = "Xx:" + xx.getId();
redisTemplate.opsForValue().set(key, xx);
}

private Xx getXxFromCache(int id) {
// 通過緩存前綴拼裝唯一主鍵作為緩存Key 如Xxx信息 就是Xxx:id
String key = "Xx:" + id;
return redisTemplate.opsForValue().get(key);
}

}
// 業務類
public class XxServie {
@Autowired
private XxLazyCache xxLazyCache;
// 查詢數據庫
public Xx getXxById(long id) {
// 省略實現
return xx;
}

public void updateXx(Xx xx) {
// 更新MySQL數據 省略
// 刪除緩存
xxLazyCache.deleteXxFromCache(xx.getId());
}

public void deleteXx(long id) {
// 刪除MySQL數據 省略
// 刪除緩存
xxLazyCache.deleteXxFromCache(xx.getId());
}
}
// 實體類
@Data
public class Xx {
// 業務主鍵
private Long id;
// ...省略
}

3)優點

  • 保證最小的緩存量滿足精確查詢業務,避免冷數據占用寶貴的內存空間;
  • 對增刪改查業務入侵小、刪除即同步;
  • 可插拔,對于老系統升級,歷史數據無需在啟動時初始化緩存。

4)缺點

  • 數據量需可控,在無限增長業務場景不適用;
  • 在微服務場景不利于全局緩存應用。

5)總結

  • 空間最小化;
  • 滿足精確查詢場景;
  • 總數據量可控推薦使用;
  • 微服務場景不適用。

Redis結合本地緩存

微服務場景下,多個微服務使用一個大緩存,流數據業務下,高頻讀取緩存對Redis壓力很大,我們使用本地緩存結合Redis緩存使用,降低Redis壓力,同時本地緩存沒有連接開銷,性能更優。

1)流程圖

圖片

2)業務場景

在流處數處理過程中,微服務對多個設備上傳的數據進行處理,每個設備有一個code,流數據的頻率高,在消息隊列發送過程中使用分區發送,我們需要為設備code生成對應的自增號,用自增號對kafka中topic分區數進行取模,這樣如果有10000臺設備,自增號就是0~9999,在取模后就進行分區發送就可以做到每個分區均勻分布,這個自增號我們使用redis的自增數生成,生成后放到redis的hash結構進行緩存,每次來一個設備,我們就去這個hash緩存中取,沒有取到就使用自增數生成一個,然后放到redis的hash緩存中,這時候每個設備的自增數一經生成是不會再發生改變的,我們就想到使用本地緩存進行優化,避免高頻的調用redis去獲取,降低redis壓力。

3)代碼示例


/**
* 此緩存演示如何結合redis自增數 hash 本地緩存使用進行設備自增數的生成、緩存、本地緩存
* 本地緩存使用Guava Cache
*/
public class DeviceIncCache {

/**
* 本地緩存
*/
private Cache<String, Integer> localCache = CacheBuilder.newBuilder()
.concurrencyLevel(16) // 并發級別
.initialCapacity(1000) // 初始容量
.maximumSize(10000) // 緩存最大長度
.expireAfterAccess(1, TimeUnit.HOURS) // 緩存1小時沒被使用就過期
.build();

@Autowired
private RedisTemplate<String, Integer> redisTemplate;

/**
* redis自增數緩存的key
*/
private static final String DEVICE_INC_COUNT = "device_inc_count";

/**
* redis設備編碼對應自增數的hash緩存key
*/
private static final String DEVICE_INC_VALUE = "device_inc_value";

/**
* 獲取設備自增數
*/
public int getInc(String deviceCode){
// 1.從本地緩存獲取
Integer inc = localCache.get(deviceCode);
if(inc != null) {
return inc;
}
// 2.本地緩存未命中,從redis的hash緩存獲取
inc = (Integer)redisTemplate.opsForHash().get(DEVICE_INC_VALUE, deviceCode);
// 3. redis的hash緩存中沒有,說明是新設備,先為設備生成一個自增號
if(inc == null) {
inc = redisTemplate.opsForValue().increment(DEVICE_INC_COUNT).intValue;
// 添加到redis hash緩存
redisTemplate.opsForHash().put(DEVICE_INC_VALUE, deviceCode, inc);
}
// 4.添加到本地緩存
localCache.put(deviceCode, inc);
// 4.返回自增數
return inc;
}

}

4)優點

redis保證數據可持久,本地緩存保證超高的讀取性能,微服務共用redis大緩存的場景能有效降低redis壓力;

guava作為本地緩存,提供了豐富的api,過期策略,最大容量,保證服務內存可控,冷數據不會長期占據內存空間;

服務重啟導致的本地緩存清空不會影響業務進行;

微服務及分布式場景使用,分布式情況下每個服務實例只會緩存自己接入的那一部分設備的自增號,本地內存空間最優;

在示例業務中,自增數滿足了分布區發送的均勻分布需求,也可以滿足統計設備接入數目的業務場景,一舉兩得。

5)缺點

增加編碼復雜度,不直接;

只適用于緩存內容只增不改的場景。

6)總結

本地緩存空間可控,過期策略優;

適用于微服務及分布式場景;

緩存內容不能發生改變;

性能優。

后記

redis提供了豐富的數據類型及api,非常適合業務系統開發,統計計數(increment,decrement),標記位(bitmap),松散數據(hash),先進先出、隊列式讀取(list);guava緩存作為本地緩存,能夠高效的讀取的同時,提供了大量api方便我們控制本地緩存的數據量及冷數據淘汰;我們充分的學習這些特性能夠幫助我們在業務開發中更加輕松靈活,在空間與時間上找到一個平衡點。

責任編輯:張燕妮 來源: dbaplus社群
相關推薦

2020-02-11 20:00:29

開源開源工具天氣預報

2021-07-14 16:03:36

開源技術 工具

2022-06-08 08:45:46

Redis緩存代碼

2024-11-01 16:18:52

2020-01-10 10:14:48

Redis數據庫架構

2020-02-28 19:06:21

緩存讀寫Redis

2023-04-18 18:22:31

開源工具數據庫

2021-03-08 08:16:42

MySQL分離架構

2021-04-09 06:15:54

開源工具Python編程語言

2021-03-16 14:44:30

工具代碼開發

2023-11-30 18:25:57

數據訓練

2022-10-11 16:57:29

開源工具開源

2020-11-08 13:50:19

Kubernetes容器

2021-02-08 08:40:00

Zint二維碼開源

2021-08-31 09:41:57

LinuxiPhone開源工具

2021-09-01 09:47:25

Linux 工具 開發

2022-11-17 15:12:05

開源小米

2019-02-12 14:24:14

緩存高并發網絡

2015-10-23 09:44:59

PaaS開源云應用

2024-06-06 19:14:27

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区四区五区午夜 | 欧美国产日韩一区 | 精品国产一区二区三区日日嗨 | 国产精品永久免费视频 | 少妇一区在线观看 | 日韩成人在线视频 | 亚洲国产成人av好男人在线观看 | 中文字幕四虎 | 亚洲色欲色欲www | 一区中文字幕 | 精品久久久久久久久久久久久久 | 中文字幕一区在线观看视频 | 中文字幕蜜臀av | 少妇特黄a一区二区三区88av | 久久久国产精品 | 国产日韩精品在线 | 欧美日韩视频在线第一区 | 男人的天堂亚洲 | 超碰国产在线 | 精品不卡 | 日本不卡免费新一二三区 | www.一区二区 | 一级黄色生活视频 | 色爱综合网| 亚洲精品色| 国产毛片av | 一区二区三区精品在线视频 | 国产一二区视频 | 精品一区二区三区电影 | 国产在线精品区 | 性做久久久久久免费观看欧美 | 国产日韩欧美一区二区 | 欧美 日韩 中文 | 国产一区2区 | 日韩在线免费视频 | 国产精品一区二区三区四区 | 日韩欧美亚洲 | 国产一区免费 | 色婷婷国产精品综合在线观看 | 日韩视频在线观看中文字幕 | 亚洲视频免费在线 |