HOME 首頁(yè)
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營(yíng)
CASE 服務(wù)案例
NEWS 熱點(diǎn)資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專(zhuān)注品牌策劃15年

    redis排行榜(redis排行榜用什么數(shù)據(jù)類(lèi)型)

    發(fā)布時(shí)間:2023-03-23 06:43:57     稿源: 創(chuàng)意嶺    閱讀: 105        問(wèn)大家

    大家好!今天讓小編來(lái)大家介紹下關(guān)于redis排行榜的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。

    創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶(hù)遍布全球各地,相關(guān)業(yè)務(wù)請(qǐng)撥打電話(huà):175-8598-2043,或添加微信:1454722008

    文章目錄列表:

    redis排行榜(redis排行榜用什么數(shù)據(jù)類(lèi)型)

    一、Redis在企業(yè)中都做什么用,用大白話(huà)講,說(shuō)明白了就行

    Redis是由意大利人Salvatore Sanfilippo(網(wǎng)名:antirez)開(kāi)發(fā)的一款內(nèi)存高速緩存數(shù)據(jù)庫(kù)。Redis全稱(chēng)為:Remote Dictionary Server(遠(yuǎn)程數(shù)據(jù)服務(wù)),該軟件使用C語(yǔ)言編寫(xiě),Redis是一個(gè)key-value存儲(chǔ)系統(tǒng),它支持豐富的數(shù)據(jù)類(lèi)型,如:string、list、set、zset(sorted set)、hash。眾多語(yǔ)言都支持Redis,因?yàn)镽edis交換數(shù)據(jù)快,所以在服務(wù)器中常用來(lái)存儲(chǔ)一些需要頻繁調(diào)取的數(shù)據(jù),這樣可以大大節(jié)省系統(tǒng)直接讀取磁盤(pán)來(lái)獲得數(shù)據(jù)的I/O開(kāi)銷(xiāo),更重要的是可以極大提升速度

    拿大型網(wǎng)站來(lái)舉個(gè)例子,比如a網(wǎng)站首頁(yè)一天有100萬(wàn)人訪問(wèn),其中有一個(gè)板塊為推薦新聞。要是直接從數(shù)據(jù)庫(kù)查詢(xún),那么一天就要多消耗100萬(wàn)次數(shù)據(jù)庫(kù)請(qǐng)求。上面已經(jīng)說(shuō)過(guò),Redis支持豐富的數(shù)據(jù)類(lèi)型,所以這完全可以用Redis來(lái)完成,將這種熱點(diǎn)數(shù)據(jù)存到Redis(內(nèi)存)中,要用的時(shí)候,直接從內(nèi)存取,極大的提高了速度和節(jié)約了服務(wù)器的開(kāi)銷(xiāo)。

    二、Redis --- 八種數(shù)據(jù)類(lèi)型(基本命令)

    String、Hash、List、Set和Zset。

    等同于java中的, Map<String,String> string 是redis里面的最基本的數(shù)據(jù)類(lèi)型,一個(gè)key對(duì)應(yīng)一個(gè)value。

    應(yīng)用場(chǎng)景 :String是最常用的一種數(shù)據(jù)類(lèi)型,普通的key/value存儲(chǔ)都可以歸為此類(lèi),如用戶(hù)信息,登錄信息和配置信息等;

    實(shí)現(xiàn)方式 :String在redis內(nèi)部存儲(chǔ)默認(rèn)就是一個(gè)字符串,被redisObject所引用,當(dāng)遇到incr、decr等操作(自增自減等原子操作)時(shí)會(huì)轉(zhuǎn)成數(shù)值型進(jìn)行計(jì)算,此時(shí)redisObject的encoding字段為int。

    Redis雖然是用C語(yǔ)言寫(xiě)的,但卻沒(méi)有直接用C語(yǔ)言的字符串,而是自己實(shí)現(xiàn)了一套字符串。目的就是為了提升速度,提升性能。 Redis構(gòu)建了一個(gè)叫做簡(jiǎn)單動(dòng)態(tài)字符串(Simple Dynamic String),簡(jiǎn)稱(chēng)SDS。

    Redis的字符串也會(huì)遵守C語(yǔ)言的字符串的實(shí)現(xiàn)規(guī)則,即 最后一個(gè)字符為空字符。然而這個(gè)空字符不會(huì)被計(jì)算在len里頭。

    Redis動(dòng)態(tài)擴(kuò)展步驟:

    Redis字符串的性能優(yōu)勢(shì)

    常用命令 :set/get/decr/incr/mget等,具體如下;

    ps:計(jì)數(shù)器(字符串的內(nèi)容為整數(shù)的時(shí)候可以使用),如 set number 1。

    補(bǔ)充:

    等同于java中的: Map<String,Map<String,String>> ,redis的hash是一個(gè)string類(lèi)型的field和value的映射表, 特別適合存儲(chǔ)對(duì)象。 在redis中,hash因?yàn)槭且粋€(gè)集合,所以有兩層。第一層是key:hash集合value,第二層是hashkey:string value。所以判斷是否采用hash的時(shí)候可以參照有兩層key的設(shè)計(jì)來(lái)做參考。并且注意的是, 設(shè)置過(guò)期時(shí)間只能在第一層的key上面設(shè)置。

    應(yīng)用場(chǎng)景 :我們要存儲(chǔ)一個(gè)用戶(hù)信息對(duì)象數(shù)據(jù),其中包括用戶(hù)ID、用戶(hù)姓名、年齡和生日,通過(guò)用戶(hù)ID我們希望獲取該用戶(hù)的姓名或者年齡或者生日;

    實(shí)現(xiàn)方式 :Redis的Hash實(shí)際是內(nèi)部存儲(chǔ)的Value為一個(gè)HashMap,并提供了直接存取這個(gè)Map成員的接口。如,Key是用戶(hù)ID, value是一個(gè)Map。 這個(gè)Map的key是成員的屬性名,value是屬性值 。這樣對(duì)數(shù)據(jù)的修改和存取都可以直接通過(guò)其內(nèi)部Map的Key(Redis里稱(chēng)內(nèi)部Map的key為field), 也就是通過(guò) key(用戶(hù)ID) + field(屬性標(biāo)簽) 就可以操作對(duì)應(yīng)屬性數(shù)據(jù)。 當(dāng)前HashMap的實(shí)現(xiàn)有兩種方式 :當(dāng)HashMap的成員比較少時(shí)Redis為了節(jié)省內(nèi)存會(huì)采用類(lèi)似一維數(shù)組的方式來(lái)緊湊存儲(chǔ),而不會(huì)采用真正的HashMap結(jié)構(gòu),這時(shí)對(duì)應(yīng)的value的redisObject的encoding為zipmap,當(dāng)成員數(shù)量增大時(shí)會(huì)自動(dòng)轉(zhuǎn)成真正的HashMap,此時(shí)redisObject的encoding字段為int。

    常用命令 :hget/hset/hgetall等,具體如下:

    等同于java中的 Map<String,List<String>> ,list 底層是一個(gè)鏈表,在redis中,插入list中的值,只需要找到list的key即可,而不需要像hash一樣插入兩層的key。 list是一種有序的、可重復(fù)的集合。

    應(yīng)用場(chǎng)景 :Redis list的應(yīng)用場(chǎng)景非常多,也是Redis最重要的數(shù)據(jù)結(jié)構(gòu)之一,比如twitter的關(guān)注列表,粉絲列表等都可以用Redis的list結(jié)構(gòu)來(lái)實(shí)現(xiàn);

    實(shí)現(xiàn)方式 :Redis list的實(shí)現(xiàn)為一個(gè) 雙向鏈表 ,即可以支持反向查找和遍歷,更方便操作,不過(guò)帶來(lái)了部分額外的內(nèi)存開(kāi)銷(xiāo),Redis內(nèi)部的很多實(shí)現(xiàn),包括 發(fā)送緩沖隊(duì)列 等也都是用的這個(gè)數(shù)據(jù)結(jié)構(gòu)。

    常用命令 :lpush/rpush/lpop/rpop/lrange等,具體如下:

    性能總結(jié) :

    它是一個(gè)字符串鏈表,left、right都可以插入添加。

    等同于java中的 Map<String,Set<String>> ,Set 是一種無(wú)序的,不能重復(fù)的集合。并且在redis中,只有一個(gè)key它的底層由hashTable實(shí)現(xiàn)的,天生去重。

    應(yīng)用場(chǎng)景 :Redis set對(duì)外提供的功能與list類(lèi)似是一個(gè)列表的功能,特殊之處在于set是可以自動(dòng)去重的,當(dāng)你需要存儲(chǔ)一個(gè)列表數(shù)據(jù),又不希望出現(xiàn)重復(fù)數(shù)據(jù)時(shí),set是一個(gè)很好的選擇,并且 set提供了判斷某個(gè)成員是否在一個(gè)set集合內(nèi)的重要接口 ,這個(gè)也是list所不能提供的;如保存一些標(biāo)簽的名字。標(biāo)簽的名字不可以重復(fù),順序是可以無(wú)序的。

    實(shí)現(xiàn)方式 :set 的內(nèi)部實(shí)現(xiàn)是一個(gè) value永遠(yuǎn)為null的HashMap,實(shí)際就是通過(guò)計(jì)算hash的方式來(lái)快速排重的,這也是set能提供判斷一個(gè)成員是否在集合內(nèi)的原因。

    常用命令 :sadd/spop/smembers/sunion等,具體如下:

    ZSet(Sorted Set:有序集合) 每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類(lèi)型的分?jǐn)?shù)score,分?jǐn)?shù)允許重復(fù),集合元素按照score排序( 當(dāng)score相同的時(shí)候,會(huì)按照被插入的鍵的字典順序進(jìn)行排序 ),還可以通過(guò) score 的范圍來(lái)獲取元素的列表。

    應(yīng)用場(chǎng)景 :Redis sorted set的使用場(chǎng)景與set類(lèi)似,區(qū)別是set不是自動(dòng)有序的,而sorted set可以 通過(guò)用戶(hù)額外提供一個(gè)優(yōu)先級(jí)(score)的參數(shù)來(lái)為成員排序,并且是插入有序的,即自動(dòng)排序。 當(dāng)你需要一個(gè)有序的并且不重復(fù)的集合列表,那么可以選擇sorted set數(shù)據(jù)結(jié)構(gòu),比如twitter 的public timeline可以以發(fā)表時(shí)間作為score來(lái)存儲(chǔ),這樣獲取時(shí)就是自動(dòng)按時(shí)間排好序的。

    底層實(shí)現(xiàn) : zset 是 Redis 提供的一個(gè)非常特別的數(shù)據(jù)結(jié)構(gòu),常用作排行榜等功能,以用戶(hù) id 為 value ,關(guān)注時(shí)間或者分?jǐn)?shù)作為 score 進(jìn)行排序。實(shí)現(xiàn)機(jī)制分別是 zipList 和 skipList 。規(guī)則如下:

    zipList:滿(mǎn)足以下兩個(gè)條件

    skipList:不滿(mǎn)足以上兩個(gè)條件時(shí)使用跳表、組合了hash和skipList

    為什么用skiplist不用平衡樹(shù)?

    主要從內(nèi)存占用、對(duì)范圍查找的支持和實(shí)現(xiàn)難易程度這三方面總結(jié)的原因。

    拓展:mysql為什么不用跳表?

    常用命令 :zadd/zrange/zrem/zcard等;

    官網(wǎng)地址: https://redis.io/commands/geoadd

    可以用來(lái)推算兩地之間的距離,方圓半徑內(nèi)的人。

    關(guān)于經(jīng)度緯度的限制: https://www.redis.net.cn/order/3685.html

    一般我們使用Hyperloglog做基數(shù)統(tǒng)計(jì)。

    什么是基數(shù)?就是一個(gè)集合中不重復(fù)的數(shù)的個(gè)數(shù)。

    集合A:{1,3,5,7,9,7}

    集合B:{1,3,5,7,9}

    AB集合的基數(shù)都是5

    應(yīng)用:統(tǒng)計(jì)網(wǎng)站的訪問(wèn)量(一個(gè)人訪問(wèn)網(wǎng)站很多次仍然算作一次)。

    優(yōu)點(diǎn):占用的內(nèi)存是固定的,找2^64次方個(gè)數(shù)的基數(shù),只需要12KB內(nèi)存。

    缺點(diǎn):有0.81%的錯(cuò)誤率,可以忽略不計(jì)

    概述: bitmap 存儲(chǔ)的是連續(xù)的二進(jìn)制數(shù)字(0 和 1),通過(guò) bitmap, 只需要一個(gè) bit 位來(lái)表示某個(gè)元素對(duì)應(yīng)的值或者狀態(tài),key 就是對(duì)應(yīng)元素本身 。 我們知道 8 個(gè) bit 可以組成一個(gè) byte,所以 bitmap 本身會(huì)極大的節(jié)省儲(chǔ)存空間。

    應(yīng)用場(chǎng)景: 適合需要保存狀態(tài)信息(比如是否簽到、是否登錄...)并需要進(jìn)一步對(duì)這些信息進(jìn)行分析的場(chǎng)景。比如用戶(hù)簽到情況、活躍用戶(hù)情況、用戶(hù)行為統(tǒng)計(jì)(比如是否點(diǎn)贊過(guò)某個(gè)視頻)。

    針對(duì)上面提到的一些場(chǎng)景,這里進(jìn)行進(jìn)一步說(shuō)明。

    使用場(chǎng)景一:用戶(hù)行為分析 很多網(wǎng)站為了分析你的喜好,需要研究你點(diǎn)贊過(guò)的內(nèi)容。

    使用場(chǎng)景二:統(tǒng)計(jì)活躍用戶(hù)

    使用時(shí)間作為 key,然后用戶(hù) ID 為 offset,如果當(dāng)日活躍過(guò)就設(shè)置為 1

    那么我該如果計(jì)算某幾天/月/年的活躍用戶(hù)呢(暫且約定,統(tǒng)計(jì)時(shí)間內(nèi)只有有一天在線(xiàn)就稱(chēng)為活躍),有請(qǐng)下一個(gè) redis 的命令

    使用場(chǎng)景三:用戶(hù)在線(xiàn)狀態(tài)

    對(duì)于獲取或者統(tǒng)計(jì)用戶(hù)在線(xiàn)狀態(tài),使用 bitmap 是一個(gè)節(jié)約空間效率又高的一種方法。

    只需要一個(gè) key,然后用戶(hù) ID 為 offset,如果在線(xiàn)就設(shè)置為 1,不在線(xiàn)就設(shè)置為 0。

    補(bǔ)充

    巨人的肩膀:

    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是面試中最常問(wèn)的中間件,關(guān)于數(shù)據(jù)結(jié)構(gòu)主要集中在列舉和用法。下面我們就數(shù)據(jù)結(jié)構(gòu)和主要的使用方式做一個(gè)描述。

    大家都知道redis的幾種數(shù)據(jù)結(jié)構(gòu),包括string (字符串),hash(哈希),list(列表),set(集合),zset(有序集合)。下面我們來(lái)列舉一下關(guān)于這幾種結(jié)構(gòu)的常用命令和一些使用場(chǎng)景。

    string是redis的最基本的數(shù)據(jù)類(lèi)型。

    string類(lèi)型是二進(jìn)制安全的,也就是說(shuō)string里可以包含任何的數(shù)據(jù)類(lèi)型。

    string類(lèi)型的值最大能存儲(chǔ)512MB

    1、 普通的單值緩存

    2、對(duì)象數(shù)據(jù)緩存(json格式)

    3、分布式鎖的應(yīng)用

    4、計(jì)數(shù)器的使用,使用INCR和DECR

    redis hash 是一個(gè)string類(lèi)型的field(字段)和value(值)的映射表,很適合存儲(chǔ)對(duì)象。

    hash最適合的就是做對(duì)象緩存

    list是redis的字符串列表,可以選擇將值插入到頭部或尾部。

    1、 可以利用list的頭部尾部增刪屬性實(shí)現(xiàn)棧和隊(duì)列

    2、 可以用來(lái)實(shí)現(xiàn)時(shí)間軸模型,根據(jù)時(shí)間依次插入數(shù)據(jù),使用LPUSH插入和LRANGE獲取最近范圍的數(shù)據(jù)

    set是redis的無(wú)序集合,是通過(guò)哈希表實(shí)現(xiàn)的,因此任何操作(添加、刪除和測(cè)試成員的存在性等)的時(shí)間復(fù)雜度是O(1)。(無(wú)論集合中包含多少元素,時(shí)間都是常量)

    1、 可以根據(jù)set集合的不可重復(fù)的特性,統(tǒng)計(jì)一些像網(wǎng)站訪問(wèn)IP啊,訪問(wèn)用戶(hù)啊這些信息,無(wú)論訪問(wèn)多少次,SADD加入的都只有一條。

    2、 也可以使用SRANDMEMBER和SPOP獲取數(shù)據(jù)的隨機(jī)性 ,做一些抽獎(jiǎng)的小程序等隨機(jī)功能

    3、 作為集合,可以利用交并運(yùn)算等計(jì)算一些復(fù)雜的邏輯關(guān)系,比如說(shuō)人物關(guān)系之間的網(wǎng)絡(luò)關(guān)系。

    ZSet和set類(lèi)似,都是字符串的非重復(fù)集合。不同之處在于,ZSet的每個(gè)成員都與分?jǐn)?shù)相關(guān),分?jǐn)?shù)是用來(lái)進(jìn)行排序的。然后可以使用分?jǐn)?shù)來(lái)取一個(gè)范圍內(nèi)的數(shù)

    應(yīng)用場(chǎng)景:

    ZSet是有序的集合,可以使用它來(lái)做一個(gè)排行榜。

    四、tcp游戲服務(wù)器需要redis嗎?

    需要。

    用Redis解決游戲的跨服排行榜的痛點(diǎn),使用Redis可以讓排行榜數(shù)據(jù)更及時(shí),且更新時(shí)不會(huì)發(fā)生沖突,并且Redis并不只具備存儲(chǔ)數(shù)據(jù)和讀取數(shù)據(jù)的能力,還有一個(gè)發(fā)布訂閱的功能。

    現(xiàn)在也有很多游戲直接用Redis持久化做DB。好處是開(kāi)發(fā)簡(jiǎn)單,方便。缺點(diǎn)就是云Redis成本高,擴(kuò)容,縮服不方便,自己搭運(yùn)維成本高,風(fēng)險(xiǎn)也較高。

    以上就是小編對(duì)于redis排行榜問(wèn)題和相關(guān)問(wèn)題的解答了,如有疑問(wèn),可撥打網(wǎng)站上的電話(huà),或添加微信。


    推薦閱讀:

    圖靈機(jī)器人api(圖靈機(jī)器人api secret)

    建站都要裝wordpress(用wordpress建站的好處)

    rectangle怎么讀發(fā)音(rectangle怎么發(fā)音怎么讀)

    工科女碩士的出路(工科女碩士就業(yè))

    景觀設(shè)計(jì)李老師微博(景觀設(shè)計(jì)教授)