1. 程式人生 > 其它 >Redis儲存結構及應用場景

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實時熱點排行榜

訪問量越高的熱點資訊會排名越靠前,就是所謂的熱搜。可按一段時間內閱讀量作為分值