-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 排行榜 > 專題列表 > 正文
redis排行榜(redis排行榜用什么數(shù)據(jù)類型)
大家好!今天讓小編來大家介紹下關(guān)于redis排行榜的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,相關(guān)業(yè)務(wù)請撥打電話:175-8598-2043,或添加微信:1454722008
文章目錄列表:
一、Redis在企業(yè)中都做什么用,用大白話講,說明白了就行
Redis是由意大利人Salvatore Sanfilippo(網(wǎng)名:antirez)開發(fā)的一款內(nèi)存高速緩存數(shù)據(jù)庫。Redis全稱為:Remote Dictionary Server(遠(yuǎn)程數(shù)據(jù)服務(wù)),該軟件使用C語言編寫,Redis是一個key-value存儲系統(tǒng),它支持豐富的數(shù)據(jù)類型,如:string、list、set、zset(sorted set)、hash。眾多語言都支持Redis,因為Redis交換數(shù)據(jù)快,所以在服務(wù)器中常用來存儲一些需要頻繁調(diào)取的數(shù)據(jù),這樣可以大大節(jié)省系統(tǒng)直接讀取磁盤來獲得數(shù)據(jù)的I/O開銷,更重要的是可以極大提升速度
拿大型網(wǎng)站來舉個例子,比如a網(wǎng)站首頁一天有100萬人訪問,其中有一個板塊為推薦新聞。要是直接從數(shù)據(jù)庫查詢,那么一天就要多消耗100萬次數(shù)據(jù)庫請求。上面已經(jīng)說過,Redis支持豐富的數(shù)據(jù)類型,所以這完全可以用Redis來完成,將這種熱點數(shù)據(jù)存到Redis(內(nèi)存)中,要用的時候,直接從內(nèi)存取,極大的提高了速度和節(jié)約了服務(wù)器的開銷。
二、Redis --- 八種數(shù)據(jù)類型(基本命令)
String、Hash、List、Set和Zset。
等同于java中的, Map<String,String> string 是redis里面的最基本的數(shù)據(jù)類型,一個key對應(yīng)一個value。
應(yīng)用場景 :String是最常用的一種數(shù)據(jù)類型,普通的key/value存儲都可以歸為此類,如用戶信息,登錄信息和配置信息等;
實現(xiàn)方式 :String在redis內(nèi)部存儲默認(rèn)就是一個字符串,被redisObject所引用,當(dāng)遇到incr、decr等操作(自增自減等原子操作)時會轉(zhuǎn)成數(shù)值型進(jìn)行計算,此時redisObject的encoding字段為int。
Redis雖然是用C語言寫的,但卻沒有直接用C語言的字符串,而是自己實現(xiàn)了一套字符串。目的就是為了提升速度,提升性能。 Redis構(gòu)建了一個叫做簡單動態(tài)字符串(Simple Dynamic String),簡稱SDS。
Redis的字符串也會遵守C語言的字符串的實現(xiàn)規(guī)則,即 最后一個字符為空字符。然而這個空字符不會被計算在len里頭。
Redis動態(tài)擴展步驟:
Redis字符串的性能優(yōu)勢
常用命令 :set/get/decr/incr/mget等,具體如下;
ps:計數(shù)器(字符串的內(nèi)容為整數(shù)的時候可以使用),如 set number 1。
補充:
等同于java中的: Map<String,Map<String,String>> ,redis的hash是一個string類型的field和value的映射表, 特別適合存儲對象。 在redis中,hash因為是一個集合,所以有兩層。第一層是key:hash集合value,第二層是hashkey:string value。所以判斷是否采用hash的時候可以參照有兩層key的設(shè)計來做參考。并且注意的是, 設(shè)置過期時間只能在第一層的key上面設(shè)置。
應(yīng)用場景 :我們要存儲一個用戶信息對象數(shù)據(jù),其中包括用戶ID、用戶姓名、年齡和生日,通過用戶ID我們希望獲取該用戶的姓名或者年齡或者生日;
實現(xiàn)方式 :Redis的Hash實際是內(nèi)部存儲的Value為一個HashMap,并提供了直接存取這個Map成員的接口。如,Key是用戶ID, value是一個Map。 這個Map的key是成員的屬性名,value是屬性值 。這樣對數(shù)據(jù)的修改和存取都可以直接通過其內(nèi)部Map的Key(Redis里稱內(nèi)部Map的key為field), 也就是通過 key(用戶ID) + field(屬性標(biāo)簽) 就可以操作對應(yīng)屬性數(shù)據(jù)。 當(dāng)前HashMap的實現(xiàn)有兩種方式 :當(dāng)HashMap的成員比較少時Redis為了節(jié)省內(nèi)存會采用類似一維數(shù)組的方式來緊湊存儲,而不會采用真正的HashMap結(jié)構(gòu),這時對應(yīng)的value的redisObject的encoding為zipmap,當(dāng)成員數(shù)量增大時會自動轉(zhuǎn)成真正的HashMap,此時redisObject的encoding字段為int。
常用命令 :hget/hset/hgetall等,具體如下:
等同于java中的 Map<String,List<String>> ,list 底層是一個鏈表,在redis中,插入list中的值,只需要找到list的key即可,而不需要像hash一樣插入兩層的key。 list是一種有序的、可重復(fù)的集合。
應(yīng)用場景 :Redis list的應(yīng)用場景非常多,也是Redis最重要的數(shù)據(jù)結(jié)構(gòu)之一,比如twitter的關(guān)注列表,粉絲列表等都可以用Redis的list結(jié)構(gòu)來實現(xiàn);
實現(xiàn)方式 :Redis list的實現(xiàn)為一個 雙向鏈表 ,即可以支持反向查找和遍歷,更方便操作,不過帶來了部分額外的內(nèi)存開銷,Redis內(nèi)部的很多實現(xiàn),包括 發(fā)送緩沖隊列 等也都是用的這個數(shù)據(jù)結(jié)構(gòu)。
常用命令 :lpush/rpush/lpop/rpop/lrange等,具體如下:
性能總結(jié) :
它是一個字符串鏈表,left、right都可以插入添加。
等同于java中的 Map<String,Set<String>> ,Set 是一種無序的,不能重復(fù)的集合。并且在redis中,只有一個key它的底層由hashTable實現(xiàn)的,天生去重。
應(yīng)用場景 :Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在于set是可以自動去重的,當(dāng)你需要存儲一個列表數(shù)據(jù),又不希望出現(xiàn)重復(fù)數(shù)據(jù)時,set是一個很好的選擇,并且 set提供了判斷某個成員是否在一個set集合內(nèi)的重要接口 ,這個也是list所不能提供的;如保存一些標(biāo)簽的名字。標(biāo)簽的名字不可以重復(fù),順序是可以無序的。
實現(xiàn)方式 :set 的內(nèi)部實現(xiàn)是一個 value永遠(yuǎn)為null的HashMap,實際就是通過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內(nèi)的原因。
常用命令 :sadd/spop/smembers/sunion等,具體如下:
ZSet(Sorted Set:有序集合) 每個元素都會關(guān)聯(lián)一個double類型的分?jǐn)?shù)score,分?jǐn)?shù)允許重復(fù),集合元素按照score排序( 當(dāng)score相同的時候,會按照被插入的鍵的字典順序進(jìn)行排序 ),還可以通過 score 的范圍來獲取元素的列表。
應(yīng)用場景 :Redis sorted set的使用場景與set類似,區(qū)別是set不是自動有序的,而sorted set可以 通過用戶額外提供一個優(yōu)先級(score)的參數(shù)來為成員排序,并且是插入有序的,即自動排序。 當(dāng)你需要一個有序的并且不重復(fù)的集合列表,那么可以選擇sorted set數(shù)據(jù)結(jié)構(gòu),比如twitter 的public timeline可以以發(fā)表時間作為score來存儲,這樣獲取時就是自動按時間排好序的。
底層實現(xiàn) : zset 是 Redis 提供的一個非常特別的數(shù)據(jù)結(jié)構(gòu),常用作排行榜等功能,以用戶 id 為 value ,關(guān)注時間或者分?jǐn)?shù)作為 score 進(jìn)行排序。實現(xiàn)機制分別是 zipList 和 skipList 。規(guī)則如下:
zipList:滿足以下兩個條件
skipList:不滿足以上兩個條件時使用跳表、組合了hash和skipList
為什么用skiplist不用平衡樹?
主要從內(nèi)存占用、對范圍查找的支持和實現(xiàn)難易程度這三方面總結(jié)的原因。
拓展:mysql為什么不用跳表?
常用命令 :zadd/zrange/zrem/zcard等;
官網(wǎng)地址: https://redis.io/commands/geoadd
可以用來推算兩地之間的距離,方圓半徑內(nèi)的人。
關(guān)于經(jīng)度緯度的限制: https://www.redis.net.cn/order/3685.html
一般我們使用Hyperloglog做基數(shù)統(tǒng)計。
什么是基數(shù)?就是一個集合中不重復(fù)的數(shù)的個數(shù)。
集合A:{1,3,5,7,9,7}
集合B:{1,3,5,7,9}
AB集合的基數(shù)都是5
應(yīng)用:統(tǒng)計網(wǎng)站的訪問量(一個人訪問網(wǎng)站很多次仍然算作一次)。
優(yōu)點:占用的內(nèi)存是固定的,找2^64次方個數(shù)的基數(shù),只需要12KB內(nèi)存。
缺點:有0.81%的錯誤率,可以忽略不計
概述: bitmap 存儲的是連續(xù)的二進(jìn)制數(shù)字(0 和 1),通過 bitmap, 只需要一個 bit 位來表示某個元素對應(yīng)的值或者狀態(tài),key 就是對應(yīng)元素本身 。 我們知道 8 個 bit 可以組成一個 byte,所以 bitmap 本身會極大的節(jié)省儲存空間。
應(yīng)用場景: 適合需要保存狀態(tài)信息(比如是否簽到、是否登錄...)并需要進(jìn)一步對這些信息進(jìn)行分析的場景。比如用戶簽到情況、活躍用戶情況、用戶行為統(tǒng)計(比如是否點贊過某個視頻)。
針對上面提到的一些場景,這里進(jìn)行進(jìn)一步說明。
使用場景一:用戶行為分析 很多網(wǎng)站為了分析你的喜好,需要研究你點贊過的內(nèi)容。
使用場景二:統(tǒng)計活躍用戶
使用時間作為 key,然后用戶 ID 為 offset,如果當(dāng)日活躍過就設(shè)置為 1
那么我該如果計算某幾天/月/年的活躍用戶呢(暫且約定,統(tǒng)計時間內(nèi)只有有一天在線就稱為活躍),有請下一個 redis 的命令
使用場景三:用戶在線狀態(tài)
對于獲取或者統(tǒng)計用戶在線狀態(tài),使用 bitmap 是一個節(jié)約空間效率又高的一種方法。
只需要一個 key,然后用戶 ID 為 offset,如果在線就設(shè)置為 1,不在線就設(shè)置為 0。
補充 :
巨人的肩膀:
https://www.cnblogs.com/Small-sunshine/p/11687809.html
https://mp.weixin.qq.com/s/CMu7oXVIKp2s-PXTdMlimA
三、redis面試之?dāng)?shù)據(jù)結(jié)構(gòu)
redis是面試中最常問的中間件,關(guān)于數(shù)據(jù)結(jié)構(gòu)主要集中在列舉和用法。下面我們就數(shù)據(jù)結(jié)構(gòu)和主要的使用方式做一個描述。
大家都知道redis的幾種數(shù)據(jù)結(jié)構(gòu),包括string (字符串),hash(哈希),list(列表),set(集合),zset(有序集合)。下面我們來列舉一下關(guān)于這幾種結(jié)構(gòu)的常用命令和一些使用場景。
string是redis的最基本的數(shù)據(jù)類型。
string類型是二進(jìn)制安全的,也就是說string里可以包含任何的數(shù)據(jù)類型。
string類型的值最大能存儲512MB
1、 普通的單值緩存
2、對象數(shù)據(jù)緩存(json格式)
3、分布式鎖的應(yīng)用
4、計數(shù)器的使用,使用INCR和DECR
redis hash 是一個string類型的field(字段)和value(值)的映射表,很適合存儲對象。
hash最適合的就是做對象緩存
list是redis的字符串列表,可以選擇將值插入到頭部或尾部。
1、 可以利用list的頭部尾部增刪屬性實現(xiàn)棧和隊列
2、 可以用來實現(xiàn)時間軸模型,根據(jù)時間依次插入數(shù)據(jù),使用LPUSH插入和LRANGE獲取最近范圍的數(shù)據(jù)
set是redis的無序集合,是通過哈希表實現(xiàn)的,因此任何操作(添加、刪除和測試成員的存在性等)的時間復(fù)雜度是O(1)。(無論集合中包含多少元素,時間都是常量)
1、 可以根據(jù)set集合的不可重復(fù)的特性,統(tǒng)計一些像網(wǎng)站訪問IP啊,訪問用戶啊這些信息,無論訪問多少次,SADD加入的都只有一條。
2、 也可以使用SRANDMEMBER和SPOP獲取數(shù)據(jù)的隨機性 ,做一些抽獎的小程序等隨機功能
3、 作為集合,可以利用交并運算等計算一些復(fù)雜的邏輯關(guān)系,比如說人物關(guān)系之間的網(wǎng)絡(luò)關(guān)系。
ZSet和set類似,都是字符串的非重復(fù)集合。不同之處在于,ZSet的每個成員都與分?jǐn)?shù)相關(guān),分?jǐn)?shù)是用來進(jìn)行排序的。然后可以使用分?jǐn)?shù)來取一個范圍內(nèi)的數(shù)
應(yīng)用場景:
ZSet是有序的集合,可以使用它來做一個排行榜。
四、tcp游戲服務(wù)器需要redis嗎?
需要。
用Redis解決游戲的跨服排行榜的痛點,使用Redis可以讓排行榜數(shù)據(jù)更及時,且更新時不會發(fā)生沖突,并且Redis并不只具備存儲數(shù)據(jù)和讀取數(shù)據(jù)的能力,還有一個發(fā)布訂閱的功能。
現(xiàn)在也有很多游戲直接用Redis持久化做DB。好處是開發(fā)簡單,方便。缺點就是云Redis成本高,擴容,縮服不方便,自己搭運維成本高,風(fēng)險也較高。
以上就是小編對于redis排行榜問題和相關(guān)問題的解答了,如有疑問,可撥打網(wǎng)站上的電話,或添加微信。
推薦閱讀:
建站都要裝wordpress(用wordpress建站的好處)
rectangle怎么讀發(fā)音(rectangle怎么發(fā)音怎么讀)