文章目錄
- redis 自身是一個 Map,其中所有的數據都是採用 key : value 的形式存儲
- 數據類型指的是存儲的數據的類型,也就是 value 部分的類型, key 部分永遠都是字符串
1. String及應用場景
spring結構:key+value
1.基本操作
//設置String
set key value
mset key1 value1 key2 value2...
//設置生命週期
setex key seconds value
//得到String
get key
mget key1 key2...
//刪除String
del key
//向字符串的後面追加字符,如果有就補在後面,如果沒有就新建
append key value
2.string 類型數據的擴展操作
增減數值操作
//增長指令,只有當value爲數字時才能增長
incr key
incrby key increment
incrbyfloat key increment
//減少指令,有當value爲數字時才能減少
decr key
decrby key increment
- string在redis內部存儲默認就是一個字符串,當遇到增減類操作incr,decr時會轉成數值型進行計算。
- redis所有的操作都是原子性的,採用單線程處理所有業務,命令是一個一個執行的,因此無需考慮併發帶來的數據影響。
- 注意:按數值進行操作的數據,如果原始數據不能轉成數值,或超越了redis 數值上限範圍,將報錯。 9223372036854775807(java中long型數據最大值,Long.MAX_VALUE)
tips:
redis用於控制數據庫表主鍵id,爲數據庫表主鍵提供生成策略,保障數據庫表的主鍵唯一性
此方案適用於所有數據庫,且支持數據庫集羣
指定生命週期
//設置數據的生命週期,單位 秒
setex key seconds value
//設置數據的生命週期,單位 毫秒
psetex key milliseconds value
tips
redis 控制數據的生命週期,通過數據是否失效控制業務行爲,適用於所有具有時效性限定控制的操作
命名規範
3.應用場景
1)業務場景
主頁高頻訪問信息顯示控制,例如新浪微博大V主頁顯示粉絲數與微博數量
2)解決方案
2.Hash(Hashmap)和使用場景
hash結構:大key+ 小key +value
- 新的存儲需求:對一系列存儲的數據進行編組,方便管理,典型應用存儲對象信息
- 需要的存儲結構:一個存儲空間保存多個鍵值對數據
- hash類型:底層使用哈希表結構實現數據存儲
hash存儲結構優化
- 如果field數量較少,存儲結構優化爲類數組結構
- 如果field數量較多,存儲結構使用HashMap結構
1.基本操作
//插入(如果已存在同名的field,會被覆蓋)
hset key field value
hmset key field1 value1 field2 value2...
//插入(如果已存在同名的field,不會被覆蓋)
hsetnx key field value
//取出
hget key field
hgetall key
//刪除
hdel key field1 field2...
//獲取field數量
hlen key
//查看是否存在
hexists key field
//獲取哈希表中所有的字段名或字段值
hkeys key
hvals key
//設置指定字段的數值數據增加指定範圍的值
hincrby key field increment
hdecrby key field increment
2.hash 類型數據操作的注意事項
- hash類型下的value只能存儲字符串,不允許存儲其他數據類型,不存在嵌套現象。如果數據未獲取到, 對應的值爲(nil)
- 每個 hash 可以存儲 2^32 - 1 個鍵值
- hash類型十分貼近對象的數據存儲形式,並且可以靈活添加刪除對象屬性。但hash設計初衷不是爲了存儲大量對象而設計的,切記不可濫用,更不可以將hash作爲對象列表使用
- hgetall 操作可以獲取全部屬性,如果內部field過多,遍歷整體數據效率就很會低,有可能成爲數據訪問瓶頸
3.應用場景
1)業務場景
雙11活動日,銷售手機充值卡的商家對移動、聯通、電信的30元、 50元、 100元商品推出搶購活動,每種商品搶購上限1000張
2)解決方案
- 以商家id作爲key
- 將參與搶購的商品id作爲field
- 將參與搶購的商品數量作爲對應的value
- 搶購時使用降值的方式控制產品數量
- 這裏redis 應用於搶購,限購類、限量發放優惠卷、激活碼等業務的數據存儲設計
3. List(有序可重複)和使用場景
list結構:key + value列表
- 數據存儲需求:存儲多個數據,並對數據進入存儲空間的順序進行區分
- 需要的存儲結構:一個存儲空間保存多個數據,且通過數據可以體現進入順序
- list類型:保存多個數據,底層使用雙向鏈表存儲結構實現
- 元素有序,且可重
1.基本操作
左進左出是棧;左進右出是隊列。從哪邊進和出都可以
//添加修改數據,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
2. 注意事項
- list中保存的數據都是string類型的,數據總容量是有限的,最多2^32 - 1 個元素 (4294967295)。
- list具有索引的概念,但是操作數據時通常以隊列的形式進行入隊出隊(lpush, rpop)操作,或以棧的形式進行入棧出棧(lpush, lpop)操作
- 獲取全部數據操作結束索引設置爲-1 (倒數第一個元素)
- list可以對數據進行分頁操作,通常第一頁的信息來自於list,第2頁及更多的信息通過數據庫的形式加載
3.應用場景(順序性)
1)業務場景
twitter、新浪微博、騰訊微博中個人用戶的關注列表需要按照用戶的關注順序進行展示,粉絲列表需要將最近關注的粉絲列在前面
2)解決方案
- 依賴list的數據具有順序的特徵對信息進行管理
- 使用隊列模型解決多路信息彙總合併的問題
- 使用棧模型解決最新消息的問題
- 這裏redis 應用於最新消息展示
4. set (無序不可重複)和場景
set結構:大key +小key(相當於存value),Hash中的value值爲nil
- 新的存儲需求:存儲大量的數據,在查詢方面提供更高的效率
- 需要的存儲結構:能夠保存大量的數據,高效的內部存儲機制,便於查詢
- set類型:與hash存儲結構完全相同,僅存儲鍵,不存儲值( nil),並且值是不允許重複的
1.基本操作
//添加元素
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. sorted_set(無序不重複但排列有序)
Zset結構:大key+ 小key(相當於value) +排序號
- 不重但有序(score)
- 新的存儲需求:數據排序有利於數據的有效展示,需要提供一種可以根據自身特徵進行排序的方式
- 需要的存儲結構:新的存儲模型,可以保存可排序的數據
- sorted_set類型:在set的存儲結構基礎上添加可排序字段
1.基本操作
//插入元素, 需要指定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...
注意
- min與max用於限定搜索查詢的條件
- start與stop用於限定查詢範圍,作用於索引,表示開始和結束索引
- offset與count用於限定查詢範圍,作用於查詢結果,表示開始位置和數據總量
2. 拓展操作
//查看某個元素的索引(排名)
zrank key member
zrevrank key member
//查看某個元素索引的值
zscore key member
//增加某個元素索引的值
zincrby key increment member
注意事項
- score保存的數據存儲空間是64位,如果是整數範圍是-9007199254740992~9007199254740992
- score保存的數據也可以是一個雙精度的double值,基於雙精度浮點數的特徵,可能會丟失精度,使用時候要慎重
- sorted_set 底層存儲還是基於set結構的,因此數據不能重複,如果重複添加相同的數據,score值將被反覆覆蓋,保留最後一次修改的結果
3.場景
- redis 應用於計數器組合排序功能對應的排名。與list類似,只是sortSet不能重複而且排列還得有序。
- redis 應用於定時任務執行順序管理或任務過期管理。
6. 應用場景總結
String場景
- Tips 1: redis用於控制數據庫表主鍵id,爲數據庫表主鍵提供生成策略,保障數據庫表的主鍵唯一性
- Tips 2: redis 控制數據的生命週期,通過數據是否失效控制業務行爲,適用於所有具有時效性限定控制的操作
- Tips 3: redis應用於各種結構型和非結構型高熱度數據訪問加速
Hash場景
- Tips 4: redis 應用於購物車數據存儲設計
- Tips 5: redis 應用於搶購,限購類、限量發放優惠卷、激活碼等業務的數據存儲設計
list場景
- Tips 6: redis 應用於具有操作先後順序的數據控制
- Tips 7: redis 應用於最新消息展示
set場景
- Tips 8: redis 應用於隨機推薦類信息檢索,例如熱點歌單推薦,熱點新聞推薦,熱賣旅遊線路,應用APP推薦,大V推薦等
- Tips 9: redis 應用於同類信息的關聯搜索,二度關聯搜索,深度關聯搜索
- Tips 10: redis 應用於同類型不重複數據的合併、取交集操作
- Tips 11: redis 應用於同類型數據的快速去重
- Tips 12: redis 應用於基於黑名單與白名單設定的服務控制
sorted_set 場景
- Tips 13: redis 應用於計數器組合排序功能對應的排名
- Tips 14: redis 應用於定時任務執行順序管理或任務過期管理
- Tips 15: redis 應用於及時任務/消息隊列執行管理
7. 通用指令
基本操作
//切換數據庫 0~15
select index
//其他操作
quit
ping
echo massage
拓展操作
//移動數據, 必須保證目的數據庫中沒有該數據
mov key db
//查看該庫中數據總量
dbsize