原文:https://mp.weixin.qq.com/s/ZSQ9vCkWXYuLrKS0UJ4RIg
兩個(gè)星期終于肝了出來,Redis相關(guān)問題腦圖竟闪,終于整理完了@敫!!炼蛤!
文末無套路分享~~附獲取方式妖爷!
Redis作為一款NoSQL內(nèi)存數(shù)據(jù)庫,其豐富的數(shù)據(jù)類型鲸湃、簡單易用的命令赠涮、單機(jī)可達(dá)10萬的高并發(fā)(官方數(shù)據(jù)),從面世以來就深受廣大用戶的喜愛暗挑。Redis的五種數(shù)據(jù)類型笋除,是我們學(xué)習(xí)Redis時(shí)的必修課,但是大多數(shù)人都只是去學(xué)它的命令炸裆、API垃它,卻不知道這些數(shù)據(jù)類型都能應(yīng)用在哪些場景,那這些命令學(xué)起來也就會(huì)很快就忘烹看,終究只是“紙上談兵”国拇。
用好這五種數(shù)據(jù)類型將給你的開發(fā)帶來很大的便利,給你的程序帶來很大的性能提升惯殊,同時(shí)這五種數(shù)據(jù)類型能玩出很多花樣酱吝。
不過大多數(shù)同學(xué),在實(shí)際的開發(fā)過程中土思,大多只用到了Redis五種數(shù)據(jù)類型中的1-3種务热,甚至有的只用過一種String類型。要么是業(yè)務(wù)場景簡單用string足矣己儒,要么就是根本不知道或想不到用別的數(shù)據(jù)類型更合適崎岂,那么即使是有些場景更適合用別的數(shù)據(jù)類型,可能自己也發(fā)覺不到闪湾。所以今天就來聊聊Redis的各種數(shù)據(jù)類型以及各自適用于什么場景冲甘。
其實(shí)這個(gè)問題也是面試中問到Redis時(shí)的一個(gè)“開篇詞”,問這個(gè)問題主要有兩個(gè)原因:
第一途样,看看你到底有沒有全面的了解Redis有哪些功能江醇,一般怎么來用,什么場景用什么數(shù)據(jù)類型何暇,就怕你只會(huì)最簡單的kv操作
第二陶夜,看看你在實(shí)際項(xiàng)目里都怎么玩兒過Redis,經(jīng)驗(yàn)是否豐富
要是你回答的不好赖晶,沒說出幾種數(shù)據(jù)類型律适,也沒說什么場景,你完了遏插,面試官對(duì)你印象肯定不好捂贿,覺得你平時(shí)就是做個(gè)簡單的set和get,沒思考過胳嘲。
廢話不多說厂僧,進(jìn)入正題吧。Redis一共提供了5種數(shù)據(jù)類型了牛,分別是String颜屠,Hash,List鹰祸,Set甫窟,sorted set(Zset),下面就從各個(gè)數(shù)據(jù)類型的基本常用命令和使用場景分別說說吧蛙婴。
String字符串
String字符串結(jié)構(gòu)的常用命令
#字符串常用操作
SET key value //存入字符串鍵值對(duì)
MSET key value [key value ...] //批量存儲(chǔ)字符串鍵值對(duì)
SETNX key value //存入一個(gè)不存在的字符串鍵值對(duì)
GET key //獲取一個(gè)字符串鍵值
MGET key [key ...] //批量獲取字符串鍵值
DEL key [key ...] //刪除一個(gè)鍵
EXPIRE key seconds //設(shè)置一個(gè)鍵的過期時(shí)間(秒)
#原子加減
INCR key //將key中儲(chǔ)存的數(shù)字值加1
DECR key //將key中儲(chǔ)存的數(shù)字值減1
INCRBY key increment //將key所儲(chǔ)存的值加上increment
DECRBY key decrement //將key所儲(chǔ)存的值減去decrement
這里列出了一些String常用命令粗井,我們看一下這些String類型的這些命令可以應(yīng)用到哪些場景。
應(yīng)用場景
1街图、單值緩存
即最簡單的key-value的set和get浇衬,比如緩存?zhèn)€標(biāo)識(shí),開關(guān)等
SET key value
GET key
2餐济、對(duì)象緩存
除了單值緩存我們還可以用String類型緩存對(duì)象耘擂,如下兩種方式:
#1
SET user:1 value(json串)
GET user:1
#2
MSET user:1:name 編程大道 user:1:sex 1
MGET user:1:name user:1:sex
第一種直接將對(duì)象轉(zhuǎn)換成json串作為value存儲(chǔ)到redis,這種獲取對(duì)象就比較簡單了絮姆,直接get key拿到value轉(zhuǎn)成對(duì)象即可醉冤,但有個(gè)缺點(diǎn)就是如果你要是修改對(duì)象的某一個(gè)字段,也得把整個(gè)對(duì)象的json串拿出來反序列化成對(duì)象滚朵,這將帶來不必要的網(wǎng)絡(luò)開銷(即便是redis存在內(nèi)存中冤灾,但實(shí)際我們的應(yīng)用服務(wù)器和redis是隔離的,網(wǎng)絡(luò)傳輸?shù)拈_銷也不容小覷)辕近,同樣韵吨,頻繁的序列化反序列化也將會(huì)帶來不小的性能開銷,如果對(duì)于性能要求比較高的系統(tǒng)來說這將是一個(gè)災(zāi)難移宅。
而第二種存儲(chǔ)對(duì)象的方式則對(duì)于這種頻繁修改對(duì)象某一個(gè)字段的場景就比較友好了归粉,每個(gè)字段與值都是一個(gè)kv對(duì),修改直接set k v覆蓋就好了漏峰,但是存儲(chǔ)多個(gè)字段時(shí)就沒那么容易了糠悼,好在有mset批量操作的命令,網(wǎng)絡(luò)開銷由多次變?yōu)?次浅乔。
3倔喂、分布式鎖
如下setnx命令是set if not exit的縮寫铝条,意思就是這個(gè)key不存在時(shí)才執(zhí)行set。多個(gè)線程執(zhí)行這條命令時(shí)只有一個(gè)線程會(huì)執(zhí)行成功席噩,則視為拿到鎖班缰。然后拿到鎖的線程執(zhí)行業(yè)務(wù)操作,執(zhí)行完畢刪除這個(gè)鎖悼枢,釋放鎖埠忘。
#setnx key value
SETNX product:10001 true //返回1代表獲取鎖成功
SETNX product:10001 true //返回0代表獲取鎖失敗
//執(zhí)行業(yè)務(wù)操作
DEL product:10001 //執(zhí)行完業(yè)務(wù)釋放鎖
上述方式存在問題:程序意外終止可能會(huì)導(dǎo)致鎖沒辦法釋放,造成死鎖馒索∮ǘ剩可以使用如下命令,既設(shè)置分布式鎖又設(shè)置了key的過期時(shí)間
SET product:10001 true ex 10 nx //防止程序意外終止導(dǎo)致死鎖
分Redis布式鎖的詳細(xì)實(shí)現(xiàn)可以參考我之前寫的Redis分布式鎖實(shí)戰(zhàn)
4绰上、計(jì)數(shù)器
INCR article:readcount:{文章id}
GET article:readcount:{文章id}
基于Redis原子自增命令incr可以實(shí)現(xiàn)諸如計(jì)數(shù)器的功能旨怠,我們都知道公眾號(hào)文章,微博蜈块,博客都有一個(gè)閱讀量的概念运吓,我們就可以用這個(gè)計(jì)數(shù)器來實(shí)現(xiàn),而且性能很高疯趟。
例如下圖中的閱讀數(shù)就可以用redis的自增來實(shí)現(xiàn)
5拘哨、Web集群session共享解決方案
系統(tǒng)集群部署情況下首先要考慮的問題就是session共享問題,我們可以通過將原本存儲(chǔ)在內(nèi)存中由tomcat管理的session轉(zhuǎn)移到由Redis來存儲(chǔ)信峻,實(shí)現(xiàn)分布式session的功能倦青。spring框架提供了session共享的解決方案,即spring session + redis實(shí)現(xiàn)分布式session盹舞。
6产镐、分布式系統(tǒng)全局序列號(hào)
分布式系統(tǒng)中要保證全局序列號(hào)的唯一性阔加,可以使用Redis來維護(hù)一個(gè)自增的序列残吩。
通過如下命令從Redis獲取自增ID:
#INCR是一個(gè)原子自增命令
INCR orderId
分布式系統(tǒng)環(huán)境下通過Redis保證ID的自增性和唯一性,通過該命令獲取ID每次都要和Redis進(jìn)行交互猪钮,如果業(yè)務(wù)量很大获印,那么這將會(huì)很頻繁述雾。
所以可以一次性獲取一定量的ID保存在JVM內(nèi)存中,用完了再從Redis獲取兼丰。這樣減少了頻繁的網(wǎng)絡(luò)開銷玻孟,但是缺點(diǎn)是可能會(huì)丟失(浪費(fèi))一部分ID,因?yàn)楂@取后服務(wù)可能掛了還沒用完的ID可能就浪費(fèi)了(當(dāng)然你可以使用一些手段去保證不浪費(fèi)鳍征,但沒必要黍翎,浪費(fèi)一點(diǎn)也是無所謂的)。
如下艳丛,每次獲取1000個(gè)
#redis批量生成序列號(hào)提升性能
INCRBY orderId 1000
HASH結(jié)構(gòu)
Hash常用操作
HSET key field value//存儲(chǔ)一個(gè)哈希表key的鍵值
HSETNX key field value//存儲(chǔ)一個(gè)不存在的哈希表key的鍵值
HMSET key field value [field value ...] //在一個(gè)哈希表key中存儲(chǔ)多個(gè)鍵值對(duì)
HGET key field//獲取哈希表key對(duì)應(yīng)的field鍵值
HMGET key field [field ...]//批量獲取哈希表key中多個(gè)field鍵值
HDEL key field [field ...]//刪除哈希表key中的field鍵值
HLEN key//返回哈希表key中field的數(shù)量
HGETALL key//返回哈希表key中所有的鍵值
HINCRBY key field increment//為哈希表key中field鍵的值加上增量increment
應(yīng)用場景
1匣掸、對(duì)象緩存
結(jié)合HASH結(jié)構(gòu)的key-field-value的特性趟紊,類似于Java中的HashMap,內(nèi)部也是“key-value”的形式碰酝,field剛好可以存對(duì)象的屬性名织阳,假設(shè)有如下數(shù)據(jù),
我們可以用HMSET命令批量設(shè)置field-value砰粹,前面拼接用戶的ID保證存多個(gè)用戶的數(shù)據(jù)不會(huì)重復(fù);HMGET批量獲取field造挽;MSET修改某一個(gè)field碱璃。
HMSET achievement {userId}:name 小明 {userId}:score 89
HMSET achievement 1:name 小明 1:score 89
HMSET achievement 2:name 小華 2:score 92
HMGET achievement 1:name 1:score
對(duì)象與HSAH的關(guān)系就變成了下圖這樣
2、電商購物車
以用戶id為key饭入,商品id為field嵌器,商品數(shù)量為value可以實(shí)現(xiàn)購物車的常規(guī)操作。
購物車操作:
#添加商品
hset cart:10001 50005 1
#給某一個(gè)商品增加數(shù)量
hincrby cart:10001 50005 1
#購物車中商品總個(gè)數(shù)
hlen cart:10001
#刪除商品
hdel cart:10001 50005
#獲取購物車所有商品
hgetall cart:10001
對(duì)應(yīng)購物車的幾個(gè)常用操作可以想象使用Redis如何實(shí)現(xiàn)
Hash結(jié)構(gòu)優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
將同類數(shù)據(jù)歸類整合儲(chǔ)存(同一個(gè)key)谐丢,方便數(shù)據(jù)管理
相比String操作爽航,對(duì)內(nèi)存與cpu的消耗更小
相比String儲(chǔ)存更節(jié)省空間
缺點(diǎn)
過期功能不能使用在field上,只能用在key上
Redis集群架構(gòu)下不適合大規(guī)模使用
List結(jié)構(gòu)
List常用操作
我們可以認(rèn)為列表的左邊叫頭乾忱,右邊叫尾
常用命令
LPUSH key value [value ...] //將一個(gè)或多個(gè)值value插入到key列表的表頭(最左邊)
應(yīng)用場景
1讥珍、實(shí)現(xiàn)常見的數(shù)據(jù)結(jié)構(gòu)
基于List的特性及豐富的命令可以實(shí)現(xiàn)常用的集中數(shù)據(jù)結(jié)構(gòu):
1)Stack(棧) = LPUSH + LPOP ,F(xiàn)ILO先入后出
結(jié)合LPUSH和LPOP命令實(shí)現(xiàn)棧的先進(jìn)后出的特性窄瘟,LPUSH從左邊入棧衷佃,LPOP從左邊出棧,先進(jìn)入的后出來蹄葱。相當(dāng)于入口出口是一個(gè)氏义。
2)Queue(隊(duì)列)= LPUSH + RPOP,F(xiàn)IFO先進(jìn)先出
結(jié)合LPUSH和RPOP命令實(shí)現(xiàn)隊(duì)列的先進(jìn)先出的特性图云,LPUSH從左邊入隊(duì)惯悠,RPOP從右邊出隊(duì),先進(jìn)來的先出來竣况。相當(dāng)于入口出口各在兩邊克婶。
3)Blocking MQ(阻塞隊(duì)列)= LPUSH + BRPOP
結(jié)合LPUSH和BRPOP實(shí)現(xiàn)阻塞隊(duì)列,BRPOP比RPOP多了一個(gè)timeout的參數(shù)丹泉,是一個(gè)等待的最大時(shí)間鸠补,如果在這個(gè)時(shí)間內(nèi)拿不到數(shù)據(jù)則返回空。
2嘀掸、微博消息和微信公號(hào)消息
例如紫岩,walking本人關(guān)注了人民網(wǎng)、華為中國睬塌、京港地鐵等大V泉蝌,假設(shè)人民網(wǎng)發(fā)了一條微博歇万,ID為30033,我關(guān)注了他勋陪,那么就會(huì)往我的msg這個(gè)隊(duì)列里push這個(gè)微博ID贪磺,我在打開我的微博時(shí),就會(huì)從這個(gè)我專屬的msg隊(duì)列里取前幾個(gè)微博ID展示給我看诅愚,所以這個(gè)就牽涉到了幾個(gè)關(guān)鍵點(diǎn):
1)人民網(wǎng)發(fā)了一條微博寒锚,ID為30033,消息ID入隊(duì)
LPUSH msg:{walking-ID} 30033
2)華為中國發(fā)微博违孝,ID為30055刹前,消息入隊(duì)
LPUSH msg:{walking-ID} 30055
3)我登錄進(jìn)去,會(huì)給我展示最新微博消息雌桑,那么就從我的消息隊(duì)列里取最新的前5條顯示在首頁
LRANGE msg:{walking-ID} 0 5
SET結(jié)構(gòu)
Set常用操作
SADD key member [member ...]//往集合key中存入元素喇喉,元素存在則忽略,若key不存在則新建
SREM key member [member ...]//從集合key中刪除元素
SMEMBERS key //獲取集合key中所有元素
SCARD key//獲取集合key的元素個(gè)數(shù)
SISMEMBER key member//判斷member元素是否存在于集合key中
SRANDMEMBER key [count]//從集合key中選出count個(gè)元素校坑,元素不從key中刪除
SPOP key [count]//從集合key中選出count個(gè)元素拣技,元素從key中刪除
set運(yùn)算操作
SINTER key [key ...] //交集運(yùn)算
SINTERSTORE destination key [key ..]//將交集結(jié)果存入新集合destination中
SUNION key [key ..] //并集運(yùn)算
SUNIONSTORE destination key [key ...]//將并集結(jié)果存入新集合destination中
SDIFF key [key ...] //差集運(yùn)算
SDIFFSTORE destination key [key ...]//將差集結(jié)果存入新集合destination中
應(yīng)用場景
1、微信抽獎(jiǎng)小程序
想必大家都用過微信里的抽獎(jiǎng)小程序吧耍目,如下圖膏斤,我們可以點(diǎn)擊立即參與進(jìn)行抽獎(jiǎng),還可以查看所有參與人員邪驮,最后就是開獎(jiǎng)的功能掸绞,一共三個(gè)關(guān)鍵點(diǎn)
我們看一下這三個(gè)關(guān)鍵點(diǎn)用set數(shù)據(jù)類型怎么實(shí)現(xiàn):
1)點(diǎn)擊參與抽獎(jiǎng),則將用戶ID加入集合
SADD key {userlD}
2)查看參與抽獎(jiǎng)所有用戶
SMEMBERS key
3)抽取count名中獎(jiǎng)?wù)?/code>
SRANDMEMBER key [count]//返回但不從set中剔除
如果設(shè)置了一等獎(jiǎng)二等獎(jiǎng)三等獎(jiǎng)...耕捞,并且每人只能得一種衔掸,則可以用SPOP key count
2、微信微博點(diǎn)贊俺抽,收藏敞映,標(biāo)簽
比如walking發(fā)了一條朋友圈,有人點(diǎn)贊
1) 點(diǎn)贊 點(diǎn)贊就把點(diǎn)贊這個(gè)人的ID加到這個(gè)點(diǎn)贊的集合中
SADD like:{消息ID} {用戶ID}
2) 取消點(diǎn)贊 從集合中移除用戶ID
SREM like:{消息ID} {用戶ID}
3) 檢查用戶是否點(diǎn)過贊
SISMEMBER like:{消息ID} {用戶ID}
4) 獲取點(diǎn)贊的用戶列表
SMEMBERS like:{消息ID}
5) 獲取點(diǎn)贊用戶數(shù)
SCARD like:{消息ID}
Set集合運(yùn)算操作的應(yīng)用場景
基于Redisset集合提供的豐富的命令磷斧,我們可以對(duì)集合輕松的實(shí)現(xiàn)交并差的運(yùn)算振愿。例如,現(xiàn)有集合set1弛饭,set12冕末,set3,元素如下:
set1:{a,b,c}
對(duì)集合進(jìn)行交侣颂、并档桃、差的運(yùn)算
SINTER set1 set2 set3 //交集--> { c }
通過這些基本操作我們看可以實(shí)現(xiàn)什么樣的業(yè)務(wù)需求。
3憔晒、集合操作實(shí)現(xiàn)社交軟件關(guān)注模型
社交軟件的用戶關(guān)注模型藻肄,如QQ的好友蔑舞,微博的關(guān)注,抖音嘹屯、快手的關(guān)注攻询、微信的公眾號(hào)關(guān)注,這些社交軟件都會(huì)做一個(gè)這樣的功能州弟,那就是用戶關(guān)系的關(guān)注模型推薦钧栖,包括共同關(guān)注的人、可能認(rèn)識(shí)的人婆翔、
首先看一下walking拯杠、chenmowanger、Hollis關(guān)注的人浙滤,如下:
1)walking關(guān)注的人:
walkingSet-->{chenmowanger, ImportNew, Hollis}
2) chenmowanger關(guān)注的人:
chenmowangerSet-->{walking, ImportNew, Hollis, JavaGuide}
3) Hollis關(guān)注的人:
HollisSet--> {waking, ImportNew, JavaGuide, feichao, CodeSheep}
(開玩笑,大佬們才沒關(guān)注我气堕,哈哈??)
每個(gè)人的關(guān)注列表都是一個(gè)Redis的set集合纺腊,然后當(dāng)walking點(diǎn)到chenmowanger的主頁,就會(huì)有個(gè)區(qū)域?qū)iT展示我和二哥的一些關(guān)注情況:
4) walking和chenmowanger共同關(guān)注:
也就是看哪些人在我的集合里也在二哥的集合里
//兩個(gè)集合求并集
SINTER walkingSet zhangyixingSet--> {ImportNew, Hollis}
5) 我關(guān)注的人也關(guān)注他(chenmowanger):
看我關(guān)注的人的關(guān)注列表里是不是有某個(gè)人茎芭,比如我進(jìn)入chenmowanger的主頁揖膜,可以展示我關(guān)注的人里還有誰也關(guān)注了chenmowanger
SISMEMBER ImportNewSet chenmowanger
6) 我可能認(rèn)識(shí)的人:
求差集,以前面這個(gè)集合為準(zhǔn)梅桩,看二哥關(guān)注的那些人有哪些我還沒關(guān)注壹粟,于是我就趕緊關(guān)注了JavaGuide(Guide哥)
SDIFF chenmowangerSet walkingSet->{walking, JavaGuide}
4、集合操作實(shí)現(xiàn)電商商品篩選
先看一下這個(gè)圖是不是很熟悉宿百,選購手機(jī)時(shí)趁仙,有一個(gè)篩選的功能
如上圖,電商網(wǎng)站買手機(jī)垦页,進(jìn)到這個(gè)頁面根據(jù)各種條件搜手機(jī)雀费,我們想一想用Redis如何實(shí)現(xiàn)呢?(當(dāng)然了痊焊,這里并不是說人家就完全用Redis實(shí)現(xiàn)這一套搜索盏袄,其實(shí)主要還是用搜索引擎那些中間件,這里只是說明可以用Redis實(shí)現(xiàn)~)
在上架商品時(shí)維護(hù)商品薄啥,添加商品的同時(shí)把對(duì)應(yīng)的商品添加到對(duì)應(yīng)的set集合里即可辕羽,如下舉例
//品牌-華為
SADD brand:huawei P30 Mate30 榮耀Play4 nova7
//品牌-小米
SADD brand:xiaomi mi6 mi8 mi9 mi10
//品牌-iPhone
SADD brand:iPhone iphone8 iphone8plus iphoneX iphone11
//操作系統(tǒng)-Android
SADD os:android P30 Mate30 榮耀Play4 nova7 mi6 mi8 mi9 mi10
//CPU品牌-驍龍
SADD cpu:brand:xiaolong iphone8 iphone8plus iphoneX iphone11 mi6 mi8 mi9 mi10
//CPU品牌-麒麟
SADD cpu:brand:qilin P30 Mate30 榮耀Play4 nova7
//運(yùn)行內(nèi)存-8G
SADD ram:8G P30 Mate30 榮耀Play4 nova7 mi6 mi8 mi9 mi10 iphone8 iphone8plus iphoneX iphone11
//多條件查詢 操作系統(tǒng)Android,CPU品牌驍龍垄惧,運(yùn)行內(nèi)存8G
SINTER os:android cpu:brand:xiaolong ram:8G -->{mi6 mi8 mi9 mi10}
截圖更容易看:
假設(shè)我們維護(hù)了各種品牌刁愿,手機(jī)所屬的操作系統(tǒng),CPU品牌到逊,運(yùn)行內(nèi)存等酌毡,那么我們?cè)诠催x條件查找時(shí)就可以用勾選的各個(gè)集合求他的交集就行了克握。
ZSet有序集合
zset是有序的set集合,通過傳入的分值進(jìn)行排序
ZSet常用操作
ZADD key score member [[score member]…]//往有序集合key中加入帶分值元素
ZREM key member [member …] //從有序集合key中刪除元素
ZSCORE key member //返回有序集合key中元素member的分值
ZINCRBY key increment member//為有序集合key中元素member的分值加上increment
ZCARD key//返回有序集合key中元素個(gè)數(shù)
ZRANGE key start stop [WITHSCORES]//正序獲取有序集合key從start下標(biāo)到stop下標(biāo)的元素
ZREVRANGE key start stop [WITHSCORES]//倒序獲取有序集合key從start下標(biāo)到stop下標(biāo)的元素
Zset集合操作
ZUNIONSTORE destkey numkeys key [key ...] //并集計(jì)算
ZINTERSTORE destkey numkeys key [key …]//交集計(jì)算
應(yīng)用場景
1枷踏、Zset集合操作實(shí)現(xiàn)排行榜
我們都知道微博熱點(diǎn)菩暗,新聞熱榜,投票排行榜等都有一個(gè)排名的概念旭蠕,如下圖百度熱榜停团,展示的是實(shí)時(shí)的點(diǎn)擊量比較高的新聞(假設(shè)這些新聞的ID為1001-1010),每個(gè)新聞都有一個(gè)熱點(diǎn)值掏熬,一般按點(diǎn)擊量佑稠,1001這個(gè)新聞熱點(diǎn)是484W,1002這個(gè)是467W旗芬,實(shí)時(shí)的舌胶,可能等會(huì)再看就不一樣了,那么我們看下用Redis咋實(shí)現(xiàn)疮丛。
1)點(diǎn)擊新聞
每次有人點(diǎn)擊這個(gè)新聞幔嫂,那么久ius給他的分值加1
ZINCRBY hotNews:20200722 1 1001 //新聞ID為1001的新聞分值加一
2)展示當(dāng)日排行前十
取集合中的前10個(gè)元素
ZREVRANGE hotNews:20200722 0 10 WITHSCORES
3)七日熱點(diǎn)榜單計(jì)算
ZUNIONSTORE hotNews:20200715-20200721 7 hotNews:20200715 hotNews:20200716... hotNews:20200721
4)展示七日排行前十
ZREVRANGE hotNews:20190813-20190819 0 10 WITHSCORES
更多應(yīng)用場景
微信<搖一搖><搶紅包>
滴滴打車、摩拜單車<附近的車>
美團(tuán)和餓了么<附近的餐館>
搜索自動(dòng)補(bǔ)全
布隆過濾器
結(jié)語
本篇文章主要講了Redis五中數(shù)據(jù)類型可以使用對(duì)應(yīng)的命令實(shí)現(xiàn)的業(yè)務(wù)場景誊薄,通過我們生活中常見的業(yè)務(wù)場景來幫助理解Redis的各種數(shù)據(jù)類型的用法履恩,結(jié)合場景也能方便我們更加形象的去理解和學(xué)習(xí)Redis數(shù)據(jù)類型的各種操作命令。
同時(shí)呢蔫,walking也希望通過本文的引導(dǎo)能夠激發(fā)讀者朋友對(duì)Redis數(shù)據(jù)類型應(yīng)用場景的靈感切心,能夠做做需求的時(shí)候系統(tǒng)設(shè)計(jì)的時(shí)候想一想是不是用redis實(shí)現(xiàn)更好一點(diǎn)呢,也算是對(duì)各位的一個(gè)拋磚引玉吧片吊。
再次聲明绽昏,本文中列舉的應(yīng)用場景有些可能使用redis并不是最合適的,有的只是在說明可以用redis去實(shí)現(xiàn)俏脊,希望各位能夠依據(jù)自己的實(shí)際業(yè)務(wù)場景去斟酌具體怎么設(shè)計(jì)而涉。如有問題請(qǐng)幫忙指出哦。
最后希望本文的講解能夠?qū)Υ蠹矣兴鶐椭瑁绻袔椭?qǐng)給walking一點(diǎn)鼓勵(lì)吧啼县,記得 點(diǎn)贊?、轉(zhuǎn)發(fā) ??哦~
別走開沸久,有彩蛋 ↓ ↓ ↓
walking個(gè)人維護(hù)的這個(gè)公眾號(hào)已經(jīng)有兩年了吧季眷,起初是為了自己總結(jié)用的,后來有人關(guān)注了卷胯,我覺得通過我的文章和分享能夠幫助更多的人那就是很值得子刮。感謝一直關(guān)注這個(gè)公眾號(hào)的朋友們?~
雖然產(chǎn)量不高,我也一直在寫下去,也寫了很多文章挺峡,每篇文章都是經(jīng)過幾天甚至是一個(gè)星期的打磨葵孤、推敲才敢發(fā)出來。但是一直是不瘟不火橱赠,即便是沒有人關(guān)注尤仍,沒有人點(diǎn)贊,我也是會(huì)堅(jiān)持下去的狭姨,因?yàn)檫@里是我的積累宰啦,是我留下的痕跡~
大家有什么建議或意見歡迎留言或私信哦~下面是我整理了兩個(gè)星期的Redis知識(shí)點(diǎn),做成思維導(dǎo)圖饼拍,方便大家復(fù)習(xí)赡模,已經(jīng)轉(zhuǎn)成各種格式,歡迎關(guān)注公眾號(hào) 編程大道师抄,回復(fù):Redis漓柑,免費(fèi)獲取****