Redis基本數(shù)據(jù)結(jié)構(gòu)及應(yīng)用案例

一 :Redis 簡介

redis 是目前最受歡迎的NoSql 數(shù)據(jù)庫辖所,是以內(nèi)存作為數(shù)據(jù)存儲(chǔ)介質(zhì)透且,所以讀寫數(shù)據(jù)的效率極高性誉,遠(yuǎn)遠(yuǎn)超過數(shù)據(jù)庫捌臊。

redis的存儲(chǔ)分為內(nèi)存存儲(chǔ)杨蛋、磁盤存儲(chǔ)和log文件三部分,重啟后理澎,Redis可以從磁盤重新將數(shù)據(jù)加載到內(nèi)存中逞力,此特性保證了數(shù)據(jù)的持久化。

今天主要簡單的介紹下 redis的五種數(shù)據(jù)結(jié)構(gòu)及其簡單運(yùn)用糠爬。
redis.png

二 :String 結(jié)構(gòu)與應(yīng)用場景

1寇荧、單值緩存

set key value
get key
單值存儲(chǔ).png

2、對(duì)象緩存

mset key value [key value …]
mget key [key …]
對(duì)象存儲(chǔ).png

3执隧、分布式鎖

setnx key value [set if not exists]
key 不存在時(shí)揩抡,設(shè)置成功,返回 1镀琉,key 存在則不做任何操作 返回0
比如對(duì)一個(gè)商品 Logitech:gpw 進(jìn)行加鎖峦嗤,因?yàn)閞edis 是單線程的,只有一個(gè)加鎖成功屋摔,其他返回加鎖失敗寻仗,操作如下:
分布式鎖.png

4、web集群session 共享

使用spring session + redis 實(shí)現(xiàn) session 共享

5凡壤、計(jì)數(shù)器

incr key
應(yīng)用場景 :
    ①:如右圖的閱讀數(shù)
    ②:對(duì)于自增需要的處理
計(jì)數(shù)器.png
閱讀案例.png

    @Autowired
    private RedisTemplate redisTemplate;


/**
     * TS+日期+4位數(shù)字
     *
     * @return
     */
    public String getComplaintCode() {
        SimpleDateFormat dfst = new SimpleDateFormat("yyyyMMdd");
        String newDate = dfst.format(new Date());
        String complaintCode = "";
        Long incr = this.incr("complaintRepair" + newDate, 24);
        if (incr == 0) {
            incr = this.incr("complaintRepair" + newDate, 24);
        }
        DecimalFormat df = new DecimalFormat("0000");
        complaintCode = "TS" + newDate + df.format(incr);
        return complaintCode;
    }

    public Long incr(String key, long liveTime) {
        RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
        Long increment = entityIdCounter.getAndIncrement();
        if ((null == increment || increment.longValue() == 0) && liveTime > 0) {//初始設(shè)置過期時(shí)間
            entityIdCounter.expire(liveTime, TimeUnit.HOURS);
        }
        return increment;
    }

三 :Hash 結(jié)構(gòu)與應(yīng)用場景

1署尤、單值緩存

    hset key field value 
    hset key field 
單值緩存.png

2耙替、對(duì)象緩存

    hmset key field value [field value ...]
    hmget key field [field ...]
對(duì)象緩存.png

3、舉例說明

工作中很少用hset 曹体,就舉例說明:下圖主要信息有 :購物車商品數(shù)量俗扇,購物車單個(gè)商品id及數(shù)量,可以全選商品箕别,增加數(shù)量铜幽,刪除商品等操作,具體如下
購物車.png
購物車 :
①:以用戶id 為key
②:商品id 為field
③:商品數(shù)量為value

購物車操作 :
①:添加商品 ? hset wangch:7456 bose:1 1
②:增加數(shù)量 ? hincrby wangch:7456 bose:1 1
③:商品總數(shù) ? hlen wangch:7456
④:刪除商品 ? hdel wangch:7456 bose:1    
⑤:獲取購物車所有商品 ? hgetall wangch:7456
購物車操作.png

4串稀、hash 結(jié)構(gòu)的優(yōu)缺點(diǎn)

優(yōu)點(diǎn) :
①:同類數(shù)據(jù)歸類整合存儲(chǔ)除抛,方便數(shù)據(jù)管理
②:相比于string操作內(nèi)存和cpu更小
③:相比于string存儲(chǔ)更節(jié)省空間

缺點(diǎn) :
①:過期功能不能使用在field上,只能使用在key上
②:redis集群架構(gòu)下不適合大規(guī)模使用
集群示例.png

四 :List 結(jié)構(gòu)與應(yīng)用場景

1母截、基礎(chǔ)命令

lpush key value [value …]
value值 從左到右的順序依次插入到表頭   
rpush key value [value ...]
value值 從右到左的順序依次插入到表頭   
lpop key
移除并返回列表 key 的頭元素
rpop key
移除并返回列表 key 的尾元素

lrange key start stop
返回列表key 指定區(qū)間內(nèi)元素到忽,區(qū)間以偏移量start和stop指定

blpop key [key …] timeout
從key列表表頭彈出一個(gè)元素,若列表沒有元素清寇,阻塞等待timeout秒喘漏,如果timeout=0 ,一直等待下去


brpop key [key …] timeout
從key列表表尾彈出一個(gè)元素,若列表沒有元素华烟,阻塞等待timeout秒翩迈,如果timeout=0 ,一直等待下去
List操作示例.png

2、常用數(shù)據(jù)結(jié)構(gòu)

Stack(棧)=lpush + lpop (先進(jìn)后出)
棧操作.png
Queue(隊(duì)列)=lpush + rpop (先進(jìn)先出)
隊(duì)列操作.png
Blocking MQ (阻塞隊(duì)列)=lpush + brpop
會(huì)話一阻塞.png

會(huì)話二新增數(shù)據(jù).png
會(huì)話一獲取數(shù)據(jù).png

3负饲、微信公眾號(hào)消息流

①:Java3y 推送消息衩藤,消息id為 222
        lpush msg:wangch 222

②:Hollis 推送消息,消息id為 444
        lpush msg:wangch 444

③:查看最新的公眾號(hào)消息
        lrange msg:wangch 0 4
公眾號(hào)示例.png
操作示例.png
此種方式適用于粉絲量小的公眾號(hào)推送方式

五 :Set 結(jié)構(gòu)與應(yīng)用場景

1、set 常用操作

sadd key member [member]   新增元素 ,  元素唯一不重復(fù)
srem key member [member]   刪除元素
smembers key               獲取集合key 所有元素
scard key                  獲取集合key 元素個(gè)數(shù)
sismember key member       判斷元素是否存在于集合key
srandmember key [count]    從集合key中取出count個(gè)元素何鸡,元素不刪除
spop key [count]           從集合key中取出count個(gè)元素傍睹,元素刪除

2访得、應(yīng)用實(shí)例 :微信抽獎(jiǎng)小程序

①:點(diǎn)擊參與抽獎(jiǎng)加入集合
    sadd key wangch
②:查看參與抽獎(jiǎng)所有用戶
    smembers key
    (scard key : 查看抽獎(jiǎng)個(gè)數(shù))
③:抽取count 名中獎(jiǎng)?wù)?    srandmember key [count]/ spop key [count]
    
(也可以用于點(diǎn)贊传趾,收藏等場景)
抽獎(jiǎng).png

抽獎(jiǎng)示例.png

3店茶、set 運(yùn)算操作

sinter key [key …]              交集運(yùn)算
sunion key [key …]              并集運(yùn)算
sdiff key [key …]               差集運(yùn)算    
舉例說明.png
sinter set2 set3 set3 --> {c}
sunion set2 set3 set3 --> {a,b,c,d,e}
sdiff set2 set3 set3 --> {a}

4 族壳、應(yīng)用實(shí)例 :集合操作實(shí)現(xiàn)關(guān)注模型

①:wangch關(guān)注的人
    sadd wangch zhangxh锦亦、lisi、wangwu 
②:小明關(guān)注的人
    sadd xiaom  lisi令境、 wangwu孽亲、zhaol
③: 李四關(guān)注的人
    sadd lisi  xiaom 、zhaol展父、 xiaoq
獲取 wangch 和小明的共同關(guān)注
    sinter wangch xiaom --> {lisi返劲、wangwu}
我關(guān)注的人也關(guān)注了他(小明)
     sismember lisi xiaom --> 返回 1 存在,
                                    則也關(guān)注了
我可能認(rèn)識(shí)的人
    sdiff wangch xiaom --> {zhangxh}
關(guān)注.png

操作示例.png
可用于淘寶推薦商品:共同關(guān)注的人越多栖茉,說明興趣愛好相同篮绿。當(dāng)A購買一件商品時(shí),就可能給你也推薦

六 : ZSet 結(jié)構(gòu)與應(yīng)用場景

1吕漂、ZSet 常用操作

sadd key score member [[scoremember] …]     有序集合key加入帶分值元素
srem key member [member]                    有序集合刪除元素
zscore key member                           返回有序集合key中元素member分值
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)元素

2亲配、 ZSet 集合操作

zunionstore destkey numkeys key  [key...]   并集操作
zinterstore destkey numkeys key  [key...]     交集操作
ZSet.png

3、 ZSet 實(shí)現(xiàn)微博排行榜

實(shí)現(xiàn)基礎(chǔ) : zset 數(shù)據(jù)會(huì)根據(jù)score自動(dòng)排序惶凝,我們將點(diǎn)擊次數(shù)作為zset ,隨著用戶點(diǎn)擊實(shí)時(shí)變化
①:展示當(dāng)日排行前十 (按照score倒序)
    zrevrange hot:20201229 0 9 withscores
②:累計(jì)計(jì)算近七日點(diǎn)擊次數(shù)   
    zunionstore hot:20201222-2021229 7hot:20201222 hot:20201223 … hot:2021229
③:展示七日排行前十
     zrevrange hot:20201222-2021229  0 9 withscores
微博熱搜.png

4吼虎、 ZSet 其他應(yīng)用

zset 還可以用來實(shí)現(xiàn)延遲隊(duì)列、接口限流等操作苍鲜,主要是使用score 的特性思灰,以時(shí)間戳作為score,來達(dá)到相應(yīng)邏輯混滔。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末洒疚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子坯屿,更是在濱河造成了極大的恐慌油湖,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件领跛,死亡現(xiàn)場離奇詭異乏德,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吠昭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門喊括,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怎诫,你說我怎么就攤上這事瘾晃。” “怎么了幻妓?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蹦误,是天一觀的道長劫拢。 經(jīng)常有香客問我,道長强胰,這世上最難降的妖魔是什么舱沧? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮偶洋,結(jié)果婚禮上熟吏,老公的妹妹穿的比我還像新娘。我一直安慰自己玄窝,他們只是感情好牵寺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恩脂,像睡著了一般帽氓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俩块,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天黎休,我揣著相機(jī)與錄音,去河邊找鬼玉凯。 笑死势腮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漫仆。 我是一名探鬼主播捎拯,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼歹啼!你這毒婦竟也來了玄渗?” 一聲冷哼從身側(cè)響起座菠,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤狸眼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后浴滴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拓萌,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年升略,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了微王。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡品嚣,死狀恐怖炕倘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翰撑,我是刑警寧澤罩旋,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響涨醋,放射性物質(zhì)發(fā)生泄漏瓜饥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一浴骂、第九天 我趴在偏房一處隱蔽的房頂上張望乓土。 院中可真熱鬧,春花似錦溯警、人聲如沸趣苏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拦键。三九已至,卻和暖如春檩淋,著一層夾襖步出監(jiān)牢的瞬間芬为,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國打工蟀悦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留媚朦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓日戈,卻偏偏與公主長得像询张,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浙炼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容