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

用上這個(gè)開(kāi)源本地緩存工具,Redis讀寫(xiě)完全沒(méi)壓力!

開(kāi)發(fā) 開(kāi)發(fā)工具 新聞
高頻數(shù)據(jù)流處理系統(tǒng)中,Redis的壓力也會(huì)很大,同時(shí)I/0開(kāi)銷才是耗時(shí)的主要原因。

圖片

前言

我們開(kāi)發(fā)中經(jīng)常用到Redis作為緩存,將高頻數(shù)據(jù)放在Redis中能夠提高業(yè)務(wù)性能,降低MySQL等關(guān)系型數(shù)據(jù)庫(kù)壓力,甚至一些系統(tǒng)使用Redis進(jìn)行數(shù)據(jù)持久化,Redis松散的文檔結(jié)構(gòu)非常適合業(yè)務(wù)系統(tǒng)開(kāi)發(fā),在精確查詢,數(shù)據(jù)統(tǒng)計(jì)業(yè)務(wù)有著很大的優(yōu)勢(shì)。

但是高頻數(shù)據(jù)流處理系統(tǒng)中,Redis的壓力也會(huì)很大,同時(shí)I/0開(kāi)銷才是耗時(shí)的主要原因,這時(shí)候?yàn)榱私档蚏edis讀寫(xiě)壓力我們可以用到本地緩存,Guava為我們提供了優(yōu)秀的本地緩存API,包含了過(guò)期策略等等,編碼難度低,個(gè)人非常推薦。

設(shè)計(jì)示例

Redis懶加載緩存

數(shù)據(jù)在新增到MySQL不進(jìn)行緩存,在精確查找進(jìn)行緩存,做到查詢即緩存,不查詢不緩存。

1)流程圖

圖片

2)代碼示例

// 偽代碼示例 Xx代表你的的業(yè)務(wù)對(duì)象 如User Goods等等
public class XxLazyCache {

@Autowired
private RedisTemplate<String, Xx> redisTemplate;

@Autowired
private XxService xxService;// 你的業(yè)務(wù)service

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

/**
* 對(duì)xx數(shù)據(jù)進(jìn)行修改或者刪除操作 操作數(shù)據(jù)庫(kù)成功后 刪除緩存
* 刪除請(qǐng)求 - 刪除數(shù)據(jù)庫(kù)數(shù)據(jù) 刪除緩存
* 修改請(qǐng)求 - 更新數(shù)據(jù)庫(kù)數(shù)據(jù) 刪除緩存 下次在查詢時(shí)候就會(huì)從數(shù)據(jù)庫(kù)拉取新的數(shù)據(jù)到緩存中
*/
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) {
// 通過(guò)緩存前綴拼裝唯一主鍵作為緩存Key 如Xxx信息 就是Xxx:id
String key = "Xx:" + id;
return redisTemplate.opsForValue().get(key);
}

}
// 業(yè)務(wù)類
public class XxServie {
@Autowired
private XxLazyCache xxLazyCache;
// 查詢數(shù)據(jù)庫(kù)
public Xx getXxById(long id) {
// 省略實(shí)現(xiàn)
return xx;
}

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

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

3)優(yōu)點(diǎn)

  • 保證最小的緩存量滿足精確查詢業(yè)務(wù),避免冷數(shù)據(jù)占用寶貴的內(nèi)存空間;
  • 對(duì)增刪改查業(yè)務(wù)入侵小、刪除即同步;
  • 可插拔,對(duì)于老系統(tǒng)升級(jí),歷史數(shù)據(jù)無(wú)需在啟動(dòng)時(shí)初始化緩存。

4)缺點(diǎn)

  • 數(shù)據(jù)量需可控,在無(wú)限增長(zhǎng)業(yè)務(wù)場(chǎng)景不適用;
  • 在微服務(wù)場(chǎng)景不利于全局緩存應(yīng)用。

5)總結(jié)

  • 空間最小化;
  • 滿足精確查詢場(chǎng)景;
  • 總數(shù)據(jù)量可控推薦使用;
  • 微服務(wù)場(chǎng)景不適用。

Redis結(jié)合本地緩存

微服務(wù)場(chǎng)景下,多個(gè)微服務(wù)使用一個(gè)大緩存,流數(shù)據(jù)業(yè)務(wù)下,高頻讀取緩存對(duì)Redis壓力很大,我們使用本地緩存結(jié)合Redis緩存使用,降低Redis壓力,同時(shí)本地緩存沒(méi)有連接開(kāi)銷,性能更優(yōu)。

1)流程圖

圖片

2)業(yè)務(wù)場(chǎng)景

在流處數(shù)處理過(guò)程中,微服務(wù)對(duì)多個(gè)設(shè)備上傳的數(shù)據(jù)進(jìn)行處理,每個(gè)設(shè)備有一個(gè)code,流數(shù)據(jù)的頻率高,在消息隊(duì)列發(fā)送過(guò)程中使用分區(qū)發(fā)送,我們需要為設(shè)備code生成對(duì)應(yīng)的自增號(hào),用自增號(hào)對(duì)kafka中topic分區(qū)數(shù)進(jìn)行取模,這樣如果有10000臺(tái)設(shè)備,自增號(hào)就是0~9999,在取模后就進(jìn)行分區(qū)發(fā)送就可以做到每個(gè)分區(qū)均勻分布,這個(gè)自增號(hào)我們使用redis的自增數(shù)生成,生成后放到redis的hash結(jié)構(gòu)進(jìn)行緩存,每次來(lái)一個(gè)設(shè)備,我們就去這個(gè)hash緩存中取,沒(méi)有取到就使用自增數(shù)生成一個(gè),然后放到redis的hash緩存中,這時(shí)候每個(gè)設(shè)備的自增數(shù)一經(jīng)生成是不會(huì)再發(fā)生改變的,我們就想到使用本地緩存進(jìn)行優(yōu)化,避免高頻的調(diào)用redis去獲取,降低redis壓力。

3)代碼示例


/**
* 此緩存演示如何結(jié)合redis自增數(shù) hash 本地緩存使用進(jìn)行設(shè)備自增數(shù)的生成、緩存、本地緩存
* 本地緩存使用Guava Cache
*/
public class DeviceIncCache {

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

@Autowired
private RedisTemplate<String, Integer> redisTemplate;

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

/**
* redis設(shè)備編碼對(duì)應(yīng)自增數(shù)的hash緩存key
*/
private static final String DEVICE_INC_VALUE = "device_inc_value";

/**
* 獲取設(shè)備自增數(shù)
*/
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緩存中沒(méi)有,說(shuō)明是新設(shè)備,先為設(shè)備生成一個(gè)自增號(hào)
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.返回自增數(shù)
return inc;
}

}

4)優(yōu)點(diǎn)

redis保證數(shù)據(jù)可持久,本地緩存保證超高的讀取性能,微服務(wù)共用redis大緩存的場(chǎng)景能有效降低redis壓力;

guava作為本地緩存,提供了豐富的api,過(guò)期策略,最大容量,保證服務(wù)內(nèi)存可控,冷數(shù)據(jù)不會(huì)長(zhǎng)期占據(jù)內(nèi)存空間;

服務(wù)重啟導(dǎo)致的本地緩存清空不會(huì)影響業(yè)務(wù)進(jìn)行;

微服務(wù)及分布式場(chǎng)景使用,分布式情況下每個(gè)服務(wù)實(shí)例只會(huì)緩存自己接入的那一部分設(shè)備的自增號(hào),本地內(nèi)存空間最優(yōu);

在示例業(yè)務(wù)中,自增數(shù)滿足了分布區(qū)發(fā)送的均勻分布需求,也可以滿足統(tǒng)計(jì)設(shè)備接入數(shù)目的業(yè)務(wù)場(chǎng)景,一舉兩得。

5)缺點(diǎn)

增加編碼復(fù)雜度,不直接;

只適用于緩存內(nèi)容只增不改的場(chǎng)景。

6)總結(jié)

本地緩存空間可控,過(guò)期策略優(yōu);

適用于微服務(wù)及分布式場(chǎng)景;

緩存內(nèi)容不能發(fā)生改變;

性能優(yōu)。

后記

redis提供了豐富的數(shù)據(jù)類型及api,非常適合業(yè)務(wù)系統(tǒng)開(kāi)發(fā),統(tǒng)計(jì)計(jì)數(shù)(increment,decrement),標(biāo)記位(bitmap),松散數(shù)據(jù)(hash),先進(jìn)先出、隊(duì)列式讀?。╨ist);guava緩存作為本地緩存,能夠高效的讀取的同時(shí),提供了大量api方便我們控制本地緩存的數(shù)據(jù)量及冷數(shù)據(jù)淘汰;我們充分的學(xué)習(xí)這些特性能夠幫助我們?cè)跇I(yè)務(wù)開(kāi)發(fā)中更加輕松靈活,在空間與時(shí)間上找到一個(gè)平衡點(diǎn)。

責(zé)任編輯:張燕妮 來(lái)源: dbaplus社群
相關(guān)推薦

2020-02-11 20:00:29

開(kāi)源開(kāi)源工具天氣預(yù)報(bào)

2021-07-14 16:03:36

開(kāi)源技術(shù) 工具

2022-06-08 08:45:46

Redis緩存代碼

2024-11-01 16:18:52

2023-04-18 18:22:31

開(kāi)源工具數(shù)據(jù)庫(kù)

2020-01-10 10:14:48

Redis數(shù)據(jù)庫(kù)架構(gòu)

2021-03-08 08:16:42

MySQL分離架構(gòu)

2020-02-28 19:06:21

緩存讀寫(xiě)Redis

2022-10-11 16:57:29

開(kāi)源工具開(kāi)源

2021-04-09 06:15:54

開(kāi)源工具Python編程語(yǔ)言

2023-11-30 18:25:57

數(shù)據(jù)訓(xùn)練

2021-03-16 14:44:30

工具代碼開(kāi)發(fā)

2020-11-08 13:50:19

Kubernetes容器

2021-09-01 09:47:25

Linux 工具 開(kāi)發(fā)

2021-08-31 09:41:57

LinuxiPhone開(kāi)源工具

2021-02-08 08:40:00

Zint二維碼開(kāi)源

2024-06-06 19:14:27

2015-10-23 09:44:59

PaaS開(kāi)源云應(yīng)用

2019-02-12 14:24:14

緩存高并發(fā)網(wǎng)絡(luò)

2021-10-19 10:28:06

AI 數(shù)據(jù)工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美激情在线精品一区二区三区 | 一级毛片免费视频 | 丁香婷婷成人 | 国产91在线观看 | 性做久久久久久免费观看欧美 | 天天夜天天操 | 激情婷婷 | 亚洲一区二区av | 日韩在线观看中文字幕 | 色网站在线 | 美女视频一区二区三区 | 一区二区三区回区在观看免费视频 | 国产成人叼嘿视频在线观看 | 成人av网页 | 91在线影院 | 日韩成人在线观看 | 亚洲精品国产电影 | av在线播放一区二区 | 美女逼网站 | 久草视 | 99国产视频 | 久久精品一区 | 精品久久国产视频 | 国产午夜精品一区二区三区嫩草 | 欧美一二三区 | 亚洲成人av一区二区 | 日本黄色一级视频 | 日韩高清一区 | 国产成人亚洲精品 | 91视频免费黄 | 久久99视频精品 | 水蜜桃久久夜色精品一区 | 91福利网址| 成年人在线视频 | 国产一区二区三区四区五区加勒比 | 狠狠av | 久久精品国产99国产精品 | 国产视频三区 | 日韩和的一区二在线 | 成人精品国产一区二区4080 | 91视频在线 |