01 redis的5種基本數據類型的介紹,使用以及應用場景


目錄

redis在線實驗環境

1 Redis概述

1-1 redis的背景知識

redis常常出現在海量用戶以及高並發的場景下,傳統的關系型數據庫存在的問題

1)性能瓶頸:磁盤IO性能低下

  • 降低磁盤IO次數,越低越好(放入內存)

2)擴展瓶頸:數據關系復雜,擴展性差,不便於大規模集群

  • 去除數據間關系,越簡單越好(不存儲關系,僅存儲數據)

非關系數據庫的定義:Not-Only SQL( 泛指非關系型的數據庫),作為關系型數據庫的補充

NoSQL的特點

1)可擴容,可伸縮
2)大數據量下高性能
3)靈活的數據模型
4)高可用  

常見的NoSQL數據庫

Redis
memcache
HBase
MongoDB

1-2 NoSQL在實際場景中的位置(電商為例)

信息特點 對應工具
商品基本信息(名稱,價格,廠商) MySQL
商品附加信息(描述,詳情,評論) MongDB
圖片信息 分布式文件系統
搜索關鍵字 ES、 Lucene、 solr
熱點信息 Redis、 memcache、 tair

總結:MySQL服務器存儲基礎信息並聯通在一起向上層提供服務,上層將基礎數據進行整合划分,比如文檔(mongoDB),

圖片(FastDFS),搜索關鍵字(ES),熱點信息(redis)等。

1-3 Redis定義與特點

概念: Redis (REmote DIctionary Server) 是用 C 語言開發的一個開源的高性能鍵值對( key-value)數據庫。
特征

1.數據間沒有必然的關聯關系
2. 內部采用單線程機制進行工作
3. 高性能。官方提供測試數據, 50個並發執行100000 個請求,讀的速度是110000 次/s,寫的速度是81000次/s。
4. 多數據類型支持(5種)
 字符串類型 string
 列表類型 list
 散列類型 hash
 集合類型 set
 有序集合類型 sorted_set
5.持久化支持。可以進行數據災難恢復  

1-4 Redis的應用場景

1)為熱點數據加速查詢(主要場景),如熱點商品、熱點新聞、熱點資訊、推廣類等高訪問量信息等
2)任務隊列,如秒殺、搶購、購票排隊等
3)即時信息查詢,如各位排行榜、各類網站訪問統計、公交到站信息、在線人數信息(聊天室、網站)、設
備信號等
4)時效性信息控制,如驗證碼控制、投票控制等
5)分布式數據共享,如分布式集群架構中的 session 分離
6)消息隊列
7)分布式鎖

1-5 簡單的使用介紹

啟動界面:如下圖所示,每個Redis程序實例會被分配Port和PID。

服務端

[8280] 03 May 23:21:49.440 # Warning: no config file specified, using the default config. In order to specify a config file use C:\Users\Administrator\Desktop\Redis-x64-3.2.100\redis-server.exe /path/to/redis.conf
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 3.2.100 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 8280
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

[8280] 03 May 23:21:49.452 # Server started, Redis version 3.2.100
[8280] 03 May 23:21:49.453 * The server is now ready to accept connections on port 6379

客戶端啟動(命令行界面):

127.0.0.1:6379>
基本操作命令
set key value                 // 設置key對應的value
get key                       // 獲取key對應的value
clear                         // 清除屏幕信息
quit/exit/<ESC>               // 退出                         

2 Redis數據類型基礎知識

2-1 數據類型概述(重要)

redis重點知識匯總

數據類型 特點 存儲數據類型 應用場景
string 最基本的類型 string 數值型的字符串的使用:1)用於解決數據分表的主鍵重復問題。 2)用於設置數據的生命周期。
hash 適合用於存儲對象 只能存儲字符串,不允許嵌套 用於實現購物車數據的存儲,加快數據的呈現。
list 底層是雙向鏈表 保存數據是string 1)具有操作順序先后的數據的控制(朋友圈點贊用戶顯示)2)最新消息展示(關注順序,日志信息按照時間顯示)
set 可以看成只有key的hash string 1)隨機推薦類信息檢索(信息推薦) 2)信息的檢索(共同好友)3)統計網站PV,UV,IP(去重) 4)黑白名單的維護
sortedset 有序的set集合,相比較set加入score進行排序 1)排行榜數據的顯示。2)定時任務的順序執行(VIP會員到期)3)帶有權重的信息處理次序

String

String數據結構是簡單的key-value類型,value其實不僅可以是String,也可以是數字。常規key-value緩存應用;常規計數:微博數,粉絲數等。

Hash

Hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用於存儲對象,后續操作的時候,你可以直接僅 僅修改這個對象中的某個字段的值。比如我們可以Hash數據結構來存儲用戶信息,商品信息等。

List

list 就是鏈表,Redis list 的應用場景非常多,也是Redis最重要的數據結構之一,比如微博的關注列表,粉絲列表, 消息列表等功能都可以用Redis的 list 結構來實現。

Redis list 的實現為一個雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過帶來了部分額外的內存開銷。

另外可以通過 lrange 命令,就是從某個元素開始讀取多少個元素,可以基於 list 實現分頁查詢,這個很棒的一個功 能,基於 Redis 實現簡單的高性能分頁,可以做類似微博那種下拉不斷分頁的東西(一頁一頁的往下走),性能高。

Set

set 對外提供的功能與list類似是一個列表的功能,特殊之處在於 set 是可以自動排重的。

當你需要存儲一個列表數據,又不希望出現重復數據時,set是一個很好的選擇,並且set提供了判斷某個成員是否在 一個set集合內的重要接口,這個也是list所不能提供的。可以基於 set 輕易實現交集、並集、差集的操作。

比如:在微博應用中,可以將一個用戶所有的關注人存在一個集合中,將其所有粉絲存在一個集合。Redis可以非常 方便的實現如共同關注、共同粉絲、共同喜好等功能。這個過程也就是求交集的過程,具體命令如下:sinterstore key1 key2 key3將交集存在key1內。

Sorted Set

和set相比,sorted set增加了一個權重參數score,使得集合中的元素能夠按score進行有序排列。

舉例:在直播系統中,實時排行信息包含直播間在線用戶列表,各種禮物排行榜,彈幕消息(可以理解為按消息維 度的消息排行榜)等信息,適合使用 Redis 中的 SortedSet 結構進行存儲。


redis相關聯系的常見的業務數據

  • 緩存數據
原始業務功能設計
 秒殺
 618活動
 雙11活動
 排隊購票
2. 運營平台監控到的突發高頻訪問數據
 突發時政要聞,被強勢關注圍觀
3. 高頻、復雜的統計數據
 在線人數
 投票排行榜
  • 附加功能
系統功能優化或升級
 單服務器升級集群
 Session 管理
 Token 管理

redis數據存儲格式

redis 自身是一個 Map,其中所有的數據都是采用 key : value 的形式存儲

  • key只有字符串類型
  • 數據類型通常指的是value的類型!!!!!!!!

2-2 String類型數據

String是最簡單的數據存儲類型,也是最常用的數據存儲類型 。

相關的操作命令

/*單條數據的設置,獲取,刪除*/
set key value
get key
del key
/*多條數據的設置與獲取*/
mset key1 value1 key2 value2 …   
mget key1 key2 …
    
strlen key 
append key value

2-2-1 問題:單條數據操作與多條數據操作的區別?

具體的指令的使用需要結合實際場景與數據規模進行確定,多條指令的優勢在於發送與獲取數據的過程只需要進行一次。通常情況下使用多條指令語句獲取適合大小的批量數據

  • 如果有一個億條數據,我們不能采用一條命令獲取,仍然需要進行切割。
    • Redis采用單線程處理,如果某個操作時間較長,會影響其他操作,所以redis單個操作時間復雜度不能太高。

2-2-2 Redis中String類型應用1:解決數據分表主鍵重復問題

業務場景:大型企業級應用中,分表操作是基本操作,使用多張表存儲同類型數據,但是對應的主鍵 id 必須保證統一性,不能重復。 Oracle 數據庫具有 sequence 設定,可以解決該問題,但是 MySQL數據庫並不具有類似的機制,如何解決分表操作時的可能出現的主鍵重復問題

Redis的解決策略?

基本思路:分表時為每個數據表指定主鍵自增策略,策略在設計的時候避免主鍵id的重復。可以將 redis用於控制數據庫表主鍵id,為數據庫表主鍵提供生成策略,保障數據庫表的主鍵唯一性,此方案適用於所有數據庫,且支持數據庫集群

具體實現:redist提供了數值型的String的增減與減少命令

相關命令

  • 實現String類型數據增減指定數值
incr key
incrby key increment
incrbyfloat key increment
decr key
decrby key increment

實例

127.0.0.1:6379> set num 1
OK
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> get num
"2"
127.0.0.1:6379> incr num 11
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> incrby num 11
(integer) 13
127.0.0.1:6379> decrby num 12
(integer) 1

string類型數據的總結

  • string在redis內部存儲默認就是一個字符串,當遇到增減類操作incr, decr時會轉成數值型進行計算

  • redis所有的操作都是原子性的,采用單線程處理所有業務,命令是一個一個執行的,因此無需考慮並發帶來的數據影響。

注意: 按數值進行操作的數據,如果原始數據不能轉成數值,或超越了redis 數值上限范圍,將報錯(數據范圍與long類型的數據范圍一致)

127.0.0.1:6379> set key ddd
OK
127.0.0.1:6379> incr key 1
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> incrby key 1            // string是'ddd',所有無法進行自增/減
(error) ERR value is not an integer or out of range
127.0.0.1:6379>

2-2-3 Redis中String類型應用2:設置數據指定的生命周期

應用場景

1)每個微信號每 4 小時只能投1票。
2)每種商品熱門期維持3天, 3天后自動取消熱門.
3)熱點新聞最大的特征是時效性,如何自動控制熱點新聞的時效性。

設置數據的生存周期指令

setex key seconds value
psetex key milliseconds value
  • redis 控制數據的生命周期,通過數據是否失效控制業務行為,適用於所有具有時效性限定控制的操作

2-2-4 Redis中String類型應用3:各種結構型和非結構型高熱度數據訪問加速

實例:微博用戶粉絲數,關注數,微博數的顯示。

采用redis存儲,value就是粉絲數/關注數/微博數目。key的名稱通常按照以下規則設定:

表名 主鍵名 主鍵值 字段值

具體實現

方式1:以用戶主鍵和屬性值作為key,后台設定定時刷新策略

127.0.0.1:6379> set user:id:3506728370:fans 12210947
OK
127.0.0.1:6379> set user:id:3506728370:blogs 6164
OK
127.0.0.1:6379> set user:id:3506728370:focuss 83
OK
127.0.0.1:6379> get user:id:3506728370:focuss
"83"
127.0.0.1:6379> incr user:id:3506728370:focuss
(integer) 84

方式2:在redis中以json格式存儲用戶信息作為value,key采用表名+主鍵名+主鍵id,定時刷新(也可以使用hash類型)

2-2-5 redis中String數據使用注意點

數據操作不成功的反饋與數據正常操作之間的差異
string 類型數據操作的注意事項
1)表示運行結果是否成功
 (integer) 0 → false 失敗
 (integer) 1 → true 成功
2)表示運行結果值
 (integer) 3 → 3 3個
 (integer) 1 → 1 1個
3)數據未獲取到
(nil)等同於null
4)數據最大存儲量
512MB
5)數值計算最大范圍( java中的long的范圍)

2-3 hash類型數據

注意:hash數據是指value的類型是hash表

2-3-1 hash類型數據的定義與使用

特點:單個存儲空間保存多個鍵值對數據,適用於對一系列存儲的數據進行編組,方便管理

基本命令

/*數據的基本操作*/
hset key field value           
hget key field
hgetall key
hdel key field1 [field2]

hmset key field1 value1 field2 value2  // 添加/修改多個數據
hmget key field1 field2 …              // 獲取多個數據
hlen key                               // 獲取哈希表中字段的數量
hexists key field                      // 獲取哈希表中是否存在指定的字段

/*獲取哈希表中所有的字段名或字段值*/
hkeys key
hvals key
/*設置指定字段的數值數據增加指定范圍的值*/
hincrby key field increment
hincrbyfloat key field increment

實例

127.0.0.1:6379> hset user name zhangsan   // 設置單個hash類型數據
(integer) 1
127.0.0.1:6379> hset user age 38
(integer) 1
127.0.0.1:6379> hset user weight 80
(integer) 1
127.0.0.1:6379> hgetall user            // 顯示hash類型數據所有的key與value
1) "name"
2) "zhangsan"
3) "age"
4) "38"
5) "weight"
6) "80"
127.0.0.1:6379> hget user name          // 根據value的field獲取值
"zhangsan"
127.0.0.1:6379> hdel user weight
(integer) 1
127.0.0.1:6379> hgetall user
1) "name"
2) "zhangsan"
3) "age"
4) "38"
127.0.0.1:6379> hmset name dog age 11    // 批量修改值
(error) ERR wrong number of arguments for HMSET
127.0.0.1:6379> hmset user name dog age 11
OK
127.0.0.1:6379> hgetall user
1) "name"
2) "dog"
3) "age"
4) "11"
127.0.0.1:6379> hlen user                // 查看value中field的數量
(integer) 2

2-3-2 Redis中hash類型數據的使用注意點

1)hash類型下的value只能存儲字符串,不允許存儲其他數據類型,不存在嵌套現象。如果數據未獲取到,對應的值為( nil)
2)每個 hash 可以存儲 232 - 1 個鍵值對
3)hash類型十分貼近對象的數據存儲形式,並且可以靈活添加刪除對象屬性。但hash設計初衷不是為了存儲大量對象而設計的,切記不可濫用,更不可以將hash作為對象列表使用
4)hgetall 操作可以獲取全部屬性,如果內部field過多,遍歷整體數據效率就很會低,有可能成為數據訪問瓶頸

2-3-3 redis的hash類型數據應用1:實現購物車

實現策略

存儲結構

  • 每個用戶id作為key
  • value是hash類型數據,其中商品id是field,商品的數量則是該field對應的數值。

數據操作方式

  • 添加商品:追加全新的field與value
  • 瀏覽:遍歷hash
  • 更改數量
hincrby
  • 刪除商品:刪除
hdel

方案注意點:redis僅僅能夠實現購物車的redis存儲模型,添加、瀏覽、更改數量、刪除、清空

購物車實際實現時需要考慮的問題

 購物車於數據庫間持久化同步
 購物車於訂單間關系
提交購物車:讀取數據生成訂單
商家臨時價格調整:隸屬於訂單級別
 未登錄用戶購物車信息存儲
cookie存儲
redis如何加速購物車數據的呈現?

數據設計:

  • key是用戶id
  • value是hash類型數據,具有2個field(key:value鍵值對):
    • 第一個key:value即key(商品id:nums),value(商品數量) (每個用戶私有的數據
    • 第二個key:value即key商品id:nums),value(商品的信息,json格式) (商品信息數據是可以共享的,並非用戶私有的
127.0.0.1:6379> hmset 003 G01:nums 100 G01:info {....}   // hmset 用戶id key1 該商品在購物車數量  key2 該商品信息 
OK
127.0.0.1:6379> hgetall 003
1) "G01:nums"
2) "100"
3) "G01:info"
4) "{....}"

注意:第二個key:value信息可以抽取出來作為公共信息獲取(獨立的hash),避免相同的數據反復查詢。

特別的命令

//插入(如果已存在同名的field,會被覆蓋)
hset key field value
hmset key field1 value1 field2 value2...
//插入(如果已存在同名的field,不會被覆蓋)
hsetnx key field value

hash數據類型其他的應用場景:redis 應用於搶購,限購類、限量發放優惠卷、激活碼等業務的數據存儲設計

2-4 list類型數據

2-4-1 list的特點與基本命令

特點

  • 數據存儲需求:存儲多個數據,並對數據進入存儲空間的順序進行區分
  • list類型:保存多個數據,底層使用雙向鏈表存儲結構實現

基本命令

// 添加修改數據,lpush為從左邊添加,rpush為從右邊添加
lpush key value1 value2 value3...
rpush key value1 value2 value3...

//查看數據, 從左邊開始向右查看. 如果不知道list有多少個元素,end的值可以為-1,代表倒數第一個元素
//lpush先進的元素放在最后,rpush先進的元素放在最前面
lrange key start end
//得到長度
llen key
//取出對應索引的元素
lindex key index

//獲取並移除元素(從list左邊或者右邊移除)
lpop key
rpop key

//規定時間內獲取並移除數據,b=block,給定一個時間,如果在指定時間內放入了元素,就移除
blpop key1 key2... timeout
brpop key1 key2... timeout

//移除指定元素 count:移除的個數 value:移除的值。 移除多個相同元素時,從左邊開始移除
lrem key count value

實例

127.0.0.1:6379> lpush list1 huawei
(integer) 1
127.0.0.1:6379> lpush list1 apple
(integer) 2
127.0.0.1:6379> lpush list1 microsoft
(integer) 3
127.0.0.1:6379> lrange list1 start stop
1) "microsoft"
2) "apple"
3) "huawei"
127.0.0.1:6379> lindex list1 1
"apple"
127.0.0.1:6379> lrange list1 0 -1
1) "microsoft"
2) "apple"
3) "huawei"

2-4-2 redis中list的應用1:具有操作順序先后的數據的控制

實際場景:微信朋友圈的點贊,需要按照點贊順序顯示好友的信息,如果取消點贊則移除對應好友的信息

2-4-3 Redis中list數據類型的應用2:最新消息展示

實際場景

1)twitter、新浪微博、騰訊微博中個人用戶的關注列表需要按照用戶的關注順序進行展示
2)粉絲列表需要將最近關注的粉絲列在前面
3) 新聞、資訊類網站如何將最新的新聞或資訊按照發生的時間順序展示
4) 企業運營過程中,系統將產生出大量的運營數據,保障多台服務器操作日志的統一順序輸出

解決策略

解決方案
 依賴list的數據具有順序的特征對信息進行管理
 使用隊列模型解決多路信息匯總合並的問題
 使用棧模型解決最新消息的問題

2-4-4 list數據類型使用注意點

  • list中保存的數據都是string類型的,數據總容量是有限的,最多232 - 1 個元素 (4294967295)。
  • list具有索引的概念,但是操作數據時通常以隊列的形式進行入隊出隊操作,或以棧的形式進行入棧出棧操作
  • 獲取全部數據操作結束索引設置為-1
  • list可以對數據進行分頁操作,通常第一頁的信息來自於list,第2頁及更多的信息通過數據庫的形式加載(加快數據的顯示)

2-5 set類型數據

2-5-1 set數據特點以及基本命令

特點

  • 存儲大量的數據,在查詢方面提供更高的效率
  • 與hash存儲結構完全相同,僅存儲鍵,不存儲值( nil),並且鍵是不允許重復的

基本操作命令

//添加元素
sadd key member1 member2...

//查看元素
smembers key

//移除元素
srem key member

//查看元素個數
scard key

//查看某個元素是否存在
sismember key member

//從set中任意選出count個元素
srandmember key count

//從set中任意選出count個元素並移除
spop key count

//求兩個集合的交集、並集、差集
sinter key1 key2...
sunion key1 key2...
sdiff key1 key2...   
//求兩個set的交集、並集、差集,並放入另一個set中
sinterstore destination key1 key2...
sunionstore destination key1 key2...
sdiffstore destination key1 key2...

//求指定元素從原集合放入目標集合中
smove source destination key

2-5-2 redis中set應用1:隨機推薦類信息檢索

redis 應用於隨機推薦類信息檢索,例如熱點歌單推薦,熱點新聞推薦,熱賣旅游線路,應用APP推薦,大V推薦等

實際場景:每位用戶首次使用今日頭條時會設置3項愛好的內容,但是后期為了增加用戶的活躍度、興趣點,必須讓用戶
對其他信息類別逐漸產生興趣,增加客戶留存度,如何實現?

使用set類型數據實現: 用戶關注信息分類中的熱點信息 + 其他類別的挑選的熱點信息結合 = 總的信息結合 => 總的信息集合中隨機挑選一部分信息作為最終展示

set中提供了隨機選擇集合中數據的方法

srandmember key [count]   //  隨機獲取集合中指定數量的數據
spop key [count]          //  隨機獲取集合中的某個數據並將該數據移出集合

2-5-3 redis中set應用2:同類信息的關聯搜索,二度關聯搜索,深度關聯搜索

具體應用場景

  • 顯示共同關注(一度)
  • 顯示共同好友(一度)
  • 由用戶A出發,獲取到好友用戶B的好友信息列表(一度)
  • 由用戶A出發,獲取到好友用戶B的購物清單列表(二度)
  • 由用戶A出發,獲取到好友用戶B的游戲充值列表(二度)

2-5-4 redis中set去重應用3:統計網站的PV(Page View),UV(Unique Visitor,) ,IP(獨立IP)。

業務場景:公司對旗下新的網站做推廣,統計網站的PV(訪問量) ,UV(獨立訪客) ,IP(獨立IP)。

  • PV:網站被訪問次數,可通過刷新頁面提高訪問量
  • UV:網站被不同用戶訪問的次數,可通過cookie統計訪問量,相同用戶切換IP地址, UV不變
  • IP:網站被不同IP地址訪問的總次數,可通過IP地址統計訪問量,相同IP不同用戶訪問, IP不變

解決方案

* 利用set集合的數據去重特征,記錄各種訪問數據
* 建立string類型數據,利用incr統計日訪問量( PV)
* 建立set模型,記錄不同cookie數量( UV)
* 建立set模型,記錄不同IP數量( IP)

2-5-5 redis中set應用4:基於黑名單與白名單設定的服務控制

業務場景

黑名單的作用:基於技術層面區分出爬蟲用戶后,需要將此類用戶進行有效的屏蔽,這就是黑名單的典型應用

  • 資訊類信息類網站追求高訪問量,但是由於其信息的價值,往往容易被不法分子利用,通過爬蟲技術,
    快速獲取信息,個別特種行業網站信息通過爬蟲獲取分析后,可以轉換成商業機密進行出售。例如第三方火
    車票、機票、酒店刷票代購軟件,電商刷評論、刷好評。
  • 爬蟲帶來的偽流量也會給經營者帶來錯覺,產生錯誤的決策,有效避免網站被爬蟲反復爬取成為每
    個網站都要考慮的基本問題
  • 有些小型網站需要爬蟲為其帶來一些流量。

白名單的作用:對於安全性更高的應用訪問,僅僅靠黑名單是不能解決安全問題的,此時需要設定可訪問的用戶群體,
依賴白名單做更為苛刻的訪問驗證。
解決方案(利用set集合維護黑名單)

 基於經營戰略設定問題用戶發現、鑒別規則
 周期性更新滿足規則的用戶黑名單,加入set集合
 用戶行為信息達到后與黑名單進行比對,確認行為去向
 黑名單過濾IP地址:應用於開放游客訪問權限的信息源
 黑名單過濾設備信息:應用於限定訪問設備的信息源
 黑名單過濾用戶:應用於基於訪問權限的信息源

2-5-6 set類型的數據使用注意事項

  • set 類型不允許數據重復,如果添加的數據在 set 中已經存在,將只保留一份
  • set 雖然與hash的存儲結構相同,但是無法啟用hash中存儲值的空間

2-6 sortedSet類型數據

2-6-1 sortedset數據特點以及基本命令

sortedset:需要對數據的進行有序的展示

與set類型數據的區別:除了key以外增加了score列

基本命令

//插入元素, 需要指定score(用於排序)
zadd key score1 member1 score2 member2

//查看元素(score升序), 當末尾添加withscore時,會將元素的score一起打印出來
zrange key start end (withscore)
//查看元素(score降序), 當末尾添加withscore時,會將元素的score一起打印出來
zrevrange key start end (withscore)

//移除元素
zrem key member1 member2...

//按條件獲取數據, 其中offset為索引開始位置,count為獲取的數目
zrangebyscore key min max [withscore] [limit offset count]
zrevrangebyscore key max min [withscore] [limit offset count]

//按條件移除元素
zremrangebyrank key start end
zremrangebysocre key min max
//按照從大到小的順序移除count個值
zpopmax key [count]
//按照從小到大的順序移除count個值
zpopmin key [count]

//獲得元素個數
zcard key

//獲得元素在范圍內的個數
zcount min max

//求交集、並集並放入destination中, 其中numkey1為要去交集或並集集合的數目
zinterstore destination numkeys key1 key2...
zunionstore destination numkeys key1 key2...

//查看某個元素的索引(排名)
zrank key member
zrevrank key member

//查看某個元素索引的值
zscore key member
//增加某個元素索引的值
zincrby key increment member

注意

  • min與max 用於限定搜索查詢的條件
  • start與stop用於限定查詢范圍,作用於索引,表示開始和結束索引
  • offset與count用於限定查詢范圍,作用於查詢結果,表示開始位置和數據總量

實例

127.0.0.1:6379> zadd scores 94 zs
(integer) 1
127.0.0.1:6379> zadd scores 100 ls
(integer) 1
127.0.0.1:6379> zadd scores 60 ww
(integer) 1
127.0.0.1:6379> zadd scores 47 zl
(integer) 1
127.0.0.1:6379> zrange scores 0 -1
1) "zl"
2) "ww"
3) "zs"
4) "ls"
127.0.0.1:6379> zrange scores 0 -1 WITHSCORES
1) "zl"
2) "47"
3) "ww"
4) "60"
5) "zs"
6) "94"
7) "ls"
8) "100"
127.0.0.1:6379> zrevrange scores 0 -1
1) "ls"
2) "zs"
3) "ww"
4) "zl"
127.0.0.1:6379> zrem scores ww
(integer) 1

2-6-2 redis中sortedsort的應用1: 排行榜功能的實現

業務場景

票選廣東十大傑出青年,各類綜藝選秀海選投票,各類資源網站TOP10(電影,歌曲,文檔,電商,游戲等)聊天室活躍度統計游戲好友親密度,為所有參與排名的資源建立排序依據

實現策略:利用redis的sortedsort顯示排名

//查看某個元素的索引(排名)
zrank key member
zrevrank key member

//查看某個元素索引的值
zscore key member
//增加某個元素索引的值
zincrby key increment member

2-6-4 redis中sortedsort的應用2: 定時任務執行順序管理或任務過期管理

業務場景

  • 用戶VIP到期管理
  • 投票、討論,限時進行,逾期作廢管理

實現策略

基本思想:對於基於時間線限定的任務處理,將處理時間作為redis的sortedset的score值,利用排序功能區分處理的先后順序

  • 當到期后處理對應任務,移除redis中的記錄,並記錄下一個要處理的時
  • 當新任務加入時,判定並更新當前下一個要處理的任務時間
  • 為提升sorted_set的性能,通常將任務根據特征存儲成若干個sorted_set。例如1小時內, 1天內,
    月內,季內,年度等,操作時逐級提升,將即將操作的若干個任務納入到1小時內處理的隊列中

2-6-5 redis中sortedsort的應用3: 即時任務/消息隊列執行管理

業務場景:任務/消息權重設定應用
當任務或者消息待處理,形成了任務隊列或消息隊列時,對於高優先級的任務要保障對其優先處理

實現策略

  • 對於帶有權重的任務,優先處理權重高的任務,將任務的權重作為sortedset中score即可

如果排序的指標有多個,但是score只有一個,該如何設計score權重?(多條件任務權重設定 )

實例:

指標1:外貿訂單優先於國內訂單

指標2:總裁訂單優先於員工訂單,經理訂單優先於員工訂單

score設計策略:先設定訂單類別,后設定訂單發起角色類別,整體score長度必須是統一的,不足位補0。

  • 例如外貿101,國內102,經理004,員工008,則員工下的外貿單score值為101008(優先),經理下的國內單score值為102004 。

2-6-6 sortedset的使用注意點

sortedsort中score的注意點(score是排序的依據)

  • score保存的數據存儲空間是64位,整數范圍就是long的范圍
  • score保存的數據也可以是一個雙精度的double值,基於雙精度浮點數的特征,可能會丟失精度,使用時
    候要慎重
  • sorted_set 底層存儲還是基於set結構的,數據不能重復,如果重復, score值將被反
    復覆蓋,保留最后一次修改的結果

3 redis的各種數據類型的綜合應用

3-1 業務場景:限制用戶每分鍾的服務使用次數(10次)

人工智能領域的語義識別與自動對話將是未來服務業機器人應答呼叫體系中的重要技術,百度自研用戶評價語義識別服務,免費開放給企業試用,同時訓練百度自己的模型。現對試用用戶的使用行為進行限速,限制每個用戶每分鍾最多發起10次調用
解決方法
step1:由用戶進行服務調用,先根據用戶的uid判斷當前用戶是否再redis中有記錄。
step2:情況1:沒有記錄,則新建一個生命周期為60s的string記錄,並將次數累加。情況2:有記錄,判斷次數是否已達上限,沒有則累加,有則拒絕提供服務,知道記錄消失,即用戶可在一個時間段獲取用戶訪問的次數。

上面的解決方案中每次用戶訪問都需要判斷使用次數是否已達上限,這個判斷可以通過將初始值設置為 Long.MAX_VALUE-訪問次數

  • 遇到異常即+操作超過上限,視為使用達到上限

實際操作

127.0.0.1:6379> get 415                               // 判斷該用戶關聯記錄是否存在
(nil)
127.0.0.1:6379> setex 415 60 9223372036854775797      // 設置記錄初始值為 Long.MAX_VALUE-10,記錄生命周期為60s
OK
127.0.0.1:6379> incrby 415 10                         // 60s內用戶的訪問次數達到10次    
(integer) 9223372036854775807
(2.08s)
127.0.0.1:6379> incr 415                              // 60s內用戶第11次訪問
(error) ERR increment or decrement would overflow     // 60s訪問次數達到上限,數值溢出,拋出異常,拒絕為用戶提供服務
127.0.0.1:6379> incr 415
(error) ERR increment or decrement would overflow
127.0.0.1:6379> incr 415
(error) ERR increment or decrement would overflow
127.0.0.1:6379> incr 415
(error) ERR increment or decrement would overflow
127.0.0.1:6379> incr 415                            // 60s到達,老的用戶記錄消失,用戶又可以獲取10次服務調用
(integer) 1

3-2 業務場景:**基於時間順序的數據操作,而不關注具體時間 **

場景介紹

使用微信的過程中,當微信接收消息后,會默認將最近接收的消息置頂,當多個好友及關注的訂閱號同時發
送消息時,該排序會不停的進行交替。同時還可以將重要的會話設置為置頂。一旦用戶離線后,再次打開微
信時,消息的顯示方法

解決策略

 依賴list的數據具有順序的特征對消息進行管理,將list結構作為棧使用
對置頂與普通會話分別創建獨立的list分別管理
 當某個list中接收到用戶消息后,將消息發送方的id從list的一側加入list(此處設定左側)
 多個相同id發出的消息反復入棧會出現問題,在入棧之前無論是否具有當前id對應的消息,先刪除對應id
 推送消息時先推送置頂會話list,再推送普通會話list,推送完成的list清除所有數據
 消息的數量,也就是微信用戶對話數量采用計數器的思想另行記錄,伴隨list操作同步更新

3-3 redis的各種數據類型應用匯總(重要)

 Tips 1: redis用於控制數據庫表主鍵id,為數據庫表主鍵提供生成策略,保障數據庫表的主鍵唯一性
 Tips 2: redis 控制數據的生命周期,通過數據是否失效控制業務行為,適用於所有具有時效性限定控制的操作
 Tips 3: redis應用於各種結構型和非結構型高熱度數據訪問加速
 Tips 4: redis 應用於購物車數據存儲設計
 Tips 5: redis 應用於搶購,限購類、限量發放優惠卷、激活碼等業務的數據存儲設計
 Tips 6: redis 應用於具有操作先后順序的數據控制
 Tips 7: redis 應用於最新消息展示
 Tips 8: redis 應用於隨機推薦類信息檢索,例如熱點歌單推薦,熱點新聞推薦,熱賣旅游線路,應用APP推薦,大V推薦等
 Tips 9: redis 應用於同類信息的關聯搜索,二度關聯搜索,深度關聯搜索
 Tips 10: redis 應用於同類型不重復數據的合並、取交集操作
 Tips 11: redis 應用於同類型數據的快速去重
 Tips 12: redis 應用於基於黑名單與白名單設定的服務控制
 Tips 13: redis 應用於計數器組合排序功能對應的排名
 Tips 14: redis 應用於定時任務執行順序管理或任務過期管理
 Tips 15: redis 應用於及時任務/消息隊列執行管理
 Tips 16: redis 應用於按次結算的服務控制
 Tips 17: redis 應用於基於時間順序的數據操作,而不關注具體時間

4 redis中key的通用操作

4-1 Key的特征

  • key是一個字符串,通過key獲取redis中保存的數據

4-2 Key的操作

基本操作
//查看key是否存在
exists key

//刪除key
del key

//查看key的類型
type keyCopy
拓展操作(時效性操作)
//設置生命周期
expire key seconds
pexpire key milliseconds

//查看有效時間, 如果有有效時間則返回剩余有效時間, 如果為永久有效,則返回-1, 如果Key不存在則返回-2
ttl key
pttl key

//將有時限的數據設置為永久有效
persist keyCopy
拓展操作(查詢操作)
//根據key查詢符合條件的數據
keys patternCopy

查詢規則

拓展操作(其他操作)
//重命名key,為了避免覆蓋已有數據,盡量少去修改已有key的名字,如果要使用最好使用renamenx
rename key newKey
renamenx key newKey

//查看所有關於key的操作, 可以使用Tab快速切換
help @genericCopy

5 redis中數據庫通用操作

5-1 數據庫

  • Redis為每個服務提供有16個數據庫,編號從0到15
  • 每個數據庫之間的數據相互獨立

5-2 基本操作

//切換數據庫 0~15
select index

//其他操作
quit
ping
echo massageCopy

5-3 拓展操作

//移動數據, 必須保證目的數據庫中沒有該數據
mov key db
//查看該庫中數據總量
dbsize

參考資料

01 Nyima的博客之redis的學習

02 redis的基礎課程

03 redis重點知識匯總

04 JavaGuide的Redis數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM