先介紹一下Redis
簡介:REmote DIctionary Server(Redis) 是一個(gè)由Salvatore Sanfilippo寫的 key-value存儲(chǔ)系統(tǒng),是跨平臺(tái)的非關(guān)系型數(shù)據(jù)庫。
Redis是一個(gè)開源的使用ANSI C語言編寫、遵守BSD協(xié)議、支持網(wǎng)絡(luò)、可基于內(nèi)存、分布式、可選持久性的鍵值對(Key-Value)存儲(chǔ)數(shù)據(jù)庫,并提供多種語言的API。
Redis通常被稱為數(shù)據(jù)結(jié)構(gòu)服務(wù)器,因?yàn)橹担╲alue)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等類型。
優(yōu)勢
1:速度快,因?yàn)閿?shù)據(jù)存在于內(nèi)存中,類似hashmap的優(yōu)勢就是查找和操作的時(shí)間復(fù)雜度都是o(1)
2:支持豐富的數(shù)據(jù)類型,string、list、hash、set、zset
3:支持事務(wù),操作都是原子性的。
4:豐富的特性:可用于緩存、消息,按key設(shè)置過期時(shí)間,過期自動(dòng)刪除
應(yīng)用場景
1、緩存
可以使用String類型
例如:熱點(diǎn)數(shù)據(jù)緩存(例如報(bào)表、熱銷商品),對象緩存、全頁緩存、可以提升熱點(diǎn)數(shù)據(jù)的訪問數(shù)據(jù)。
2、數(shù)據(jù)共享分布式
String 類型,因?yàn)?Redis 是分布式的獨(dú)立服務(wù),可以在多個(gè)應(yīng)用之間共享
例如:分布式Session需要引入此依賴
3、分布式鎖
String 類型setnx方法,只有不存在時(shí)才能添加成功,返回true
將key 的值設(shè)為value ,當(dāng)且僅當(dāng)key不存在。
若給定的 key已經(jīng)存在,則SETNX不做任何動(dòng)作。
4、全局ID
int類型,incrby,利用原子性
如果是分庫分表的場景,一次性拿一段。
5、計(jì)數(shù)器
int類型,incr方法
例如:文章的閱讀量、微博點(diǎn)贊數(shù)、允許一定的延遲,先寫入Redis再定時(shí)同步到數(shù)據(jù)庫
6、限流
基于redis的數(shù)據(jù)結(jié)構(gòu)zset
zset是set的一個(gè)升級版本,他在set的基礎(chǔ)上增加了一個(gè)順序?qū)傩?,這一屬性在添加修改元素的時(shí)候可以指定,每次指定后,zset會(huì)自動(dòng)重新按新的值調(diào)整順序??梢詫χ付ㄦI的值進(jìn)行排序權(quán)重的設(shè)定,它應(yīng)用排名模塊比較多。
我們可以將請求打造成一個(gè)zset數(shù)組,當(dāng)每一次請求進(jìn)來的時(shí)候,value保持唯一,可以用UUID生成,而score可以用當(dāng)前時(shí)間戳表示,因?yàn)閟core我們可以用來計(jì)算當(dāng)前時(shí)間戳之內(nèi)有多少的請求數(shù)量。而zset數(shù)據(jù)結(jié)構(gòu)也提供了range方法讓我們可以很輕易的獲取到2個(gè)時(shí)間戳內(nèi)有多少請求。
7、位統(tǒng)計(jì)
String類型的bitcount(1.6.6的bitmap數(shù)據(jù)結(jié)構(gòu)介紹)
字符是以8位二進(jìn)制存儲(chǔ)的
例如:在線用戶統(tǒng)計(jì),留存用戶統(tǒng)計(jì),支持按位與、按位或等等操作,計(jì)算出7天都在線的用戶。
8、購物車
傳統(tǒng)的購物車實(shí)現(xiàn)有很多種方式,如session,cookie,數(shù)據(jù)庫等,如果用Redis相當(dāng)于一個(gè)內(nèi)存數(shù)據(jù)庫,可以用來做緩存,存儲(chǔ)數(shù)據(jù)等。
類型用String 或hash。所有String可以做的hash都可以做。
9、用戶消息時(shí)間線
list,雙向鏈表,直接作為timeline就好了。插入有序。
10、消息隊(duì)列
List提供了兩個(gè)阻塞的彈出操作:blpop/brpop,可以設(shè)置超時(shí)時(shí)間。
blpop:blpop key1 timeout 移除并獲取列表的第一個(gè)元素,如果列表沒有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。
brpop:brpop key1 timeout 移除并獲取列表的最后一個(gè)元素,如果列表沒有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。
上面的操作。其實(shí)就是java的阻塞隊(duì)列。學(xué)習(xí)的東西越多。學(xué)習(xí)成本越低。
隊(duì)列:先進(jìn)先除:rpush blpop,左頭右尾,右邊進(jìn)入隊(duì)列,左邊出隊(duì)列。
棧:先進(jìn)后出:rpush brpop。
11、抽獎(jiǎng)
移除并返回集合中的一個(gè)隨機(jī)元素。
返回集合中一個(gè)或多個(gè)隨機(jī)數(shù)。
將所有的獎(jiǎng)品通過SADD添加到SET集合中,然后通過隨機(jī)命令獲取對應(yīng)的獎(jiǎng)品即可。而且,抽獎(jiǎng)一般是有時(shí)效性,正好可以配合redis的key的失效時(shí)間使用。使得抽獎(jiǎng)功能很完美的解決。
12、點(diǎn)贊、簽到、打卡
假如上面的微博ID是t1001,用戶ID是u3001
用 like:t1001 來維護(hù) t1001 這條微博的所有點(diǎn)贊用戶
點(diǎn)贊了這條微博:sadd like:t1001 u3001
取消點(diǎn)贊:srem like:t1001 u3001
是否點(diǎn)贊:sismember like:t1001 u3001
點(diǎn)贊的所有用戶:smembers like:t1001
點(diǎn)贊數(shù):scard like:t1001
相對于數(shù)據(jù)庫簡單很多
13、商品標(biāo)簽
使用tags:來給對象打標(biāo)簽,然后可以直接查找出來。
14、商品篩選
一個(gè)集合進(jìn)行查找
多個(gè)集合進(jìn)行運(yùn)算是按照順序,一路算下去的結(jié)果
SDIFF計(jì)算差集
SINTER 計(jì)算并集
SUNION 計(jì)算交集
15、用戶關(guān)注、推薦模型
實(shí)際上就是redis的交集,并集差集的使用交錯(cuò)
舉例:
16、排行榜
實(shí)現(xiàn)這個(gè)功能主要用到的 redis 數(shù)據(jù)類型是 redis 的有序集合 zset。zset 是 set 類型的一個(gè)擴(kuò)展,比原有的類型多了一個(gè)順序?qū)傩?。此屬性在每次插入?shù)據(jù)時(shí)會(huì)自動(dòng)調(diào)整順序值,保證 value 值按照一定順序連續(xù)排列。
查看用戶 e 的實(shí)際排名 (ZREVRANK 為降序,ZRANK 為升序)、實(shí)時(shí)分?jǐn)?shù)。
微信公眾號
業(yè)務(wù)咨詢:400-9969-069(24小時(shí)服務(wù)) 028-86052918
售后熱線:028-86052836
公司地址:成都市武侯區(qū)天益街38號理想中心3棟1810