Redis在大資料中必看的使用技巧
今天將會跟大家討論一些Redis在大資料中的使用,包括一些Redis的使用技巧和其他的一些內容。
一、Redis封裝架構講解
實際上NewLife.Redis是一個完整的Redis協議功能的實現,但是Redis的核心功能並沒有在這裡面,而是在NewLife.Core裡面。
這裡可以開啟看一下,NewLife.Core裡面有一個NewLife.Caching的名稱空間,裡面有一個Redis類,裡面實現了Redis的基本功能;另一個類是RedisClient是Redis的客戶端。
Redis的核心功能就是有這兩個類實現,RedisClient代表著Redis客戶端對伺服器的一個連線。Redis真正使用的時候有一個Redis連線池,裡面存放著很多個RedisClient物件。
所以我們Redis的封裝有兩層,一層是NewLife.Core裡面的Redis以及RedisClient;另一層就是NewLife.Redis。這裡面的FullRedis是對Redis的實現了Redis的所有的高階功能。
這裡你也可以認為NewLife.Redis是Redis的一個擴充套件。
二、Test例項講解Redis的基本使用
1、例項
開啟Program.cs看下程式碼:
這裡XTrace.UseConsole();是向控制檯輸出日誌,方便除錯使用檢視結果。
接下來看第一個例子Test1,具體的我都在程式碼中進行了註釋,大家可以看下:
Set的時候,如果是字串或者字元資料的話,Redis會直接儲存起來(字串內部機制也是儲存二進位制),如果是其他型別,會預設進行json序列化然後再儲存起來。
Get的時候,如果是字串或者字元資料會直接獲取,如果是其他型別會進行json反序列化。
Set第三個引數過期時間單位是秒。
vs除錯小技巧,按F5或者直接工具欄“啟動”會編譯整個解決方案會很慢(VS預設),可以選中專案然後右鍵選單選擇除錯->啟動新例項,會只編譯將會用到的專案,這樣對除錯來說會快很多。
大家執行除錯後可以看到控制檯輸出的內容:向右的箭頭=》是ic.Log=XTrace.Log輸出的日誌。
字典的使用:物件的話,需要把json全部取出來,然後轉換成物件,而字典的話,就可以直接取某個欄位。
佇列是List結構實現的,上游資料太多,下游處理不過來的時候,就可以使用這個佇列。上游的資料發到佇列,然後下游慢慢的消費。另一個應用,跨語言的協同工作,比方說其他語言實現的程式往佇列裡面塞資料,然後另一種語言來進行消費處理。這種方式類似MQ的概念,雖然有點low,但是也很好用。
集合,用的比較多的是用在一個需要精確判斷的去重功能。像我們每天有三千萬訂單,這三千萬訂單可以有重複。這時候我想統計下一共有訂單,這時候直接資料庫group by是不大可能的,因為資料庫中分了十幾張表,這裡分享個實戰經驗:
比方說攬收,商家發貨了,網點要把件收回來,但是收回來之前網點不知道自己有多少貨,這時候我們做了一個功能,也就是訂單會傳送到我們公司來。我們會建一個time_site的key的集合,而且集合本身有去重的功能,而且我們可以很方便的通過set.Count功能來統計數量,當件被攬收以後,我們後臺把這個件從集合中Remove掉。然後這個Set中存在的就是網點還沒有攬收的件,這時候通過Count就會知道這個網點今天還有多少件沒有攬收。實際使用中這個數量比較大,因為有幾萬個網點。
Redis中布隆過濾器,去重的,面試的時候問的比較多。
小經驗分享:
資料庫中不合法的時間處理:判斷時間中的年份是否大於2000年,如果小於2000就認為不合法;習慣大於小於號不習慣用等於號,這樣可以處理很多意外的資料;
Set的時候最好指定過期時間,防止有些需要刪除的資料我們忘記刪了;
Redis非同步儘量不用,因為Redis延遲本身很小,大概在100us-200us,再一個就是Redis本身是單執行緒的,非同步任務切換的耗時比網路耗時還要大;
List用法:物聯網中資料上傳,量比較大時,我們可以把這些資料先放在Redis的List中,比如說一秒鐘1萬條,然後再批量取出來然後批量插入資料庫中。這時候要設定好key,可以字首+時間,對已處理的List可以進行remove移除。
2、壓力測試
接下來看第四個例子,我們直接做壓力測試,程式碼如下:
執行的結果如下圖所示:
測試就是進行get,set remove,累加等的操作。大家可以看到在我本機上輕輕鬆鬆的到了六十萬,多執行緒的時候甚至到了一百多萬。
為什麼會達到這麼高的Ops呢?下面給大家說一下:
Bench會分根據執行緒數分多組進行添刪改壓力測試;
rand引數,是否隨機產生key/value;
batch批大小,分批執行讀寫操作,藉助GetAll/SetAll進行優化。
3、Redis中NB的函式來提升效能
上面的操作如果大家都掌握了就基本算Redis入門了,接下來進行進階。如果能全然吃透,差不多就會比別人更勝一籌了。
GetAll()與SetAll()
GetAll:比方說我要取十個key,這個時候可以用getall。這時候Redis就執行了一次命令。比方說我要取10個key那麼用get的話要取10次,如果用getall的話要用1次。1次getall時間大概是get的一點幾倍,但是10次get的話就是10倍的時間,這個賬你應該會算吧?強烈推薦大家用getall。
setall跟getall相似,批量設定K-V。
setall與getall效能很恐怖,官方公佈的Ops也就10萬左右,為什麼我們的測試輕輕鬆鬆到五十萬甚至上百萬?因為我們就用了setall,getall。如果get,set兩次以上,建議用getall,setall。
Redis管道Pipeline
比如執行10次命令會打包成一個包集體發過去執行,這裡實現的方式是StartPipeline()開始,StopPipeline()結束中間的程式碼就會以管道的形式執行。
這裡推薦使用更強的武器,AutoPipeline自動管道屬性。管道操作到一定數量時,自動提交,預設0。使用了AutoPipeline,就不需要StartPipeline,StopPipeline指定管道的開始結束了。
Add與Replace
Add:Redis中沒有這個Key就新增,有了就不要新增,返回false;
Replace:有則替換,還會返回原來的值,沒有則不進行操作。
Add跟Replace就是實現Redis分散式鎖的關鍵。
三、Redis使用技巧,經驗分享在專案的Readme中,這裡摘錄下:
1、特性
在ZTO大資料實時計算廣泛應用,200多個Redis例項穩定工作一年多,每天處理近1億包裹資料,日均呼叫量80億次;
低延遲,Get/Set操作平均耗時200~600us(含往返網路通訊);
大吞吐,自帶連線池,最大支援1000併發;
高效能,支援二進位制序列化(預設用的json,json很低效,轉成二進位制效能會提升很多)。
2、Redis經驗分享
在Linux上多例項部署,例項個數等於處理器個數,各例項最大記憶體直接為本機實體記憶體,避免單個例項記憶體撐爆(比方說8核心處理器,那麼就部署8個例項)。
把海量資料(10億+)根據key雜湊(Crc16/Crc32)存放在多個例項上,讀寫效能成倍增長。
採用二進位制序列化,而非常見的Json序列化。
合理設計每一對Key的Value大小,包括但不限於使用批量獲取,原則是讓每次網路包控制在1.4k位元組附近,減少通訊次數(實際經驗幾十k,幾百k也是沒問題的)。
Redis客戶端的Get/Set操作平均耗時200~600us(含往返網路通訊),以此為參考評估網路環境和Redis客戶端元件(達不到就看一下網路,序列化方式等等)。
使用管道Pipeline合併一批命令。
Redis的主要效能瓶頸是序列化、網路頻寬和記憶體大小,濫用時處理器也會達到瓶頸。
其它可查優化技巧。
以上經驗,源自於300多個例項4T以上空間一年多穩定工作的經驗,並按照重要程度排了先後順序,可根據場景需要酌情采用。
3、快取Redis的兄弟姐妹Redis實現ICache介面,它的孿生兄弟MemoryCache,記憶體快取,千萬級吞吐率。各應用強烈建議使用ICache介面編碼設計,小資料時使用MemoryCache實現;資料增大(10萬)以後,改用Redis實現,不需要修改業務程式碼。
Java高階部落共享Java行業資訊,分享公司內部核心乾貨,中高Java開發級技術,關注我一起探索Java程式設計架構之路。
相關文章
- Apache Hudi在醫療大資料中的應用Apache大資料
- 乾貨技巧|關於Redis的16個使用技巧Redis
- 必看的職場辦公技巧
- 資料中臺即服務——資料中臺的四大支柱
- 必看的資料庫使用規範資料庫
- Elasticsearch在物流資料中心的應用Elasticsearch
- 資料分析實際案例之:pandas在餐廳評分資料中的使用
- Mac新手進階必看:大神都在用的5個Mac高效使用技巧Mac
- Redis在.net中的使用(5)Redis持久化Redis持久化
- Redis在.net中的使用(2).net專案中的Redis使用Redis
- 必看!.NET 7 在網路領域的四大更新
- 資料分析實際案例之:pandas在泰坦尼特號乘客資料中的使用
- 在Hadoop環境中,大資料儲存的技巧有哪些?Hadoop大資料
- Redis在.net中的使用(6)Redis併發鎖Redis
- 阿里大規模資料中心的效能分析阿里
- 在江城,“懂行”的華為大資料中心釋放數字經濟之美大資料
- 在SpringBoot中使用Redis的zset統計線上使用者資訊Spring BootRedis
- Redis在.net中的使用(1)下載安裝RedisRedis
- Random 函式在批次造資料中的運用random函式
- Redis在.net中的使用(4)常見的集中資料結構Redis資料結構
- 大資料中一些元件的來源大資料元件
- 在 Spring Boot 中使用 RedisSpring BootRedis
- 使用者資料中的倖存者偏差
- 資料中心代理的常見使用場景
- Redis在.net中的使用(7)redis部署為Windows服務RedisWindows
- Redis在遊戲業務中的使用Redis遊戲
- Redis的安裝及在Java中的使用RedisJava
- 大資料經典學習路線,必看!!大資料
- 六西格瑪在廣州IT資料中心的作用
- 在 Linux中find命令使用技巧Linux
- 在 Lua 中使用引數技巧
- 關於逗號( , )在JS中的使用技巧JS
- 新手建站必看的十大忠告
- 資料中心管理有三大難題
- IDC關於資料中心的十大預測
- 大廠的供應鏈域資料中臺設計
- 你應該知道的6大資料中心趨勢大資料
- 大資料中的Java虛擬機器最佳化大資料Java虛擬機