Redis | Redis入門學習介紹及常見原理剖析

Redis思維導圖

關注wx:CodingTechWork

Redis介紹

概述

  1. Redis是NoSQL,是key-value分布式內存數據庫。

緩存

  1. 緩存是將數據從慢的介質換到快的介質上,提高讀寫效率和性能,并降低數據庫的讀寫成本。
  2. 內存的速度一般都遠遠大于硬盤的速度,大量請求數據庫或遠程應用時,會導致大量的時間消耗在調用上,從而降低系統應用調用效率,若使用緩存,則可以充分利用資源,提高系統調用效率。

特點

  1. Redis支持數據的持久化:Redis運行在內存中,但可以持久化到磁盤。將內存中的數據保存到磁盤中,重啟時可以再次加載進行使用。
  2. Redis提供多種數據結構類型存儲,如list、set、zset、hash。
  3. Redis支持數據的備份,即主從(master-slave)模式的數據備份。
  4. Redis支持發布-訂閱,通知key過期等特性。
  5. Redis性能高,讀的速度是11萬次/s,寫的速度是8萬次/s。
  6. Redis支持原子性,即要么全部執行成功,要么全部不執行。單個操作是原子的,多個操作也支持原子性事務,通過MULTI和EXEC指令包裝。

熱點數據和冷點數據

熱數據

  1. 需要被計算節點頻繁訪問的在線類數據,如某導航信息,緩存后,會被讀取很多次;
  2. 新建的通告信息,緩存后也會被讀取很多次。

冷數據

  1. 對于理想類不經常訪問的數據,如企業備份數據、業務與操作日志數據、話單與統計數據。
  2. 大部分數據可能還未再次訪問就已被擠出內存,不僅占用內存,且價值不大。

Memcached和Redis區別

  1. 存儲方式:Memcached存儲在內存中,斷電掛掉丟失,數據不能超過內存大小;redis有部分存在硬盤上,也可以持久化數據到數據庫中。
  2. 數據支持類型:Memcached所有的值均為簡單的字符串,只是keyt-value類型數據;redis可提供list、set、zset、hash等數據結構存儲。
  3. 底層實現方式:redis直接構建自己的虛擬機機制
  4. value值大小:Memcached1MB,redis最大達1GB
  5. 速度:redis速度快于Memcached,因為redis內存操作、單線程操作、采用非阻塞I/O多路復用機制
  6. 災難恢復:Memcached掛掉后,數據不可恢復;redis數據丟失后可通過AOF恢復。
  7. 備份:redis支持數據備份,即master-slave模式的數據備份。

Redis緩存問題

緩存雪崩

介紹

  1. 原有緩存失效,新緩存未到期。緩存中采用相同過期時間,同一時刻出現大面積緩存過期,原本訪問Redis緩存的請求都直接去查詢數據庫,對數據庫cpu和內存造成巨大壓力,嚴重時造成數據庫宕機,從而形成一系列連鎖反應,造成整個系統崩潰。
  2. 與緩存擊穿區別是,雪崩是很多key采用相同過期時間,同時多個key失效。擊穿是某一個key緩存失效。

解決方案

  1. 考慮加鎖、或者隊列的方式保證不會有大量的線程對數據庫一次性讀寫,避免失效時大量的并發請求落到底層存儲系統上。
  2. 緩存失效時間隨機化,給每個key的失效時間加個隨機值,保證數據不會在同一時間大面積失效。
  3. 設置熱點數據永不過期,有更新操作直接更新緩存。如系統首頁,有新產品展示,直接刷緩存,無需設置過期時間。

緩存穿透

介紹

  1. 查詢一個不存在的數據:緩存和數據庫中都沒有數據,用戶不斷發起請求,在緩存中找不到,每次去數據庫中再查一遍(兩次無用查詢),然后返回空。
  2. 緩存穿透一般出現在攻擊場景下,攻擊者知道請求路徑的規則后,傳遞一些不存在的id進行查詢數據。

解決方案

  1. 采用布隆過濾器(bloom-filter):將所有可能存在的數據哈希到一個足夠大的bitmap中,不存在的數據會被這個bitmap過濾攔截掉,避免對底層存儲系統查詢壓力。布隆過濾器用于檢索一個元素是否在一個集合中,使用redisson可實現。底層是主要是初始化一個比較大數據,里面存放二進制0或1,一開始都是0,當一個key進來后經歷3次hash計算,模于數組長度找到數據的下標然后把數組中原來的0改為1,三個
  2. 若一個查詢返回數據為空,仍然將空結果進行緩存,過期時間可以設置很短(如30s,不超過5min),通過直接設置默認值放入Redis緩存,第二次查詢緩存就可以獲取值,不會繼續訪問數據庫。
  3. 代碼層面的接口層增加校驗,如用戶鑒權校驗、參數校驗等,不合法參數直接返回異常。

緩存擊穿

介紹

  1. 對于一個key非常熱點,不停的去訪問這個key,承受高并發,當key失效瞬間,持續的高并發瞬間擊穿緩存,直接請求數據庫。
  2. 對于設置了過期時間的key,緩存在某個時間點過期的時候,恰好這個時間點對這個key有大量的并發請求進來,發現緩存過期直接從后端DB加載數據并回設到緩存,壓垮DB。

解決方案

  1. 設置熱點數據永遠不過期。
  2. 加互斥鎖,緩存失效是,不立即去load db,先使用如redis的setnx去設置一個互斥鎖,當操作成功返回時在進行load db的操作并回設緩存,否則重試get緩存方法。分布式鎖可以保證數據強一致性,但是性能不高。
  3. 邏輯過期:在設置key的時候,設置一個過期時間字段一塊存入緩存中,不給當前key設置過期時間,當查詢的時候,從redis取出數據后判斷時間是否過期,瑞過期則開通另外一個線程進行數據同步,當前線程正常返回數據,這個數據是舊的,服務降級而已,適用于to c,無需保證數據強一致性時可以用。

解決思路

  1. 事前:Redis 高可用,主從+哨兵,Redis cluster,避免全盤崩潰。
  2. 事中:本地 ehcache 緩存 + Hystrix 限流+降級,避免MySQL 被打死。
  3. 事后:Redis 持久化 RDB+AOF,一旦重啟,自動從磁盤上加載數據,快速恢復緩存數據。

雙寫一致性

  1. 方法一:使用redisson實現的讀寫鎖,在讀的時候添加共享鎖,保證讀讀不互斥,讀寫互斥。當更新數據時,添加排他鎖,讀寫、讀讀都互斥,保證在寫數據的同時不會有其他線程讀寫數據,避免臟數據。底層使用setnx,保證同時只有一個線程操作鎖住的方法。
  2. 方法二:延時雙刪,若是寫操作,先刪除緩存數據,然后更新數據庫,最后再延時刪除緩存中的數據,但這個延時玄學,也可能出現臟數據,并不能保證強一致性。
  3. 方法三:采用阿里的canal組件實現數據同步。部署一個canal服務,偽裝成mysql的一個從節點,當mysql數據更新后,canal讀取binlog數據,然后通過canal的客戶端獲取到數據更新緩存。

Redis數據類型

概述

  1. String類型:value可以是String也可以是數字,做一些復雜的計數功能緩存。
  2. hash類型:value存放結構化對象,如單點登錄時存儲用戶信息,以cookieId作為key,設置30min為緩存時間。
  3. list類型:可做簡單的消息隊列。
  4. set類型:可做全局去重功能。
  5. sorted set類型:可按照score進行排序,可做排行榜應用。

字符串(string)

介紹

  1. redis的字符串是動態字符串,可修改。
  2. 采用預分配冗余空間來減少內存的頻繁分配,內部為當前字符串分配的實際空間大小,一般要高于實際字符串長度。
  3. 當字符串長度小于1MB時,擴容都是加倍。字符串最大長度為512MB。

常用命令

get、set、incr、decr、mget

應用場景

  1. 計數器:控制接口調用次數,如通過incrby命令進行遞增。
  2. 共享session:分布式服務會將用戶信息訪問負載均衡到不同的節點上。
  3. 限速:如短信獲取驗證碼功能,為了短信服務不會被頻繁訪問,限制用戶每分鐘獲取驗證碼的頻率、當天最大獲取短信的次數。

散列(hash)

介紹

  1. hash是一個鍵值對集合,適合存儲對象。
  2. hash內部是無序字典,內部存儲多個鍵值對,采用漸進式的rehash策略,在rehash時,保留新舊兩個hash結構,查詢會同時查詢新舊hash結構,漸進將舊hash內容遷移到新hash中。最終,舊hash被自動刪除,內存被回收。

常用命令

hget、hset、hmget、hmset、hgetall

應用場景

  1. 存儲對象:value存儲為HashMap

集合(set)

介紹

  1. set是string類型的無序集合,通過散列表實現。
  2. set內部相當于一個特殊字典,所有value都一個NULL值。
  3. 當集合中最后一個元素被移除后,數據結構自動刪除,內存被回收。

常用命令

sadd、srem、spop、sdiff、smemners、sunion

應用場景

  1. 去重數據功能,如用戶訪問列表查詢。

有序集合(zset)

介紹

  1. zset類似set,區別是每個元素都會關聯一個double類型的分數,通過分數來為集合的成員進行從小到大的排序。
  2. zset中的成員是唯一的,但分數可以重復。
  3. zset內部是使用“跳躍列表”的數據結構實現的。
  4. zset集合中最后一個元素被移除后,數據結構自動刪除,內存被回收。

常用命令

zadd、zrange、zrem、zcard

應用場景

  1. 去重并自動排序的數據。

列表(list)

介紹

  1. list是簡單的字符串列表,按照插入順序排序,可增加一個元素到列表的頭部或尾部。
  2. list的插入和刪除速度快,索引定位慢。
  3. list中的每個元素之間都是使用雙向指針順序連接,同時支持前后遍歷。
  4. 當最后一個元素被彈出后,數據結構自動刪除,內存被回收。

常用命令

lpush、rpush、lpop、rpop、lrange、blpop

應用場景

  1. 消息隊列,如最新通知排名,利用list的push操作,將任務存list中,再通過工作線程用pop操作將任務取出執行。

Redis原理

Redis單線程

為何Redis是單線程

  1. Redis是基于內存操作,CPU不是瓶頸,最大的瓶頸可能是機器內存的大小或者網絡帶寬,采用隊列技術將并發訪問變成串行訪問。
  2. 絕大部分請求是純粹的內存操作;
  3. 采用單線程避免不必要的上下文切換和競爭條件。
  4. 非阻塞I/O速度快,支持豐富數據類型,如String、list、set、sorted set、hash。
    支持事務,操作都是原子性,具有豐富的特性,如可用于緩存、消息隊列、按key設置過期時間。

原子性

  1. 因為redis是單線程的,一個操作不可再分,要么都執行,要么都不執行。
  2. 多個命令在并發中不一定是原子的:如get set操作。使用redis事務或者redis+lua可以實現。

Redis過期策略

為何不采用定時刪除?

  1. 用定時器負責監視key,過期則刪除,雖然可以及時釋放內存,但消耗cpu資源,在大并發情況下,cpu要將時間應用于處理各種請求,而不是刪除key。

redis采用定期刪除+惰性刪除策略。

  1. 定期刪除:默認每隔100ms檢查,是否有過期的key,有則刪除,但不是所有key都檢查一次,而是隨機抽取進行檢查,這種會造成很多key到時間未刪除。
  2. 惰性刪除:獲取某個key會檢查是否設置過期時間,過期,則刪除;這樣就可以比避免定期刪除時遺留的未刪除的key。
問題
  1. 問題:若定期刪除沒有刪除到key,且沒有及時請求該key,導致惰性刪除未生效,導致redis內存越來越高。。
  2. 解決方案:采用內存淘汰機制,在redis.conf中配置maxmemory-policy volatile-lru,即從已設置過期時間的數據集中挑選出最近最少使用的數據進行淘汰。

分類

惰性刪除
  1. 在設置該key過期時間后,不去管它,當需要該key時,會檢查是否過期,若過期直接刪除,否則,返回該key。
  2. 定期刪除會導致很多過期key到了時間并沒有被刪除掉,所以需要惰性刪除,主動檢查過期的key,發現key過期立即刪除,不會返回任何東西。
  3. 惰性刪除屬于零散處理。
定期刪除
  1. 定期刪除就是每隔一段時間,對一些key進行檢查,刪除里面過期的key。
  2. redis會將每個設置了國企時間的key都放入一個獨立的字典中,后續會定期遍歷這個字典來刪除到期的key;默認是每秒進行十次過期掃描,所以是100ms/次掃描。
  3. 定期刪除是采用簡單的貪心策略(避免全部key掃描對CPU帶來負載):從過期字典中隨機掃描20個key,刪除這20個key中已經過期的key,若過期的key比率超過1/4,就繼續隨機掃描。
  4. 定期刪除屬于集中處理。
  5. 模式分類:
    1)SLOW模式:定時任務,執行頻率默認為10hz,每次不超過25ms,通過修改配置文件redis.conf的hz選項來調整次數。
    2)FAST模式:執行頻率不固定,每次事件循環會嘗試執行,但兩次間隔不低于2ms,每次耗時不超過1ms。

Redis事務

介紹

  1. Redis事務功能通過MULTI、EXEC、DISCARD、WATCH四個原語實現。
  2. redis會將一個事務中所有命令序列化,然后按順序執行。redis不能在一個事務執行過程中插入零一二客戶端發出的請求。
  3. redis不支持回滾,redis在事務失敗時,會繼續執行剩余命令,內部可以保持簡單且快速。
  4. 如果在一個事務中命令出現錯誤,則所有命令都不會執行。
  5. 如果一個事務中出現運行錯誤,則正確的命令會被繼續執行。

四個原語

MULTI
  1. MULTI命令用于標記事務塊的開始,將后續命令逐個放入隊列中,然后才能使用EXEC命令原子化執行該命令序列。
  2. 返回值是一個簡單的字符串,總是OK。
EXEC
  1. 在一個事務中執行所有先前放入隊列的命令,然后恢復正常的連接狀態。
  2. 使用WATCH命令時,只有當受監控的鍵未被修改時,才能使用EXEC命令執行事務塊命令,采用CAS檢查再設置的機制。
  3. 返回值是衣蛾數組,每個元素分別是原子化事務中每個命令的返回值。
  4. 當使用WATCH命令時,若事務執行中止,則返回一個Null值。
DISCARD
  1. 清除所有先前在一個事務塊中放入隊列的命令,然后恢復正常的連接狀態。
  2. 返回值是一個簡單的字符串,總是OK。
WATCH
  1. 當某個事務需要按條件執行時,就需要使用WATCH命令將給定的鍵設置為受監控。
  2. 返回值是一個簡單的字符串,總是OK。
  3. 為redis事務踢動CAS(check-and-set)行為,可以監控一個或多個鍵,一旦有一個鍵被修改(或刪除),之后的事務不會執行,監控一直持續到EXEC命令執行時。

Redis事件

基于事件

核心原理是基于事件的處理流程。

  1. 主程序處于一個阻塞狀態的事件循環(event loop)中等待事件,當有事件發生時,根據事件的屬性分發到相對應的處理函數中進行處理。事件是以并發的方式發送到服務處理器,服務處理器將事件整合到一個有序隊列中,并發到具體的請求處理器進行處理。
  2. Redis程序都是圍繞事件循環進行的。事件循環同時監控多個事件(Redis對于連接套接字的抽象),當套接字變為可讀或者可寫狀態,則會觸發該事件,把就緒的事件放在一個待處理事件的隊列中,以有序、同步的方式發送給事件處理器進行處理。(Fire過程)
  3. Redis事件循環會保存兩個表:events和fired列表,前者存儲正在監聽的事件,后者存儲就緒的事件。
  4. Redis處理所有命令都是順序執行的,包括客戶端的連接請求、內部定時執行的任務等。所以當Redis處理一個復雜度高、時間很長的請求(如keys命令、自動刪除一個過期的大key),則其他客戶端連接有可能被阻塞。所以一般不使用大key,否則可能會造成業務卡頓。

Redis事件處理流程

  1. 加載配置
  2. 配置參數初始化:創建事件循環
  3. 循環事件注冊一個可讀事件,用于處理響應客戶端請求
  4. 執行事件循環,等待連接和命令請求
  5. 注冊事件,被eventLoop監聽
  6. 讀寫操作需要執行的就緒事件

Redis持久化

RDB

  1. RDB是一個快照文件,是把redis內存存儲的數據寫到磁盤上,當redis實例宕機恢復數據的時候,方便從RDB的快照文件中恢復數據。
  2. RDB是二進制文件,保存的時候體積比較小,恢復快,但可能會丟失數據。

AOF

  1. AOF是追加文件,當redis操作寫命令的時候,都會存儲這個文件中,當redis實例宕機恢復數據的時候,會從這個文件中再執行一遍命令恢復數據。
  2. 通常在項目中使用AOF恢復數據,速度雖然慢,但丟數據的風險小,AOF文件可設置刷盤策略,如每秒批量寫入一次命令。

Redis數據淘汰策略

概述

  1. 談淘汰策略之前,我們知道redis有過期刪除,根據TTL時間進行定期采樣刪除或惰性刪除
  2. 有過期策略為何還要淘汰策略?因為過期策略不能夠完全精準的全部刪除數據,會存在key沒有被刪除的場景,所以需要內存淘汰策略進行兜底。

內存淘汰策略

  1. noeviction:當內存使用超過配置的時候會返回錯誤,不會驅逐任何鍵
  2. allkeys-lru:加入鍵的時候,如果過限,首先通過LRU算法驅逐最久沒有使用的鍵
  3. volatile-lru:加入鍵的時候如果過限,首先從設置了過期時間的鍵集合中驅逐最久沒有使用的鍵
  4. allkeys-random:加入鍵的時候如果過限,從所有key隨機刪除
  5. volatile-random:加入鍵的時候如果過限,從過期鍵的集合中隨機驅逐
  6. volatile-ttl:從配置了過期時間的鍵中驅逐馬上就要過期的鍵
  7. volatile-lfu:從所有配置了過期時間的鍵中驅逐使用頻率最少的鍵
  8. allkeys-lfu:從所有鍵中驅逐使用頻率最少的鍵

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212545.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212545.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212545.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

三個臭皮匠(ctr,nerdctl,crictl)頂一個諸葛亮(docker)

文章目錄 containerd簡介 nerdctl簡介安裝精簡 Minimal 安裝完整Full 安裝啟動服務 命令參數容器運行容器列出容器詳情容器日志容器進入容器停止容器刪除鏡像列表鏡像拉取鏡像標簽鏡像導出鏡像導入鏡像刪除鏡像構建配置tab鍵配置加速配置倉庫http方式https方式 ctr簡介命令參數…

12、虛函數的應用、虛析構函數

12、虛函數的應用、虛析構函數 運行時類型信息(RTTI)動態類型轉換(dynamic_cast)typeid操作符 虛 析構函數空虛析構函數 一個類中,除了構造函數和靜態成員函數外,任何函數都可以被聲明為虛函數 運行時類型信息(RTTI) 動態類型轉換(dynamic_cast) 用于…

AMC8美國數學競賽歷年真題集在線練習操作指南和2024年備考建議

今天是2023年12月10日,距離2024年的AMC8美國數學競賽的舉辦還有40天時間。據六分成長了解,有一些孩子報名參加了AMC8的機構培訓班系統學習,也有一些孩子選擇了自己自學備考。 有家長問AMC8的培訓是否一定要參加機構的培訓班學習?…

基于SpringBoot+thymeleaf協同過濾算法山河旅游推薦系統(Java畢業設計)

大家好,我是DeBug,很高興你能來閱讀!作為一名熱愛編程的程序員,我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里,我將會結合實際項目經驗,分享編程技巧、最佳實踐以及解決問題的方法。無論你是…

windows端口被占用怎么辦 怎么關閉那個占用的端口

目錄 這是出現的情況怎么解決了1.請打開這玩意2.輸入下面---查詢 先關端口的信息根據id獲得服務 上圖的8888 對應的ip 上圖就是134243.殺死進程134244.重啟服務 這是出現的情況 怎么解決了 1.請打開這玩意 2.輸入下面—查詢 先關端口的信息 netstat -ano過濾信息查詢想要的端…

JavaScript將函數作為參數傳入

其他函數中,是一種常見的編程技巧,稱為回調函數。在 JavaScript 中,函數被視為一等公民,也就是說,它們可以像任何其他類型的值一樣被傳遞、分配和操作。 示例: function greet(name) {console.log(Hello …

央企國企相關

文章目錄: 一:央企國企的區別 二:分類 三:相關 1.考什么 2.有什么崗位 3.什么時候考 4.去哪里報名和查看信息 5.喜歡招聘什么專業 6.其他疑問 一:央企國企的區別 央企國企一共有47萬多個(央企131個…

【8.0.34-0 ubuntu 安裝Mysql 后無法鏈接是什么情況】

8.0.34-0 ubuntu 安裝Mysql 后無法鏈接是什么情況 檢查日志解決辦法 檢查日志 如果檢查一下帳號密碼沒問題看一下日志: Plugin mysql_native_password reported: mysql_native_password is deprecated and will be removed in a future release. Please use cachi…

java中的context對象?

java中的context對象? 大家好,我是微賺淘客系統的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!今天,我們將深入研究Java中的神秘利器——Context對象。在Java開發中,Context對象扮演著重要的角…

排序算法之六:快速排序(遞歸)

快速排序的基本思想 快速排序是Hoare于1962年提出的一種二叉樹結構的交換排序方法 其基本思想為: 任取待排序元素序列中的某元素作為基準值,按照該排序碼將待排序集合分割成兩子序列,左子序列中所有元素均小于基準值,右序列中所…

《深入理解計算機系統》學習筆記 - 第四課 - 浮點數

Floating Point 浮點數 文章目錄 Floating Point 浮點數分數二進制示例能代表的數浮點數的表示方式浮點數編碼規格化值規格化值編碼示例 非規格化的值特殊值 示例IEEE 編碼的一些特殊屬性四舍五入,相加,相乘四舍五入四舍五入的模式二進制數的四舍五入 浮…

【Qt5】setWindowFlags的標志有哪些?

2023年12月9日,周六晚上 窗口類型: Widget(0x00000000):普通窗口部件。Window(0x00000001):標準窗口。Dialog(0x00000002 | Window):對話框&#…

UI自動化Selenium 鼠標滑動懸停到指定元素

ActionChains執行原理 他是按照設計好的動作順序鏈式執行; 當調用ActionChains的方法時,不會立即執行,只是將要做的動作安裝順序存放在隊列中;當調用perform()方法時,隊列中的方法會依次執行; from sele…

西南科技大學數字電子技術實驗三(MSI邏輯器件設計組合邏輯電路及FPGA的實現)預習報告

一、計算/設計過程 說明:本實驗是驗證性實驗,計算預測驗證結果。是設計性實驗一定要從系統指標計算出元件參數過程,越詳細越好。用公式輸入法完成相關公式內容,不得貼手寫圖片。(注意:從抽象公式直接得出結果,不得分,頁數可根據內容調整) 1、4位奇偶校驗器 真值表 …

C++ Qt開發:使用關聯容器類

當我們談論編程中的數據結構時,順序容器是不可忽視的一個重要概念。順序容器是一種能夠按照元素添加的順序來存儲和檢索數據的數據結構。它們提供了簡單而直觀的方式來組織和管理數據,為程序員提供了靈活性和性能的平衡。 Qt 中提供了豐富的容器類&…

AI:大模型技術

Prompt Prompt(提示)是一種在人工智能領域,特別是在自然語言處理和聊天機器人中常用的技術。它是一種輸入,用于激發人工智能模型生成相應的輸出。在聊天機器人中,用戶輸入的問題或請求就是提示,而聊天機器…

基于AidLux的工業視覺少樣本缺陷檢測實戰應用

1. 模型轉換 AIMO網站: http://aimo.aidlux.com/ 試用賬號和密碼: 賬號:AIMOTC001 ,密碼:AIMOTC001 上傳模型選擇目標平臺參數設置選擇自動轉換轉換結果并下載 2. 基于AidLux的語義分割模型部署 dataset2aidlux文件…

期待一下elasticsearch還未發布的8.12版本,由lucene底層帶來的大幅度提升

現在是北京時間23年12月10日。當前es最新版本還是es8.11版本。我們可以期待一下不久的將來,es的8.12版本看到大幅度的檢索性能提升。受益于 Lucene 9.9版本,內核帶來的大幅提升! 此次向量檢索利用底層指令fma會性能提升5%。并且還提供了向量點…

在Spring Cloud使用Hystrix核心組件,并注冊到Eureka注冊中心去

其實吧,寫Spring Cloud系列,我有時候覺得也挺難受的,因為Spring Cloud的微服務啟動都需要一個一個來,并且在IDea中也需要占用比較大的內存,并且我本來可以一篇寫完5大核心組件的,但是我卻分了三篇&#xff…

簡單的圖像分類任務全流程示例(內含代碼)

以下是一個簡單的示例,展示了如何使用 PyTorch 處理自定義圖像分類數據集: import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from torch.utils.data import DataLoad…