Redis儲存結構及應用場景
1.儲存結構
2.字串string應用場景
String型別,鍵和值都是在字串。
2.1計數器
在redis中有一個命令incr,可以將 key 中儲存的數字值增一。故此功能可用於記錄文章的閱讀數。只要開啟一次文章,閱讀數就加1。
例如對id為29的文章記錄閱讀數
incr article:readcount:{文章id}
命令如下:
> incr article:readcount:222 1 > incr article:readcount:222 2 > incr article:readcount:222 3
可使用get命令檢視最新的值。
3.雜湊hash應用場景
hash是一種key-value形式,而其vaule又是key-value的形式,故相當於給指定的key存入一個map,而map的欄位分別是field和value。
3.1購物車案例
對於常見的購物車,會涉及到新增商品、刪除商品、檢視商品總數、檢視所有的商品資訊。使用hash進行儲存非常合適。
以使用者的id為key,商品的id作為值的key,商品數量作為值的value,假設使用者id是666,三個商品id分別是1005,1008,1009:
1)模擬新增3個商品
> hset cart:666 1005 1 1 > hset cart:666 1008 1 1 > hset cart:666 1009 1 1
三條命令,也就是說需要三次新增到購物車
2)對第一個商品增加1
> hincrby cart:666 1005 1 2
3)檢視商品總數
> hlen cart:666 3
檢視的商品總數只是統計有多少種商品,但不會統計出所有商品的個數,這是其無法做到的。
4)刪除第2個商品
> hdel cart:666 1008 1
5)檢視購物車所有的商品
> hgetall cart:666 1005 2 1009 1
4.列表list應用場景
有序,可重複。
4.1公眾號訊息
在公眾號訊息中,最新發的訊息會推送到最前面,使得使用者第一時間看到最新訊息,可利用lpush+lrange特性。
以使用者id作為key,訊息id作為item:
1)釋出3條訊息
> lpush msg:666 20221 1 > lpush msg:666 20222 2 > lpush msg:666 20223
2)獲取最新的訊息,即最新的訊息排在最前面
> lrange msg:666 0 -1 20223 20222 20221
4.2強制修改密碼
很多場景中當用戶在修改密碼時,不能使用最近5次使用過的密碼,防止因密碼被盜造成的風險。
可使用lpush+lrange+rpop特性,從左邊存入最近修改的密碼,從右邊刪除舊的密碼,保證redis中只保留最近5次的密碼。
以java程式碼說明:
public Boolean updatePwd(String p) {
String key = "zhangsan";
//獲取所有值
List<String> list = stringRedisTemplate.boundListOps(key).range(0, -1);
System.out.println(list);
List<String> pwd;
Integer len = 5;
//獲取最新的5個密碼
if (list.size() < len) {
pwd = list;
} else {
pwd = list.subList(0, len);
}
if (pwd.contains(p)) {
System.out.println("新密碼不能和最近" + len + "次的密碼相同");
return false;
} else {
stringRedisTemplate.boundListOps(key).leftPush(p);
//刪除多餘的密碼
for (int i = list.size(); i >= len; i--) {
stringRedisTemplate.boundListOps(key).rightPop();
}
return true;
}
}
5.集合set應用場景
無序,不能重複
5.1抽獎活動(等級獎品)
對於某些抽獎活動,有很多人蔘與,但中獎者都是按獎品個數隨機抽中的。比如以活動編號是1022的抽獎為例,一共有3個獎品,10個人參與抽獎
1)模擬10人抽獎
> sadd prize:1022 201 1 > sadd prize:1022 202 1 > sadd prize:1022 203 1 > sadd prize:1022 204 1 > sadd prize:1022 205 1 > sadd prize:1022 206 1 > sadd prize:1022 207 1 > sadd prize:1022 208 1 > sadd prize:1022 209 1 > sadd prize:1022 210 1
檢視全部抽獎的人
> smembers prize:1022 201 202 203 204 205 206 207 208 209 210
當然也可看參與抽獎的人數
> scard prize:1022 10
2)從參與者中隨機抽取3人作為中獎者
> srandmember prize:1022 3 208 206 201
在獲取隨機元素時,指定獲取的個數即可。
5.2抽獎活動(不等級獎品)
對於某些抽獎活動,有很多人蔘與,但中獎者都是按獎品個數隨機抽中的。比如以活動編號是1023的抽獎為例,一共有3個獎品(1個一等獎,2個二等獎),10個人參與抽獎
1)模擬10人抽獎
> sadd prize:1023 201 1 > sadd prize:1023 202 1 > sadd prize:1023 203 1 > sadd prize:1023 204 1 > sadd prize:1023 205 1 > sadd prize:1023 206 1 > sadd prize:1023 207 1 > sadd prize:1023 208 1 > sadd prize:1023 209 1 > sadd prize:1023 210 1
檢視全部抽獎的人
> smembers prize:1023 201 202 203 204 205 206 207 208 209 210
2)從參與者中隨機抽取3人作為中獎者
首先抽取一等獎1個
> spop prize:1023 1 206
再抽取二等獎2個
> spop prize:1023 2 207 209
spop用來隨機刪除元素,預設只刪除一個,可指定多個。
6.有序集合Zset應用場景
不可重複,元素根據分數有序。
6.1 朋友圈點贊
在看誰對我點贊時,肯定是按先後順序排列的。可按照點贊時的時間戳作為分值。
6.2實時熱點排行榜
訪問量越高的熱點資訊會排名越靠前,就是所謂的熱搜。可按一段時間內閱讀量作為分值