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