在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Redis在大數據中的使用,Redis封裝架構講解

電子工程師 ? 來源:未知 ? 作者:李倩 ? 2018-11-16 09:21 ? 次閱讀

熱場準備

熟悉的開場白,大家晚上好啊,今天給大家分享的是Redis在大數據中的使用,可能真正講的是一些redis的使用技巧,Redis基本的一些東西。

首先給大家個地址,源碼以及實例都在里面,當然今天的分享也是按照里面的實例來進行的,大家可以先進行下載

http://git.newlifex.com/NewLife/NewLife.Redis

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

windows:

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

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

Linux

https://redis.io/download

開始

Redis封裝架構講解

實際上NewLife.Redis是一個完整的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的基本使用

實例

打開Program.cs看下代碼

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

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

staticvoidTest1(){varic=Redis.Create("127.0.0.1:6379",3);//創建Redis實例,得到FullRedis對象//varic=newFullRedis();//另一種實例化的方式//ic.Server="127.0.0.1:6379";//ic.Db=3;//Redis中數據庫ic.Log=XTrace.Log;//顯示日志,進行Redis操作把日志輸出,生產環境不用輸出日志//簡單操作Console.WriteLine("共有緩存對象{0}個",ic.Count);//緩存對象數量ic.Set("name","大石頭");//SetK-V結構,Set第二個參數可以是任何類型Console.WriteLine(ic.Get("name"));//Get泛型,指定獲取的類型ic.Set("time",DateTime.Now,1);//過期時間秒Console.WriteLine(ic.Get("time").ToFullString());Thread.Sleep(1100);Console.WriteLine(ic.Get("time").ToFullString());//列表varlist=ic.GetList("list");list.Add(DateTime.Now);list.Add(DateTime.Now.Date);list.RemoveAt(1);Console.WriteLine(list[list.Count-1].ToFullString());//字典vardic=ic.GetDictionary("dic");dic.Add("xxx",DateTime.Now);Console.WriteLine(dic["xxx"].ToFullString());//隊列varmq=ic.GetQueue("queue");mq.Add(new[]{"abc","g","e","m"});vararr=mq.Take(3);Console.WriteLine(arr.Join(","));//集合varset=ic.GetSet("181110_1234");set.Add("xx1");set.Add("xx2");set.Add("xx3");Console.WriteLine(set.Count);Console.WriteLine(set.Contains("xx2"));Console.WriteLine("共有緩存對象{0}個",ic.Count);}

1、Set的時候如果是字符串或者字符數據的話Redis會直接保存起來(字符串內部機制也是保存二進制),如果是其他類型會默認進行json序列化然后再保存起來

2、Get的時候如果是字符串或者字符數據會直接獲取,如果是其他類型會進行json反序列化

3、Set第三個參數過期時間單位是秒。

4、vs調試小技巧,按F5或者直接工具欄“啟動”會編譯整個解決方案會很慢(VS默認),可以選中項目然后右鍵菜單選擇調試->啟動新實例。會只編譯將會用到的項目,這樣對調試來說會快很多。

5、大家運行調試后可以看到控制臺輸出的內容:向右的箭頭=》是ic.Log=XTrace.Log輸出的日志

6、字典的使用:對象的話需要把json全部取出來然后轉換成對象,而字典的話就可以直接取某個字段。

7、隊列是List結構實現的,使用場景可以上游數據太多,下游處理不過來的時候,那么就可以使用這個隊列。上游的數據發到隊列,然后下游慢慢的消費。另一個應用,跨語言的協同工作,比方說其他語言實現的程序往隊列里面塞數據,然后另一種語言來進行消費處理。哈,這種方式類似mq的概念,雖然有點low,但是也很好用。

8、集合,用的比較多的是用在一個需要精確判斷的去重功能。像我們每天有三千萬訂單,這三千萬訂單可以有重復,這時候我想統計下一共有訂單,這時候直接數據庫group by是不大可能的,因為數據庫中分了十幾張表,這里分享個實戰經驗:比方說攬收,商家發貨了,網點要把件收回來,但是收回來之前網點不知道自己有多少貨啊,這時候我們做了一個功能,也就是訂單會發送到我們公司來,我們會建一個time_site的key的集合,而且集合本身有去重的功能,而且我們可以很方便的通過set.Count功能來統計數量,當件被攬收以后,我們后臺把這個件從集合中Remove掉.然后這個Set中存在的就是網點還沒有攬收的件,這時候通過Count就會知道這個網點今天還有多少件沒有攬收。實際使用中這個數量比較大,因為有幾萬個網點。

9、Redis中布隆過濾器,去重的,面試的時候問的比較多

10、小經驗分享:

數據庫中不合法的時間處理:判斷時間中的年份,是否大于2000年。如果小于2000就認為不合法。習慣大于小于號不習慣用等于號,這樣可以處理很多意外的數據

Set的時候最好指定過期時間防止有些需要刪除的數據,我們忘記刪了

Redis異步盡量不用,因為Redis延遲本身很小,大概在100us-200us,再一個就是Redis本身是單線程的,異步任務切換的耗時比網絡耗時還要大。List用法:物聯網中數據上傳,量比較大時,我們可以把這些數據先放在Redis的List中,比如說一秒鐘1萬條,然后再批量取出來然后批量插入數據庫中。這時候要設置好key,可以前綴+時間,對于已經處理的List可以進行remove移除。

壓力測試

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

staticvoidMain(String[]args){XTrace.UseConsole();//激活FullRedis,否則Redis.Create會得到默認的Redis對象FullRedis.Register();Test4();Console.ReadKey();}staticvoidTest4(){varic=Redis.Create("127.0.0.1:6379",5);//varic=newMemoryCache();ic.Bench();}

運行的結果如下圖所示:

測試就是進行get,set remove,累加等的操作。大家可以看到在我本機上輕輕松松的到了六十萬,多線程的時候甚至到了一百多萬。為什么會達到這么高的ops呢,下面給大家說一下。

Bench 會分根據線程數分多組進行添刪改壓力測試。

rand 參數,是否隨機產生key/value。

batch 批大小,分批執行讀寫操作,借助GetAll/SetAll進行優化。

Redis中NB的函數來提升性能

上面的操作如果大家都掌握的基本算Redis入門了,接下來進行進階。會了基本比別人更勝一籌了。

1、GetAll()與SetAll()

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

setall 跟getall相似。批量設置K-V.

setall與getall性能很恐怖,官方公布的ops也就10萬左右,為什么我們的測試輕輕松松到五十萬甚至上百萬,因為我們就用了setall,getall。

如果get,set兩次以上,建議用getall,setall

2、Redis管道Pipeline

比如執行10次命令會打包成一個包集體發過去執行,這里實現的方式是StartPipeline()開始,StopPipeline()結束中間的代碼就會以管道的形式執行。這里推薦使用我們的更強的武器,AutoPipeline自動管道屬性。管道操作到一定數量時,自動提交,默認0。使用了AutoPipeline,就不需要StartPipeline,StopPipeline指定管道的開始結束了!

3、Add與Replace

Add:Redis中沒有這個Key就添加,有了就不要添加,返回false

Replace:有則替換,還會返回原來的值,沒有則不進行操作

Add跟Replace就是實現Redis分布式鎖的關鍵

Redis使用技巧,經驗分享

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

特性

在ZTO大數據實時計算廣泛應用,200多個Redis實例穩定工作一年多,每天處理近1億包裹數據,日均調用量80億次

低延遲,Get/Set操作平均耗時200~600us(含往返網絡通信

大吞吐,自帶連接池,最大支持1000并發

高性能,支持二進制序列化(默認用的json,json很低效,轉成二進制性能會提升很多)

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以上空間一年多穩定工作的經驗,并按照重要程度排了先后順序,可根據場景需要酌情采用!

緩存Redis的兄弟姐妹

Redis實現ICache接口,它的孿生兄弟MemoryCache,內存緩存,千萬級吞吐率。各應用強烈建議使用ICache接口編碼設計,小數據時使用MemoryCache實現;數據增大(10萬)以后,改用Redis實現,不需要修改業務代碼。

提問環節聊聊大數據中Redis使用的經驗,問題

1、一條數據多個key怎么設置比較合理?

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

2、隊列跟List有什么區別?左進右出的話用List還是用隊列比較好?

隊列其實就是用List實現的,也是基于List封裝的。左進右出的話直接隊列就好。Redis的List結構比較有意思,既可以左進右出,也能右進左出。所以它既可以實現列表結構,也能隊列,也能實現棧

3、存放多個字段的類性能一樣嗎?

大部分場景都不會有偏差,可能對于大公司數據量比較大的場景會有些偏差

4、可否介紹一下使用Redis進行數據計算、統計的場景?

略。自己看視頻吧!o(∩_∩)o 哈哈!(因為我沒聽清!)

5、大數據寫入到數據庫之后 比如數據到億以上的時候 統計分析這塊 查詢這塊 能不能分享些經驗。

分表分庫,拆分到一千萬以內。

6、CPU為何暴漲?

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

視頻地址

視頻已經上傳至百度云,大家可以自行下載觀看鏈接:https://pan.baidu.com/s/1sOW_PLjxQE8C2msbDfizeA提取碼:c7dp觀看指南(笑笑提供)

總結

雖然Redis會用,但是沒有像大石頭這樣的大數據使用場景。今天的視頻收獲頗豐,可能大部分人跟我一樣,沒有大石頭的使用場景,但是值得借鑒的經驗還是很豐富的!期待下一次的精彩分享。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 封裝
    +關注

    關注

    127

    文章

    7998

    瀏覽量

    143422
  • 服務器
    +關注

    關注

    12

    文章

    9317

    瀏覽量

    86079
  • Redis
    +關注

    關注

    0

    文章

    378

    瀏覽量

    10950

原文標題:Redis 基本使用及百億數據量中的使用技巧

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何使用Rust連接Redis

    Redis是一款快速、開源、鍵值存儲數據庫,被廣泛應用于緩存、發布/訂閱系統、定時任務等場景。Rust提供了很多Redis的客戶端庫,本教程將會介紹如何使用Rust連接
    的頭像 發表于 09-19 16:22 ?2501次閱讀

    企業打開Redis的正確方式,來自阿里云云數據庫團隊的解讀

    數據庫。自2009年發布最初版本以來,Redis的熱度只增不減,除了經常位居DB-Engines的最受歡迎Key-Value數據庫榜首之外,也多家調查報告
    發表于 02-07 14:06

    Redis Stream應用案例

    互聯網服務作為Cache和KV存儲廣泛應用,Redis下一個大放異彩的領域也許就在物聯網。上面這個圖,就是一個典型的物聯網設備信息采集,分析,展示的架構Redis作為一個嵌入式的存
    發表于 06-26 17:15

    redis概述

    REmote DIctionary Server(Redis)是一個基于key-value鍵值對的持久化數據庫存儲系統。redis和大名鼎鼎的Memcached緩存服務軟件很像,但是redis
    發表于 07-17 07:38

    Spring bootRedis的使用

    【本人禿頂程序員】springboot專輯:Spring bootRedis的使用
    發表于 03-27 11:42

    如何使得redis數據不再有

    ,原因是redis的持久化功能導致的,所謂的持久化就是redis系統關閉的時候把數據存儲到硬盤,在下一次啟動的時候,在從硬盤恢復到
    發表于 11-05 08:50

    Redis Cluster的基本原理及實現細節

    ,越來越多的企業將Redis Cluster實際應用到線上業務,通過從社區獲取到反饋社區的迭代,為Redis Cluster成為一個可靠的企業級開源產品,簡化業務
    發表于 09-28 19:09 ?0次下載
    <b class='flag-5'>Redis</b> Cluster的基本原理及實現細節

    redis和mongodb數據庫對比_redis、memcache、mongoDB 對比

    本文是對redis和mongodb數據庫對比分析。以及redis、memcache、mongoDB 區別對比。MongoDB和Redis都是NoSQL,采用結構型
    發表于 02-07 08:45 ?4286次閱讀
    <b class='flag-5'>redis</b>和mongodb<b class='flag-5'>數據</b>庫對比_<b class='flag-5'>redis</b>、memcache、mongoDB 對比

    什么是 Redis

    的這種特殊性質讓它在開發人員很受歡迎。 Redis不是通過迭代或者排序方式處理數據,而是一開始就按照數據結構方式組織。早期,它的使用很像 Memcached,但隨著
    的頭像 發表于 05-22 15:32 ?1162次閱讀
    什么是 <b class='flag-5'>Redis</b>

    Redis的主從、哨兵、Redis Cluster集群

    + MyBatis Plus + Vue 另外一個就是保證 Redis服務不中斷 。 對于盡量減少數據丟失,可以通過AOF和RDB保證。 對于保證服務不中斷的話,Redis就不能單點部署,這時候我們先看下
    的頭像 發表于 06-12 14:58 ?888次閱讀
    <b class='flag-5'>Redis</b>的主從、哨兵、<b class='flag-5'>Redis</b> Cluster集群

    Redis架構演化之路

    這個架構非常簡單,你的業務應用可以把 Redis 當做緩存來使用,從 MySQL 查詢數據,然后寫入到 Redis
    的頭像 發表于 08-03 16:54 ?650次閱讀
    <b class='flag-5'>Redis</b><b class='flag-5'>架構</b>演化之路

    Redis數據清理策略

    本文整理 Redis數據清理策略所有代碼來自 Redis version :5.0, 不同版本的 Redis 策略可能有調整
    發表于 09-19 14:24 ?414次閱讀
    <b class='flag-5'>Redis</b> 的<b class='flag-5'>數據</b>清理策略

    Redis的使用

    Redis 作為內存的存儲中間件,已經是面試的面試題必問之一了,今天一起來看看 Redis 的事務吧。 事務提供了一種"將多個命令打包,一次性提交并按順序執行"的機制,提交后事務執行
    的頭像 發表于 10-08 15:27 ?506次閱讀
    <b class='flag-5'>Redis</b><b class='flag-5'>中</b>的使用

    redis容器內怎么查看redis日志

    redis是一款流行的開源內存數據庫,常用于緩存、消息隊列、任務管理等場景。使用redis時,了解如何查看redis日志對于排查問題、監控
    的頭像 發表于 12-05 10:10 ?3850次閱讀

    Redis開源版與Redis企業版,怎么選用?

    點擊“藍字”關注我們數以千計的企業和數以百萬計的開發人員Redis開源版來構建應用程序。但隨著用戶數量、數據量和地區性的增加,成本、可擴展性、運營和可用性等問題也隨之而來。Redis企業版
    的頭像 發表于 04-04 08:04 ?1193次閱讀
    <b class='flag-5'>Redis</b>開源版與<b class='flag-5'>Redis</b>企業版,怎么選用?
    主站蜘蛛池模板: 全免费一级毛片在线播放 | 朋友夫妇和交换性bd高清 | 亚洲a毛片 | 操女人免费视频 | 久久女人网 | 国产片无遮挡在线看床戏 | xxx亚洲日本| 久久这里只精品热在线8 | 天天干天天射天天操 | 韩国三级理论在线看中文字幕 | 人人揉揉香蕉大青草 | 视频一区二区三区在线观看 | 男人和女人做免费做爽爽视频 | 性欧美护士18xxxxhd视频 | 高清欧美性xxxx成熟 | 婷婷五月小说 | 色婷婷综合和线在线 | 成人欧美一区二区三区黑人免费 | 伊人天天操 | 日本在线一级 | 一级美女片 | 日日噜噜噜噜人人爽亚洲精品 | 久久美女免费视频 | 91三级视频 | 好深好爽视频 | 国产精品伦理一区二区三区 | 亚洲最大成人综合网 | 天天爱夜夜爱 | 欧美精品xx| 欧美三级免费观看 | 国产日韩欧美综合色视频在线 | 巨臀中文字幕一区二区翘臀 | 欧美黑人性xxx猛交 欧美黑人性受xxxx精品 | 开心色99×xxxx | 四虎影院观看视频在线观看 | 亚洲三级视频在线观看 | 韩国精品videosex性韩国 | 男人资源网 | 色.com| 久久老色鬼天天综合网观看 | 2021天天躁狠狠燥 |