慕課網(wǎng)2021-01-29 Redis6直播筆記 - 上(acl/客戶端緩存/多級緩存)

-w1407

redis6安裝注意點

-w1425

我們課程里忽略了,就不去安裝了,僅僅只提供安裝文檔,redis6的安裝其實和redis5安裝差不多,只是需要注意gcc的版本需要提高,不然編譯會出錯。
參考慕課網(wǎng)手記地址:https://www.imooc.com/article/313200

acl權(quán)限策略

基礎(chǔ)概念

-w1428

不知道大家有沒有聽過acl,zookeeper中也有,acl就是access control list,權(quán)限控制列表,和平時接觸的管理系統(tǒng)的權(quán)限是一樣的,可以限制不同角色的操作權(quán)。

在redis6中,我們可以設(shè)置不同的用戶,對他們進(jìn)行授權(quán)命令,控制可讀可寫,限制訪問緩存key的前綴等。這樣可以更加提高redis6的數(shù)據(jù)安全性。由于是對于一些公司的生產(chǎn)庫,可以讓很多人去連接查看,就特別有用。但是一般來說都是只有運維或者redis工程師才能訪問的。

大家想一想,早期版本通過requirepass設(shè)置密碼,這個不去設(shè)置,你的服務(wù)器很有可能被攻擊,這個我們架構(gòu)班的同學(xué)有遇到過,被勒索比特幣,或者成為肉雞挖礦。所以這個密碼肯定要設(shè)置。

ACL 存儲模式

-w1323

acl的權(quán)限的存儲模式可以配置到redis.conf中,也可以外部文件aclfile,我個人偏好后者,這也是官方推薦的方式。(因為aclfile文件發(fā)生修改只需要重載acl即可,而conf方式需要重啟redis)

我們可以直接在命令行中創(chuàng)建用戶去權(quán)限,然后再把用戶保存到conf或者aclfile中。命令如下:

# 將ACL權(quán)限持久化到redis.conf
config rewrite

# 將ACL權(quán)限持久化到users.acl
acl save

實操演練

  • 開啟aclfile,指定路徑


    -w1117
  • 創(chuàng)建權(quán)限acl文件(注意:需要他前創(chuàng)建acl空文件,否則重啟redis會報錯)

    touch /usr/local/redis/users.acl
    
    
    -w948

重啟redis并且進(jìn)入客戶端

查看進(jìn)程


-w1154
./redis-cli shutdown

./redis-server redis.conf

./redis-cli
auth default    # 默認(rèn)用戶無密碼

或者

./redis-cli     # 可以直接進(jìn)入

ACL的使用

  • 查看acl命令幫助(學(xué)習(xí)一個新東西,基本上他們都會有幫助文檔的。像在linux中,大多都是help,就有一大堆的命令提示,后面還有英文的解釋,這是最直接的學(xué)習(xí)方式) acl help 相信但凡有一些經(jīng)驗的,這些其實都應(yīng)該看得懂
1)ACL:命令參數(shù),要以 ACL 開頭
2)LOAD:重新加載acl文件,手動修改acl文件后,需要讓redis服務(wù)重新加載,才能生效
3)SAVE:保存當(dāng)前用戶權(quán)限配置到acl文件
4)LIST:展示用戶權(quán)限的詳細(xì)信息
5)USERS:展示所有用戶名
6)SETUSER:設(shè)置或者修改用戶
7)GETUSER:獲得用戶全新信息
8)DELUSER:刪除用戶以及權(quán)限
9)CAT:展示所有權(quán)限分類,不同的操作歸類不同
10)CAT <某分類名>:展示某分類具體包含哪些操作
11)GENPASS:生成密碼
12)WHOAMI:當(dāng)前登錄者
13)LOG:日志

-w1194
  • 默認(rèn)沒有配置的時候,會有一個default用戶,on代表開啟,off代表禁用。default為用戶名,后面的內(nèi)容為ACL規(guī)則描述,~* 表示所有key,+@all 表示所有命令。所以這個表示用戶default開啟狀態(tài),并且,沒有密碼而且可以訪問所有命令以及所有數(shù)據(jù)。

    -w568

  • 獲得所有的用戶名


    -w425
  • 當(dāng)前登錄用戶是誰


    -w420
  • 查看命令的分類:

    • acl cat:顯示所有的命令類別

      -w381

    • 查某個類別下有哪些操作,就比如如下危險操作,這些命令都是危險的,對當(dāng)前redis庫可能會造成影響
      -w564

創(chuàng)建用戶

現(xiàn)在我們來創(chuàng)建一下用戶

  • 創(chuàng)建或者修改用戶,用戶名區(qū)分大小寫,但是不建議把同樣的用戶名分為大小寫不同的兩個

    # 新增默認(rèn)所有權(quán)限的用戶
    ACL SETUSER imooc on >123456 ~* +@all
    # 新增用戶itzixi,密碼123456,只能允許訪問order前綴的key,可以使用set和get和acl命令
    ACL SETUSER itzixi on >123456 ~order* +get +set +acl
    
    
  • 這個時候打開acl文件是空的,需要執(zhí)行保存命令

  • 保存命令到aclfile

    acl save
    
    
    -w1546

切換用戶進(jìn)行測試

  • 切換到itzixi用戶,并且測試,他只能set和get,order前綴的key
    -w1284
    • mget不可用
      -w1276

為用戶增加類別權(quán)限訪問

  • 為用戶itzixi新增某一個類別下的所有操作,比如這個類別就是read類別的所有讀操作:

    ACL SETUSER itzixi +@read
    
    
    -w624
    • 多了一個read類別


      -w1652
    • 這個時候可以使用mget操作了:


      -w423

ACL LOAD:我們也可以直接在aclfile中修改或新增ACL權(quán)限,修改之后不會立刻生效,我們可以在redis命令行中執(zhí)行acl load將該aclfile中的權(quán)限加載至redis服務(wù)中。

客戶端緩存 Client Side Cache

-w1409

這是他的官網(wǎng)地址,有興趣可以看看:
https://redis.io/topics/client-side-caching

我們應(yīng)該都知道,redis作為緩存中間件,目的是為了減少熱點數(shù)據(jù)對數(shù)據(jù)庫的壓力,并且提供更快的訪問速度,redis的性能要比普通數(shù)據(jù)庫快很多。

但是redis也有瓶頸上線,因為請求到redis一定會有網(wǎng)絡(luò)io的損耗,并且也有數(shù)據(jù)的序列化以及反序列化的等等的一些開銷,所以如果在本地把熱數(shù)據(jù)再做一次緩存的話(Guava Cache 進(jìn)程緩存,可能會有不一致的情況),那么可以使得請求性能更好,加速訪問,提升客戶端的響應(yīng)速度了,因為數(shù)據(jù)延遲就降低并且減少了很多嘛。

大家可以想一下,什么場景下可以使用?
其實只要滿足大量的請求,不怎么更改的數(shù)據(jù),都可以。比如數(shù)據(jù)字典,我們的項目中涉及到一些超大型物流車的參數(shù)信息,這些基本上不會變動的,除非有相關(guān)的一些政策改變,那么有些參數(shù)信息就要變更,要不然直接存本地緩存是非常舒服的。

可以看一下這圖,他本質(zhì)上就是基于redis-server服務(wù)端來維系和應(yīng)用后端的關(guān)系,用的pub/sub發(fā)布訂閱的通知機制,如果服務(wù)端緩存發(fā)生更改,那么可以向應(yīng)用后端來推送,讓其更新本地緩存。
其中應(yīng)用是指的我們的部署的項目,調(diào)用端。

了解一下:在Reds6之前的版本,使用的是RESP2協(xié)議,現(xiàn)在是RESP3,這個是REdisSerializationProtocol,是 Redis 服務(wù)端與客戶端之間通信的協(xié)議。

實現(xiàn)客戶端緩存的方式 - 默認(rèn)模式

Redis-server 服務(wù)端會記錄客戶端訪問了哪些key,這客戶端id與key有唯一的映射關(guān)系,當(dāng)其中的key發(fā)生變更時給客戶端發(fā)送失效信息。這種模式會占用服務(wù)端所在服務(wù)器的內(nèi)存。

-w912

實現(xiàn)客戶端緩存的方式 - 廣播機制

客戶端訂閱訪問過的key的前綴,當(dāng)符合的key發(fā)生變更就會被redis-server通知(如果變更的key沒有被客戶端緩存,也會通知),由于服務(wù)器端不記錄客戶端訪問的key,所以不會過多占用redis-server端的服務(wù)器內(nèi)存;

-w998

在這種模式下,服務(wù)端維護(hù)的是前綴key,而不是默認(rèn)模式的所有key,所以這樣對于內(nèi)存的占用不會很高,只要修改匹配的前綴key,那么訂閱的客戶端都會收到失效key的通知。只不過由于定訂閱的是前綴,他會收到很多的無效通知。

在廣播模式下,只要符合客戶端設(shè)置的key前綴的key發(fā)生新增、修改、刪除、還有過期、淘汰等動作,即使該key沒有被該客戶端緩存,也會收到key的失效消息;

多級緩存

直播過程中提到了多級緩存架構(gòu),可以通過這圖了解一下,更具體的可以做到4層,nginx可以做兩層:


-w739
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容