国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Redis 6.0的新特性:多線程、客戶端緩存與安全

這篇具有很好參考價值的文章主要介紹了Redis 6.0的新特性:多線程、客戶端緩存與安全。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

2020年5月份,6.0版本。

面向網(wǎng)絡處理的多IO線程可以提高網(wǎng)絡請求處理的速度,而客戶端緩存可以讓應用直接在客戶端本地讀取數(shù)據(jù),這兩個特性可以提升Redis的性能。

細粒度權限控制讓Redis可以按照命令粒度控制不同用戶的訪問權限,加強了Redis的安全保護。

RESP 3協(xié)議則增強客戶端的功能,可以讓應用更加方便地使用Redis的不同數(shù)據(jù)類型。

1 從單線程處理網(wǎng)絡請求到多線程處理

Redis單線程架構,雖有些命令操作可用后臺線程或子進程執(zhí)行(如數(shù)據(jù)刪除、快照生成、AOF重寫),但從網(wǎng)絡IO處理到實際的讀寫命令處理,都是由單線程完成。

隨著網(wǎng)絡硬件的性能提升,Redis性能瓶頸有時會出現(xiàn)在網(wǎng)絡I/O處理,即單個主線程處理網(wǎng)絡請求的速度跟不上底層網(wǎng)絡硬件的速度。
一般有兩種方法:

  • 用用戶態(tài)網(wǎng)絡協(xié)議棧(例如DPDK)取代內核網(wǎng)絡協(xié)議棧,讓網(wǎng)絡請求的處理不用在內核里執(zhí)行,直接在用戶態(tài)完成處理就行。
    讓Redis避免頻繁讓內核進行網(wǎng)絡請求處理,可很好地提升請求處理效率。但這個方法要求在Redis的整體架構中,添加對用戶態(tài)網(wǎng)絡協(xié)議棧的支持,需修改Redis源碼中和網(wǎng)絡相關的部分(例如修改所有的網(wǎng)絡收發(fā)請求函數(shù)),這會帶來很多開發(fā)工作量。而且新增代碼還可能引入新Bug,導致系統(tǒng)不穩(wěn)定。
  • 采用多個IO線程來處理網(wǎng)絡請求,提高網(wǎng)絡請求處理的并行度。Redis 6.0采用
    Redis的多I/O線程只是用來處理網(wǎng)絡請求,對于讀寫命令,Redis仍使用單線程處理。因為,Redis處理請求時,網(wǎng)絡處理經(jīng)常是瓶頸,通過多個I/O線程并行處理網(wǎng)絡操作,可提升實例的整體處理性能。而繼續(xù)使用單線程執(zhí)行命令操作,無需為了保證Lua腳本、事務的原子性,額外開發(fā)多線程互斥機制了。這樣Redis線程模型實現(xiàn)就簡單了。

6.0中,主線程和IO線程具體是怎么協(xié)作完成請求處理的?

可將主線程和多I/O線程的協(xié)作分成如下階段:

服務端和客戶端建立Socket連接,并分配處理線程

主線程負責接收建立連接請求。當有客戶端請求和實例建立Socket連接時,主線程會創(chuàng)建和客戶端的連接,并把 Socket 放入全局等待隊列中。
緊接著,主線程通過輪詢方法把Socket連接分配給IO線程。

IO線程讀取并解析請求

主線程一旦把Socket分配給IO線程,就會進入阻塞狀態(tài),等待IO線程完成客戶端請求讀取和解析。因為有多個IO線程在并行處理,所以,這個過程很快就可以完成。

主線程執(zhí)行請求操作

等到IO線程解析完請求,主線程還是會以單線程的方式執(zhí)行這些命令操作

Redis 6.0的新特性:多線程、客戶端緩存與安全,Redis,緩存,redis,安全

IO線程回寫Socket和主線程清空全局隊列

當主線程執(zhí)行完請求操作后,會把需要返回的結果寫入緩沖區(qū),然后,主線程會阻塞等待IO線程把這些結果回寫到Socket中,并返回給客戶端。

和IO線程讀取和解析請求一樣,IO線程回寫Socket時,也是有多個線程在并發(fā)執(zhí)行,所以回寫Socket的速度也很快。等到IO線程回寫Socket完畢,主線程會清空全局隊列,等待客戶端的后續(xù)請求。
該階段主線程和IO線程的操作:
Redis 6.0的新特性:多線程、客戶端緩存與安全,Redis,緩存,redis,安全

2 啟用多線程

6.0多線程機制默認關閉,要啟用,需在redis.conf中完成兩個設置:

1.設置io-threads-do-reads=yes,表示啟用多線程。

io-threads-do-reads yes

2.設置線程個數(shù)。線程個數(shù)一般小于Redis實例所在機器的CPU核數(shù)。如8核機器,Redis官方建議6個IO線程。

io-threads  6

若你在實際應用中,發(fā)現(xiàn)Redis實例CPU開銷不大,吞吐量卻沒提升,可考慮使用Redis 6.0的多線程機制,加速網(wǎng)絡處理,提升實例吞吐量。

3 實現(xiàn)服務端協(xié)助的客戶端緩存

6.0實現(xiàn)了服務端協(xié)助的客戶端緩存功能,也稱跟蹤(Tracking)功能。業(yè)務應用中的Redis客戶端就能將讀取的數(shù)據(jù)緩存在業(yè)務應用本地,應用就能直接在本地快速讀取數(shù)據(jù)。

問題也來了,若數(shù)據(jù)被修改或失效,如何通知客戶端對緩存的數(shù)據(jù)做失效處理?6.0實現(xiàn)的Tracking功能提供兩種模式解決這問題。

3.1 普通模式

實例會在服務端記錄客戶端讀取過的key,并監(jiān)測key是否有修改。一旦key值變化,服務端會給客戶端發(fā)送invalidate消息,通知客戶端緩存失效

服務端對記錄的key只會報告一次invalidate消息,也就是說,服務端在給客戶端發(fā)送過一次invalidate消息后,如果key再被修改,此時,服務端就不會再次給客戶端發(fā)送invalidate消息。

只有當客戶端再次執(zhí)行讀命令時,服務端才會再次監(jiān)測被讀取的key,并在key修改時發(fā)送invalidate消息。這樣設計的考慮是節(jié)省有限的內存空間。畢竟,如果客戶端不再訪問這個key了,而服務端仍然記錄key的修改情況,就會浪費內存資源。

我們可以通過執(zhí)行下面的命令,打開或關閉普通模式下的Tracking功能。

CLIENT TRACKING ON|OFF

3.2 廣播模式

服務端會給客戶端廣播所有key的失效情況,但這樣做后,若K被頻繁修改,服務端會發(fā)送大量失效廣播消息,消耗大量網(wǎng)絡帶寬資源。

實際應用時,會讓客戶端注冊希望跟蹤的key的前綴,當帶有注冊前綴的K被修改時,服務端會把失效消息廣播給所有注冊的客戶端。和普通模式不同,在廣播模式下,即使客戶端還沒讀取過K,但只要它注冊了要跟蹤的K,服務端都會把K失效消息通知給這客戶端。

案例 -客戶端如何使用廣播模式接收key失效消息

當我們在客戶端執(zhí)行下面的命令后,如果服務端更新了user??1003這個key,那么,客戶端就會收到invalidate消息。

CLIENT TRACKING ON BCAST PREFIX user

這種監(jiān)測帶有前綴的key的廣播模式,和我們對key的命名規(guī)范非常匹配。我們在實際應用時,會給同一業(yè)務下的key設置相同的業(yè)務名前綴,所以,我們就可以非常方便地使用廣播模式。

普通模式和廣播模式,需要客戶端使用RESP 3協(xié)議,RESP 3協(xié)議是6.0新啟用的通信協(xié)議。

對于使用RESP 2協(xié)議的客戶端來說,就需要使用另一種模式:

重定向模式(redirect)

想獲得失效消息通知的客戶端,需執(zhí)行訂閱命令SUBSCRIBE,專門訂閱用于發(fā)送失效消息的頻道_redis_:invalidate。同時使用另外一個客戶端,執(zhí)行CLIENT TRACKING,設置服務端將失效消息轉發(fā)給使用RESP 2協(xié)議的客戶端。

案例

如何讓使用RESP 2協(xié)議的客戶端也能接受失效消息?

假設客戶端B想獲取失效消息,但客戶端B只支持RESP 2協(xié)議,客戶端A支持RESP 3協(xié)議。我們可以分別在客戶端B和A上執(zhí)行SUBSCRIBE和CLIENT TRACKING,如下所示:

//客戶端B執(zhí)行,客戶端B的ID號是303
SUBSCRIBE _redis_:invalidate

//客戶端A執(zhí)行
CLIENT TRACKING ON BCAST REDIRECT 303

這樣設置以后,如果有鍵值對被修改了,客戶端B就可以通過_redis_:invalidate頻道,獲得失效消息了。

4 從簡單的基于密碼訪問到細粒度的權限控制

實例的訪問權限控制列表功能(Access Control List,ACL),這個特性可以有效地提升Redis的使用安全性。

在Redis 6.0 版本之前,要想實現(xiàn)實例的安全訪問,只能通過設置密碼來控制,例如,客戶端連接實例前需要輸入密碼。

此外,對于一些高風險的命令(例如KEYS、FLUSHDB、FLUSHALL等),在Redis 6.0 之前,我們也只能通過rename-command來重新命名這些命令,避免客戶端直接調用。

Redis 6.0 提供了更加細粒度的訪問權限控制,這主要有兩方面的體現(xiàn)。

首先,6.0版本支持創(chuàng)建不同用戶來使用Redis。在6.0版本前,所有客戶端可以使用同一個密碼進行登錄使用,但是沒有用戶的概念,而在6.0中,我們可以使用ACL SETUSER命令創(chuàng)建用戶。例如,我們可以執(zhí)行下面的命令,創(chuàng)建并啟用一個用戶normaluser,把它的密碼設置為“abc”:

ACL SETUSER normaluser on > abc

另外,6.0版本還支持以用戶為粒度設置命令操作的訪問權限。我把具體操作列在了下表中,你可以看下,其中,加號(+)和減號(-)就分別表示給用戶賦予或撤銷命令的調用權限。

為了便于你理解,我給你舉個例子。假設我們要設置用戶normaluser只能調用Hash類型的命令操作,而不能調用String類型的命令操作,我們可以執(zhí)行如下命令:

ACL SETUSER normaluser +@hash -@string

除了設置某個命令或某類命令的訪問控制權限,6.0版本還支持以key為粒度設置訪問權限。

具體的做法是使用波浪號“~”和key的前綴來表示控制訪問的key。例如,我們執(zhí)行下面命令,就可以設置用戶normaluser只能對以“user:”為前綴的key進行命令操作:

ACL SETUSER normaluser ~user:* +@all

好了,到這里,你了解了,Redis 6.0可以設置不同用戶來訪問實例,而且可以基于用戶和key的粒度,設置某個用戶對某些key允許或禁止執(zhí)行的命令操作。

這樣一來,我們在有多用戶的Redis應用場景下,就可以非常方便和靈活地為不同用戶設置不同級別的命令操作權限了,這對于提供安全的Redis訪問非常有幫助。

5 啟用RESP 3協(xié)議

Redis 6.0實現(xiàn)了RESP 3通信協(xié)議,而之前都是使用的RESP 2。在RESP 2中,客戶端和服務器端的通信內容都是以字節(jié)數(shù)組形式進行編碼的,客戶端需要根據(jù)操作的命令或是數(shù)據(jù)類型自行對傳輸?shù)臄?shù)據(jù)進行解碼,增加了客戶端開發(fā)復雜度。

而RESP 3直接支持多種數(shù)據(jù)類型的區(qū)分編碼,包括空值、浮點數(shù)、布爾值、有序的字典集合、無序的集合等。

所謂區(qū)分編碼,就是指直接通過不同的開頭字符,區(qū)分不同的數(shù)據(jù)類型,這樣一來,客戶端就可以直接通過判斷傳遞消息的開頭字符,來實現(xiàn)數(shù)據(jù)轉換操作了,提升了客戶端的效率。除此之外,RESP 3協(xié)議還可以支持客戶端以普通模式和廣播模式實現(xiàn)客戶端緩存。

6 總結

Redis 6.0的新特性:多線程、客戶端緩存與安全,Redis,緩存,redis,安全
Redis 6.0是剛剛推出的,新的功能特性還需要在實際應用中進行部署和驗證,所以,如果你想試用Redis 6.0,可以嘗試先在非核心業(yè)務上使用Redis 6.0:文章來源地址http://www.zghlxwxcb.cn/news/detail-624958.html

  • 可以驗證新特性帶來的性能或功能優(yōu)勢
  • 避免因為新特性不穩(wěn)定而導致核心業(yè)務受到影響

到了這里,關于Redis 6.0的新特性:多線程、客戶端緩存與安全的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Redis客戶端介紹

    Redis客戶端介紹

    redis安裝完成后有自帶的命令行客戶端,即redis-cli,使用方式如下 options ——參數(shù) -h 127.0.0.1 :指定要連接的redis節(jié)點的ip地址,默認值127.0.0.1 -p 6379 :指定要連接的redis節(jié)點的端口,默認值6379 -a xxxxxx :指定redis的訪問密碼 … commonds ——redis的操作命令 ping :心跳測試,服務器

    2024年02月06日
    瀏覽(25)
  • 【微服務|SpringBoot 3.0】 新特性——內置聲明式HTTP客戶端

    【微服務|SpringBoot 3.0】 新特性——內置聲明式HTTP客戶端

    從Spring 6和Spring Boot 3開始,Spring framework支持將遠程HTTP服務代理為帶有HTTP交換注解方法的Java接口。類似的庫,如OpenFeign和Retrofit,仍然可以使用,但HttpServiceProxyFactory添加了對Spring框架的原生支持。 聲明式 http 客戶端主旨是使得編寫 java http 客戶端更容易。為了貫徹這個理念

    2024年02月16日
    瀏覽(17)
  • redis 登錄客戶端命令

    Redis 命令用于在 redis 服務上執(zhí)行操作。 要在 redis 服務上執(zhí)行命令需要一個 redis 客戶端。Redis 客戶端在我們之前下載的的 redis 的安裝包中。 語法 Redis 客戶端的基本語法為: $ redis-cli 實例 以下實例講解了如何啟動 redis 客戶端: 啟動 redis 客戶端,打開終端并輸入命令 redis

    2023年04月08日
    瀏覽(84)
  • Redis客戶端 - RedisSerializer

    Redis客戶端 - RedisSerializer

    原文首更地址,閱讀效果更佳! Redis客戶端 - RedisSerializer | CoderMast編程桅桿 https://www.codermast.com/database/redis/redistemplate-redis-serializer.html 前景回顧 在上一篇中,我們實現(xiàn)了一個簡單的案例,操作一個 String 類型的數(shù)據(jù),插入了一個 name = codermast 的數(shù)據(jù)到Redis。 使用redis-cli客戶端

    2024年02月09日
    瀏覽(25)
  • Redis的Java客戶端-Java客戶端以及SpringDataRedis的介紹與使用

    Redis的Java客戶端-Java客戶端以及SpringDataRedis的介紹與使用

    Spring Data Redis底層支持同時兼容Jedis和Lettuce兩種不同的Redis客戶端,可以根據(jù)需要任意選擇使用其中的一種。這樣既可以保留現(xiàn)有代碼使用的Jedis方式,也可以通過使用基于Netty的高性能Lettuce客戶端,提升應用的性能和吞吐量。 Jedis是一個傳統(tǒng)的Java Redis客戶端,使用BIO進行So

    2024年02月08日
    瀏覽(22)
  • nginx反向代理之緩存 客戶端IP透傳 負載均衡

    nginx反向代理之緩存 客戶端IP透傳 負載均衡

    緩存功能可以加速訪問,如果沒有緩存關閉后端服務器后,圖片將無法訪問,緩存功能默認關閉,需要開啟。 相關選項: 實驗:為代理服務器開啟緩存功能 ① 代理服務器主配置文件的http模塊中添加配置 ② 子配置文件添加配置 ③是否有緩存 在另一臺配置拖入圖片 瀏覽器檢

    2024年03月15日
    瀏覽(28)
  • Redis的Java客戶端

    Redis的Java客戶端

    以下是redis.io官網(wǎng)所推薦使用前五的Java客戶端 Java客戶端 特點 Jedis 以Redis命令作為方法名稱,學習成本低,簡單實用,但是Jedis實例是線程不安全的,多線程環(huán)境下需要基于連接池來使用 lettuce Lettuce是基于Netty實現(xiàn)的,支持同步、異步和響應式編程方式,并且是線程安全的。

    2024年02月13日
    瀏覽(25)
  • Redis中的Java客戶端

    Redis中的Java客戶端

    Jedis是一個Java實現(xiàn)的Redis客戶端連接工具。 Jedis使用非常簡單,直接引入依賴?;谀J參數(shù)的Jedis連接池,初始化連接池類(使用默認連接池參數(shù))JedisPool,獲取一個Jedis連接Jedis jedis=jp.getResource()。 Jedis是線程不安全的,多線程使用同一個Jedis實例,會出現(xiàn)并發(fā)問題,原因是

    2024年01月17日
    瀏覽(22)
  • 【Redis入門篇】| Redis的Java客戶端

    【Redis入門篇】| Redis的Java客戶端

    目錄 一:?Redis的Java客戶端 1. Jedis快速入門 2. Jedis連接池 3. SpringDataRedis快速入門 4. RedisSerializer配置 5. StringRedisTemplate 圖書推薦 在Redis官網(wǎng)中提供了各種語言的客戶端,地址: https://redis.io/resources/clients/ Jedis: 以 Redis 命令作為方法名稱,學習成本低,簡單實用。但是 Jedis 實

    2024年02月03日
    瀏覽(21)
  • redis教程 二 redis客戶端Jedis使用

    redis教程 二 redis客戶端Jedis使用

    在Redis官網(wǎng)中提供了各種語言的客戶端,地址:https://redis.io/docs/clients/ 其中Java客戶端也包含很多但在開發(fā)中用的最多的還是Jedis,接下來就讓我們以Jedis開始我們的快速實戰(zhàn)。 入門案例詳細步驟 案例分析: 創(chuàng)建工程: 創(chuàng)建一個maven管理的java項目 引入依賴: 在pom.xml文件下添

    2024年02月05日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包