講義在講Redis之前,花了很大的篇幅去寫緩存的知識底洗,可見緩存與Redis的關(guān)系非同一般祝懂。那么Redis就是緩存嗎?
我們這里也寫學(xué)習(xí)一些緩存的知識坠敷。
緩存存在的意義是為了減輕服務(wù)器的壓力妙同,提高系統(tǒng)的響應(yīng)。
以前緩存指的是CPU上的告訴儲存器膝迎,現(xiàn)在泛指計算機上原始數(shù)據(jù)集的復(fù)制集粥帚,便于快速訪問。
其實緩存是一門藝術(shù)限次,一門空間換時間的藝術(shù)
其實說到這芒涡,也不難看出緩存的優(yōu)缺點的。
大概總結(jié)一下就是緩存可以提升用戶體驗卖漫,減輕服務(wù)器壓力费尽,提高性能。缺點就是額外的硬件付出羊始,并且緩存時也會出現(xiàn)一些問題旱幼。
緩存的讀寫模式
緩存有三種讀寫模式,這里只講最常用的一種突委。就是Cache Aside Pattern柏卤,中文名為旁路緩存,這是最經(jīng)典的緩存+數(shù)據(jù)庫讀寫模式匀油。
具體就是在讀的時候缘缚,先讀緩存,緩存沒有的話再去讀數(shù)據(jù)庫钧唐,然后順便將數(shù)據(jù)庫取出的數(shù)據(jù)放入緩存忙灼,同時返回響應(yīng)匠襟。
緩存的野心很大钝侠,讀數(shù)據(jù)你得先問問緩存该园,緩存沒有,你去問數(shù)據(jù)庫要帅韧,之后也得分給我里初!
那么問題來了,如果數(shù)據(jù)庫更新了怎么辦忽舟?更新緩存嗎双妨?其實不是,是直接刪除緩存叮阅,這也是數(shù)據(jù)庫唯一報仇的以此的刁品,直接殺死緩存。
為什么是刪除緩存而不是更新呢浩姥?其實也很簡單挑随,因為緩存的結(jié)構(gòu)機理,更新數(shù)據(jù)需要先遍歷一遍勒叠,這就意味著我刪除后重新加入新數(shù)據(jù)也比直接更新要快兜挨。
另外順序也有要求,得先更新數(shù)據(jù)庫眯分,再去殺死緩存拌汇。(不然數(shù)據(jù)庫打不過)
Redis
緩存就了解這么多就可以了,接下來就是核心Redis了弊决。
Redis是遠(yuǎn)程的字典服務(wù)器噪舀,是一個鍵值對內(nèi)存數(shù)據(jù)庫,儲值類型有五種丢氢,比較少傅联,但也是最常用的了。就是字符串疚察、散列蒸走、列表、集合和有序集合貌嫡。
說到底還是一個數(shù)據(jù)庫唄比驻?那他存在的意義在哪呢?
他可以給緩存使用岛抄,減輕數(shù)據(jù)庫的壓力别惦,也可以直接給數(shù)據(jù)庫使用,用來臨時存儲文件夫椭,在一些數(shù)據(jù)交互要求高的場景下經(jīng)常能見到他的身影掸掸。
具體的使用再后面的操作環(huán)節(jié)在做解說。
MySQL每日一刷
這道題是計算視頻的完播率,在抖音這類短視頻平臺應(yīng)該是挺常見的扰付。
可以看下下面的數(shù)據(jù)情況堤撵,給了兩個表(大多情況下都是多個表需要自己組合),表1就是用戶和視頻的交互表羽莺,里面給了基本的id數(shù)據(jù)和視頻的開始結(jié)束時間數(shù)據(jù)(需要以此來判斷視頻是否播放完了)实昨。
表2就是短視頻的信息表了,包含視頻的id盐固、作者等信息荒给。
其實不難看出,計算出2021年刁卜,短視頻的完播率情況并不難志电,首先寫出出視頻完播率公式:count(結(jié)束時間-開始時間>視頻時長,1蛔趴,null)/ count(開始時間)
不得不說溪北,這可能是這道題唯一的一個小難點了。不過我的寫法肯定是有問題的夺脾,比較時間差直接用兩個時間相減著實是有些low之拨。
觀看時間= timestampdiff(second, start_time, end_time)記得改成這個不然真會被人笑掉大牙??
select
a.video_id,
round(
count(if(end_time - start_time >= duration,1,null)) / count(start_time),
3
) as avg_comp_play_rate
from
tb_user_video_log as a
left join tb_video_info as b on a.video_id = b.video_id
where
year(start_time) = 2021
group by
video_id
order by
avg_comp_play_rate desc