一 :Redis 簡介
redis 是目前最受歡迎的NoSql 數(shù)據(jù)庫辖所,是以內(nèi)存作為數(shù)據(jù)存儲(chǔ)介質(zhì)透且,所以讀寫數(shù)據(jù)的效率極高性誉,遠(yuǎn)遠(yuǎn)超過數(shù)據(jù)庫捌臊。
redis的存儲(chǔ)分為內(nèi)存存儲(chǔ)杨蛋、磁盤存儲(chǔ)和log文件三部分,重啟后理澎,Redis可以從磁盤重新將數(shù)據(jù)加載到內(nèi)存中逞力,此特性保證了數(shù)據(jù)的持久化。
今天主要簡單的介紹下 redis的五種數(shù)據(jù)結(jié)構(gòu)及其簡單運(yùn)用糠爬。
二 :String 結(jié)構(gòu)與應(yīng)用場景
1寇荧、單值緩存
set key value
get key
2、對(duì)象緩存
mset key value [key value …]
mget key [key …]
3执隧、分布式鎖
setnx key value [set if not exists]
key 不存在時(shí)揩抡,設(shè)置成功,返回 1镀琉,key 存在則不做任何操作 返回0
比如對(duì)一個(gè)商品 Logitech:gpw 進(jìn)行加鎖峦嗤,因?yàn)閞edis 是單線程的,只有一個(gè)加鎖成功屋摔,其他返回加鎖失敗寻仗,操作如下:
4、web集群session 共享
使用spring session + redis 實(shí)現(xiàn) session 共享
5凡壤、計(jì)數(shù)器
incr key
應(yīng)用場景 :
①:如右圖的閱讀數(shù)
②:對(duì)于自增需要的處理
@Autowired
private RedisTemplate redisTemplate;
/**
* TS+日期+4位數(shù)字
*
* @return
*/
public String getComplaintCode() {
SimpleDateFormat dfst = new SimpleDateFormat("yyyyMMdd");
String newDate = dfst.format(new Date());
String complaintCode = "";
Long incr = this.incr("complaintRepair" + newDate, 24);
if (incr == 0) {
incr = this.incr("complaintRepair" + newDate, 24);
}
DecimalFormat df = new DecimalFormat("0000");
complaintCode = "TS" + newDate + df.format(incr);
return complaintCode;
}
public Long incr(String key, long liveTime) {
RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
Long increment = entityIdCounter.getAndIncrement();
if ((null == increment || increment.longValue() == 0) && liveTime > 0) {//初始設(shè)置過期時(shí)間
entityIdCounter.expire(liveTime, TimeUnit.HOURS);
}
return increment;
}
三 :Hash 結(jié)構(gòu)與應(yīng)用場景
1署尤、單值緩存
hset key field value
hset key field
2耙替、對(duì)象緩存
hmset key field value [field value ...]
hmget key field [field ...]
3、舉例說明
工作中很少用hset 曹体,就舉例說明:下圖主要信息有 :購物車商品數(shù)量俗扇,購物車單個(gè)商品id及數(shù)量,可以全選商品箕别,增加數(shù)量铜幽,刪除商品等操作,具體如下
購物車 :
①:以用戶id 為key
②:商品id 為field
③:商品數(shù)量為value
購物車操作 :
①:添加商品 ? hset wangch:7456 bose:1 1
②:增加數(shù)量 ? hincrby wangch:7456 bose:1 1
③:商品總數(shù) ? hlen wangch:7456
④:刪除商品 ? hdel wangch:7456 bose:1
⑤:獲取購物車所有商品 ? hgetall wangch:7456
4串稀、hash 結(jié)構(gòu)的優(yōu)缺點(diǎn)
優(yōu)點(diǎn) :
①:同類數(shù)據(jù)歸類整合存儲(chǔ)除抛,方便數(shù)據(jù)管理
②:相比于string操作內(nèi)存和cpu更小
③:相比于string存儲(chǔ)更節(jié)省空間
缺點(diǎn) :
①:過期功能不能使用在field上,只能使用在key上
②:redis集群架構(gòu)下不適合大規(guī)模使用
四 :List 結(jié)構(gòu)與應(yīng)用場景
1母截、基礎(chǔ)命令
lpush key value [value …]
value值 從左到右的順序依次插入到表頭
rpush key value [value ...]
value值 從右到左的順序依次插入到表頭
lpop key
移除并返回列表 key 的頭元素
rpop key
移除并返回列表 key 的尾元素
lrange key start stop
返回列表key 指定區(qū)間內(nèi)元素到忽,區(qū)間以偏移量start和stop指定
blpop key [key …] timeout
從key列表表頭彈出一個(gè)元素,若列表沒有元素清寇,阻塞等待timeout秒喘漏,如果timeout=0 ,一直等待下去
brpop key [key …] timeout
從key列表表尾彈出一個(gè)元素,若列表沒有元素华烟,阻塞等待timeout秒翩迈,如果timeout=0 ,一直等待下去
2、常用數(shù)據(jù)結(jié)構(gòu)
Stack(棧)=lpush + lpop (先進(jìn)后出)
Queue(隊(duì)列)=lpush + rpop (先進(jìn)先出)
Blocking MQ (阻塞隊(duì)列)=lpush + brpop
會(huì)話二新增數(shù)據(jù).png
會(huì)話一獲取數(shù)據(jù).png
3负饲、微信公眾號(hào)消息流
①:Java3y 推送消息衩藤,消息id為 222
lpush msg:wangch 222
②:Hollis 推送消息,消息id為 444
lpush msg:wangch 444
③:查看最新的公眾號(hào)消息
lrange msg:wangch 0 4
此種方式適用于粉絲量小的公眾號(hào)推送方式
五 :Set 結(jié)構(gòu)與應(yīng)用場景
1、set 常用操作
sadd key member [member] 新增元素 , 元素唯一不重復(fù)
srem key member [member] 刪除元素
smembers key 獲取集合key 所有元素
scard key 獲取集合key 元素個(gè)數(shù)
sismember key member 判斷元素是否存在于集合key
srandmember key [count] 從集合key中取出count個(gè)元素何鸡,元素不刪除
spop key [count] 從集合key中取出count個(gè)元素傍睹,元素刪除
2访得、應(yīng)用實(shí)例 :微信抽獎(jiǎng)小程序
①:點(diǎn)擊參與抽獎(jiǎng)加入集合
sadd key wangch
②:查看參與抽獎(jiǎng)所有用戶
smembers key
(scard key : 查看抽獎(jiǎng)個(gè)數(shù))
③:抽取count 名中獎(jiǎng)?wù)? srandmember key [count]/ spop key [count]
(也可以用于點(diǎn)贊传趾,收藏等場景)
3店茶、set 運(yùn)算操作
sinter key [key …] 交集運(yùn)算
sunion key [key …] 并集運(yùn)算
sdiff key [key …] 差集運(yùn)算
sinter set2 set3 set3 --> {c}
sunion set2 set3 set3 --> {a,b,c,d,e}
sdiff set2 set3 set3 --> {a}
4 族壳、應(yīng)用實(shí)例 :集合操作實(shí)現(xiàn)關(guān)注模型
①:wangch關(guān)注的人
sadd wangch zhangxh锦亦、lisi、wangwu
②:小明關(guān)注的人
sadd xiaom lisi令境、 wangwu孽亲、zhaol
③: 李四關(guān)注的人
sadd lisi xiaom 、zhaol展父、 xiaoq
獲取 wangch 和小明的共同關(guān)注
sinter wangch xiaom --> {lisi返劲、wangwu}
我關(guān)注的人也關(guān)注了他(小明)
sismember lisi xiaom --> 返回 1 存在,
則也關(guān)注了
我可能認(rèn)識(shí)的人
sdiff wangch xiaom --> {zhangxh}
可用于淘寶推薦商品:共同關(guān)注的人越多栖茉,說明興趣愛好相同篮绿。當(dāng)A購買一件商品時(shí),就可能給你也推薦
六 : ZSet 結(jié)構(gòu)與應(yīng)用場景
1吕漂、ZSet 常用操作
sadd key score member [[scoremember] …] 有序集合key加入帶分值元素
srem key member [member] 有序集合刪除元素
zscore key member 返回有序集合key中元素member分值
zcard key 有序集合key中的元素個(gè)數(shù)
zrange key start stop [withscores] 正序獲取key從start下標(biāo)到stop下標(biāo)元素
zrevrange key start stop [withscores] 倒序獲取key從start下標(biāo)到stop下標(biāo)元素
2亲配、 ZSet 集合操作
zunionstore destkey numkeys key [key...] 并集操作
zinterstore destkey numkeys key [key...] 交集操作
3、 ZSet 實(shí)現(xiàn)微博排行榜
實(shí)現(xiàn)基礎(chǔ) : zset 數(shù)據(jù)會(huì)根據(jù)score自動(dòng)排序惶凝,我們將點(diǎn)擊次數(shù)作為zset ,隨著用戶點(diǎn)擊實(shí)時(shí)變化
①:展示當(dāng)日排行前十 (按照score倒序)
zrevrange hot:20201229 0 9 withscores
②:累計(jì)計(jì)算近七日點(diǎn)擊次數(shù)
zunionstore hot:20201222-2021229 7hot:20201222 hot:20201223 … hot:2021229
③:展示七日排行前十
zrevrange hot:20201222-2021229 0 9 withscores
4吼虎、 ZSet 其他應(yīng)用
zset 還可以用來實(shí)現(xiàn)延遲隊(duì)列、接口限流等操作苍鲜,主要是使用score 的特性思灰,以時(shí)間戳作為score,來達(dá)到相應(yīng)邏輯混滔。