偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

百億數(shù)據(jù)量下,掌握這些Redis技巧你大概就穩(wěn)住了全場

數(shù)據(jù)庫 其他數(shù)據(jù)庫 Redis
今天將會跟大家討論一些Redis在大數(shù)據(jù)中的使用,包括一些Redis的使用技巧和其他的一些內(nèi)容。

今天將會跟大家討論一些Redis在大數(shù)據(jù)中的使用,包括一些Redis的使用技巧和其他的一些內(nèi)容。

首先給大家個地址:

https://github.com/NewLifeX/NewLife.Redis

源碼以及實例都在里面,當然今天的內(nèi)容也是按照里面的實例來進行的,大家可以先進行下載。

這里也附上Redis的下載地址:

windows:

https://github.com/MicrosoftArchive/redis/releases

http://x.newlifex.com/Redis-x64-3.2.100.msi

Linux:

https://redis.io/download

一、Redis封裝架構(gòu)講解

實際上NewLife.Redis是一個完整的Redis協(xié)議功能的實現(xiàn),但是Redis的核心功能并沒有在這里面,而是在NewLife.Core里面。

這里可以打開看一下,NewLife.Core里面有一個NewLife.Caching的命名空間,里面有一個Redis類,里面實現(xiàn)了Redis的基本功能;另一個類是RedisClient是Redis的客戶端。

Redis的核心功能就是有這兩個類實現(xiàn),RedisClient代表著Redis客戶端對服務(wù)器的一個連接。Redis真正使用的時候有一個Redis連接池,里面存放著很多個RedisClient對象。

百億數(shù)據(jù)量下,掌握這些Redis技巧你大概就穩(wěn)住了全場

 

所以我們Redis的封裝有兩層,一層是NewLife.Core里面的Redis以及RedisClient;另一層就是NewLife.Redis。這里面的FullRedis是對Redis的實現(xiàn)了Redis的所有的高級功能。

這里你也可以認為NewLife.Redis是Redis的一個擴展。

二、Test實例講解Redis的基本使用

1、實例

打開Program.cs看下代碼:

 

 

 

 

這里XTrace.UseConsole();是向控制臺輸出日志,方便調(diào)試使用查看結(jié)果。

接下來看第一個例子Test1,具體的我都在代碼中進行了注釋,大家可以看下:

 

 

 

 

  • Set的時候,如果是字符串或者字符數(shù)據(jù)的話,Redis會直接保存起來(字符串內(nèi)部機制也是保存二進制),如果是其他類型,會默認進行json序列化然后再保存起來。
  • Get的時候,如果是字符串或者字符數(shù)據(jù)會直接獲取,如果是其他類型會進行json反序列化。
  • Set第三個參數(shù)過期時間單位是秒。
  • vs調(diào)試小技巧,按F5或者直接工具欄“啟動”會編譯整個解決方案會很慢(VS默認),可以選中項目然后右鍵菜單選擇調(diào)試->啟動新實例,會只編譯將會用到的項目,這樣對調(diào)試來說會快很多。
  • 大家運行調(diào)試后可以看到控制臺輸出的內(nèi)容:向右的箭頭=》是ic.Log=XTrace.Log輸出的日志。

 

 

 

 

  • 字典的使用:對象的話,需要把json全部取出來,然后轉(zhuǎn)換成對象,而字典的話,就可以直接取某個字段。
  • 隊列是List結(jié)構(gòu)實現(xiàn)的,上游數(shù)據(jù)太多,下游處理不過來的時候,就可以使用這個隊列。上游的數(shù)據(jù)發(fā)到隊列,然后下游慢慢的消費。另一個應(yīng)用,跨語言的協(xié)同工作,比方說其他語言實現(xiàn)的程序往隊列里面塞數(shù)據(jù),然后另一種語言來進行消費處理。這種方式類似MQ的概念,雖然有點low,但是也很好用。
  • 集合,用的比較多的是用在一個需要精確判斷的去重功能。像我們每天有三千萬訂單,這三千萬訂單可以有重復。這時候我想統(tǒng)計下一共有訂單,這時候直接數(shù)據(jù)庫group by是不大可能的,因為數(shù)據(jù)庫中分了十幾張表,這里分享個實戰(zhàn)經(jīng)驗:
  • 比方說攬收,商家發(fā)貨了,網(wǎng)點要把件收回來,但是收回來之前網(wǎng)點不知道自己有多少貨,這時候我們做了一個功能,也就是訂單會發(fā)送到我們公司來。我們會建一個time_site的key的集合,而且集合本身有去重的功能,而且我們可以很方便的通過set.Count功能來統(tǒng)計數(shù)量,當件被攬收以后,我們后臺把這個件從集合中Remove掉。然后這個Set中存在的就是網(wǎng)點還沒有攬收的件,這時候通過Count就會知道這個網(wǎng)點今天還有多少件沒有攬收。實際使用中這個數(shù)量比較大,因為有幾萬個網(wǎng)點。
  • Redis中布隆過濾器,去重的,面試的時候問的比較多。

小經(jīng)驗分享:

  • 數(shù)據(jù)庫中不合法的時間處理:判斷時間中的年份是否大于2000年,如果小于2000就認為不合法;習慣大于小于號不習慣用等于號,這樣可以處理很多意外的數(shù)據(jù);
  • Set的時候最好指定過期時間,防止有些需要刪除的數(shù)據(jù)我們忘記刪了;
  • Redis異步盡量不用,因為Redis延遲本身很小,大概在100us-200us,再一個就是Redis本身是單線程的,異步任務(wù)切換的耗時比網(wǎng)絡(luò)耗時還要大;
  • List用法:物聯(lián)網(wǎng)中數(shù)據(jù)上傳,量比較大時,我們可以把這些數(shù)據(jù)先放在Redis的List中,比如說一秒鐘1萬條,然后再批量取出來然后批量插入數(shù)據(jù)庫中。這時候要設(shè)置好key,可以前綴+時間,對已處理的List可以進行remove移除。

2、壓力測試

接下來看第四個例子,我們直接做壓力測試,代碼如下:

 

 

 

 

運行的結(jié)果如下圖所示:

 

 

 

 

測試就是進行g(shù)et,set remove,累加等的操作。大家可以看到在我本機上輕輕松松的到了六十萬,多線程的時候甚至到了一百多萬。

為什么會達到這么高的Ops呢?下面給大家說一下:

  • Bench會分根據(jù)線程數(shù)分多組進行添刪改壓力測試;
  • rand參數(shù),是否隨機產(chǎn)生key/value;
  • batch批大小,分批執(zhí)行讀寫操作,借助GetAll/SetAll進行優(yōu)化。

3、Redis中NB的函數(shù)來提升性能

上面的操作如果大家都掌握了就基本算Redis入門了,接下來進行進階。如果能全然吃透,差不多就會比別人更勝一籌了。

GetAll()與SetAll()

GetAll:比方說我要取十個key,這個時候可以用getall。這時候Redis就執(zhí)行了一次命令。比方說我要取10個key那么用get的話要取10次,如果用getall的話要用1次。1次getall時間大概是get的一點幾倍,但是10次get的話就是10倍的時間,這個賬你應(yīng)該會算吧?強烈推薦大家用getall。

setall跟getall相似,批量設(shè)置K-V。

setall與getall性能很恐怖,官方公布的Ops也就10萬左右,為什么我們的測試輕輕松松到五十萬甚至上百萬?因為我們就用了setall,getall。如果get,set兩次以上,建議用getall,setall。

Redis管道Pipeline

比如執(zhí)行10次命令會打包成一個包集體發(fā)過去執(zhí)行,這里實現(xiàn)的方式是StartPipeline()開始,StopPipeline()結(jié)束中間的代碼就會以管道的形式執(zhí)行。

這里推薦使用更強的武器,AutoPipeline自動管道屬性。管道操作到一定數(shù)量時,自動提交,默認0。使用了AutoPipeline,就不需要StartPipeline,StopPipeline指定管道的開始結(jié)束了。

Add與Replace

  • Add:Redis中沒有這個Key就添加,有了就不要添加,返回false;
  • Replace:有則替換,還會返回原來的值,沒有則不進行操作。

Add跟Replace就是實現(xiàn)Redis分布式鎖的關(guān)鍵。

三、Redis使用技巧,經(jīng)驗分享

在項目的Readme中,這里摘錄下:

1、特性

  • 在ZTO大數(shù)據(jù)實時計算廣泛應(yīng)用,200多個Redis實例穩(wěn)定工作一年多,每天處理近1億包裹數(shù)據(jù),日均調(diào)用量80億次;
  • 低延遲,Get/Set操作平均耗時200~600us(含往返網(wǎng)絡(luò)通信);
  • 大吞吐,自帶連接池,最大支持1000并發(fā);
  • 高性能,支持二進制序列化(默認用的json,json很低效,轉(zhuǎn)成二進制性能會提升很多)。

2、Redis經(jīng)驗分享

  • 在Linux上多實例部署,實例個數(shù)等于處理器個數(shù),各實例最大內(nèi)存直接為本機物理內(nèi)存,避免單個實例內(nèi)存撐爆(比方說8核心處理器,那么就部署8個實例)。
  • 把海量數(shù)據(jù)(10億+)根據(jù)key哈希(Crc16/Crc32)存放在多個實例上,讀寫性能成倍增長。
  • 采用二進制序列化,而非常見的Json序列化。
  • 合理設(shè)計每一對Key的Value大小,包括但不限于使用批量獲取,原則是讓每次網(wǎng)絡(luò)包控制在1.4k字節(jié)附近,減少通信次數(shù)(實際經(jīng)驗幾十k,幾百k也是沒問題的)。
  • Redis客戶端的Get/Set操作平均耗時200~600us(含往返網(wǎng)絡(luò)通信),以此為參考評估網(wǎng)絡(luò)環(huán)境和Redis客戶端組件(達不到就看一下網(wǎng)絡(luò),序列化方式等等)。
  • 使用管道Pipeline合并一批命令。
  • Redis的主要性能瓶頸是序列化、網(wǎng)絡(luò)帶寬和內(nèi)存大小,濫用時處理器也會達到瓶頸。
  • 其它可查優(yōu)化技巧。

以上經(jīng)驗,源自于300多個實例4T以上空間一年多穩(wěn)定工作的經(jīng)驗,并按照重要程度排了先后順序,可根據(jù)場景需要酌情采用。

3、緩存Redis的兄弟姐妹

Redis實現(xiàn)ICache接口,它的孿生兄弟MemoryCache,內(nèi)存緩存,千萬級吞吐率。

各應(yīng)用強烈建議使用ICache接口編碼設(shè)計,小數(shù)據(jù)時使用MemoryCache實現(xiàn);數(shù)據(jù)增大(10萬)以后,改用Redis實現(xiàn),不需要修改業(yè)務(wù)代碼。

四、關(guān)于一些疑問的回復

這一Part我們會來聊聊大數(shù)據(jù)中Redis使用的經(jīng)驗:

Q1:一條數(shù)據(jù)多個key怎么設(shè)置比較合理?

A1:如果對性能要求不是很高直接用json序列化實體就好,沒必要使用字典進行存儲。

Q2:隊列跟List有什么區(qū)別?左進右出的話用List還是用隊列比較好?

A2:隊列其實就是用List實現(xiàn)的,也是基于List封裝的。左進右出的話直接隊列就好。Redis的List結(jié)構(gòu)比較有意思,既可以左進右出,也能右進左出。所以它既可以實現(xiàn)列表結(jié)構(gòu),也能隊列,還能實現(xiàn)棧。

Q3:存放多個字段的類性能一樣嗎?

A3:大部分場景都不會有偏差,可能對于大公司數(shù)據(jù)量比較大的場景會有些偏差。

Q4:大數(shù)據(jù)寫入到數(shù)據(jù)庫之后,比如數(shù)據(jù)到億以上的時候,統(tǒng)計分析、查詢這塊,能不能分享些經(jīng)驗。

A4:分表分庫,拆分到一千萬以內(nèi)。

Q5:CPU為何暴漲?

A5:程序員終極理念——CPU達到百分百,然后性能達到最優(yōu),盡量不要浪費。最痛恨的是——如果CPU不到百分百,性能沒法提升了,說明代碼有問題。

√視頻地址

視頻已經(jīng)上傳至百度云,大家可以自行下載觀看。

鏈接:

https://pan.baidu.com/s/1sOW_PLjxQE8C2msbDfizeA

提取碼:c7dp

觀看指南(笑笑提供)

 

 


 

 

雖然Redis大家會用,但是我們可能平時不會有像這樣的大數(shù)據(jù)使用場景。希望本文能夠給大家一些值得借鑒的經(jīng)驗。 

責任編輯:龐桂玉 來源: DBAplus社群
相關(guān)推薦

2019-12-24 08:46:49

Redis技巧數(shù)據(jù)量

2019-01-08 11:57:10

Redis存儲數(shù)據(jù)結(jié)構(gòu)

2018-05-31 14:16:47

SQL ServerMySQL數(shù)據(jù)遷移

2020-05-22 13:59:13

SSD內(nèi)存DDR4

2018-04-10 14:36:18

數(shù)據(jù)庫MySQL優(yōu)化技巧

2019-09-09 14:13:31

電商數(shù)據(jù)分析指標

2022-11-04 13:06:47

JVMJava程序

2021-10-25 14:55:38

Linux技巧命令

2019-11-07 09:49:38

監(jiān)控優(yōu)化技巧

2017-07-19 16:34:44

筆記本拆解技巧

2019-11-20 10:38:36

路由路由協(xié)議路由器

2022-07-19 07:30:06

BigDecimal運算float

2012-12-26 09:23:56

數(shù)據(jù)庫優(yōu)化

2021-03-18 07:52:42

代碼性能技巧開發(fā)

2020-03-23 10:51:40

面試技巧技術(shù)

2020-03-08 16:58:51

Chrome瀏覽器代碼

2020-11-09 07:25:20

函數(shù) JavaScript數(shù)據(jù)

2022-12-19 08:30:51

ViteWebpack

2023-07-14 08:50:37

2020-10-28 11:20:55

vue項目技
點贊
收藏

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