CDN緩存替代算法

CDN緩存工作過程如下:用戶發出一個請求,如果請求被命中,緩存將對用戶的請求進行響應,返回其請求的數據;如果未被命中,緩存向上拉取用戶需要的數據,并對其存儲的數據進行替換。

緩存算法的意義在于,根據用戶的請求習慣,對于緩存種的數據進行更新,使得用戶據請求的命中率提高,縮短整體響應用戶請求延時,同時提高高峰時間網絡所能承受的訪問容量。

現有的緩存替代算法主要思路有下面幾種:
1、基于訪問頻率,通過某段時間內對資源被訪問的次數進行統計,以此判斷該資源接下來是否被訪問,典型算法:LFU、2Q、LIRS
2、基于訪問時間,通過i記錄資源訪問的時間,以時間做判斷,典型算法:LRU
3、訪問時間與訪問頻率相結合,典型算法:LRFU、FBR
CDN緩存算法具體有五種典型算法:
1、“最近最少使用”緩存算法
2、“最少頻率使用”緩存算法
3、“基于分數因子”緩存算法
4、“塊等級”緩存算法

Least Recently Used算法

緩存將保留最近一段時間內經常使用的數據,而淘汰最近未被經常使用的數據。
基于事實:最近一段時間內經常被訪問的數據在未來一段時間內也會被訪問
簡單版本的實現可以參考https://leetcode-cn.com/problems/lru-cache/
缺點:最近被訪問的內容不一定是最熱門的,這將導致一些冷門內容留在緩存種,影響用戶訪問內容和服務響應用戶的效率。
另外可以看看mysql里面對于lru的改進:MySQL——Innodb改進LRU算法

Least Frequency Used算法

該算法按照內容的訪問頻率對內容進行排序。
緩存一般被分為兩部分:固定緩存(AC,Actual Cache)和隱藏緩(SC,Shadow Cache)
固定緩存是更新不頻繁,資源變動較少的那部分緩存
隱藏緩存是更新頻繁,資源變動較大的那部分緩存
當用戶發出訪問請求時,未命中的內容將先被存儲到SC種。在一定時間間隔T內,緩存中會維持一個頻率列表,記錄每個內容被訪問的次數。T時間過去之后,{AC,SC}種被請求次數最多的內容將會被更新到AC中,在下一輪T之內,AC中內容不會被替換掉。
基于事實:內容被訪問的頻率能夠反映內容的熱門程度。AC和SC的增加使得最少頻率的準確率得到提高
缺點:計算頻率的時間段T的大小不好控制,AC和SC的容量不好控制,替換時間設定不好控制
簡單版本的實現可以參考:
https://leetcode-cn.com/problems/lfu-cache/solution/lfuhuan-cun-by-leetcode-solution/
代碼如下:

// 緩存的數據結構
struct cacheNode {int cnt;    // 緩存使用的頻率int time;   // 緩存使用的時間int key;    // 緩存的鍵int value;  // 緩存的值cacheNode(int _cnt, int _time, int _key, int _value) {cnt = _cnt;time = _time;key = _key;value = _value;}// 實現一個cacheNode的比較函數// 頻率小的排前面,如果頻率一樣,時間短的排前面bool operator< (const cacheNode& rhs) const {return cnt == rhs.cnt ? time < rhs.time : cnt < rhs.cnt;}};
class lfuCache {
private:// 緩存的容量,時間數int capcity;int time;std::unordered_map<int, cacheNode> keyTable;std::set<cacheNode> balanceTree;
public:lfuCache(int cap) {capcity = cap;time = 0;keyTable.clear();balanceTree.clear();}int get(int key) {if (capcity == 0) return -1;auto it = keyTable.find(key);if (it == keyTable.end()) return -1;cacheNode cache = it->second;balanceTree.erase(cache);cache.cnt += 1;cache.time = ++time;balanceTree.insert(cache);it->second = cache;return cache.value;}void put(int key, int value) {if (capcity == 0) return;auto it = keyTable.find(key);if (it == keyTable.end()) {if (keyTable.size() == capcity) {keyTable.erase(balanceTree.begin()->key);balanceTree.erase(balanceTree.begin());}cacheNode cache = cacheNode(1, ++time, key, value);keyTable.insert(std::make_pair(key, cache));balanceTree.insert(cache);} else {cacheNode cache = it->second;balanceTree.erase(cache);cache.cnt += 1;cache.time = ++time;cache.value = value;balanceTree.insert(cache);it->second = cache;}}
};

Scoring based Caching算法

1、定義:對每一個視頻(Vi),都維護一個分數(Si)。每個視頻i在被放入緩存時,都會得到一個初始化分數Si = B。
每一次視頻i被請求,該視頻都會得到一個新的分數,而其余視頻分數也會相應調整:Si = Si + A,其余視頻Sk = Sk - 1(k != i)
2、替換規則:在維護一個分數上,有兩種替換策略:

  • 區間分數法:定義一個有效分數區間【M,N】。若某個視頻的分數在這個區間內,且不再緩存中,則把這個視頻放入緩存。如果某個在緩存中的視頻的分數不在這個區間內,則在緩存中刪除該視頻
  • 最優分數法:根據一個節點的最大存儲能力,如能存L個視頻,選擇最優分數的內容進行緩存。每次有一部視頻的分數有改變,則進行排序,凡分數不在前L的視頻從緩存中刪除,凡分數在前L的視頻加入緩存中

3、請求處理:對于每個CDN視頻的請求,會出現以下三種處理事件

  • 1、請求的視頻已在緩存中,請求命中。此時只需要對視頻的分數做出調整,不需要在緩存中刪除內容,也不需要向上級節點請求內容。CDN內部沒有流量消耗
  • 2、請求的視頻不在緩存中而算法要求節點緩存該視頻。節點向上級節點賦值被請求的視頻,然后在復制之后向用戶發送被請求的視頻,將視頻加入緩存,調整分數。此時CDN內部有流量消耗,邊緣節點向中心節點復制了視頻內容
  • 3、請求的視頻不在緩存中而算法不要求節點緩存該視頻,調整分數,不需要從中心點復制內容,請求被轉發到中心節點。CDN內部沒有流量消耗

4、其他
1、一般來說,節點應該維護每一部視頻的分數,但實際上分數過低的視頻,一般不維護分數,而是從關注列表中移除
2、Shadow Cache。每個節點存儲能力被分為兩個部分。較大的部分用來存儲內容,較小的部分用來存儲視頻列表、分數等與管理有關的內容。兩個存儲空間嚴格分開。宏觀上看,節點有部分存儲能看不可見,稱為Shadow Cache
最后,基于分數因子的緩存算法不是一個獨立的算法,而是其他算法的基礎或者框架。例如LRU和LFU可以看作對于分數不同定義的最優分數法的分數因子緩存。

Chunk-level Caching算法

1、定義:基于塊等級的緩存算法, 時在分數因子緩存算法基礎上,把每個視頻分成大小相同、內容連續的k塊分別存儲,然后每個視頻塊的分數Sk繼承原視頻的分數Si。定義第i個視頻的第k塊視頻的分數為Si,k
2、計分策略
每部視頻被訪問,則對視頻i內的所有塊都進行+1:Si,k = Si,k +1
若第k塊被完整觀看,則Si,k = Si,k + 1
若停止觀看(退出、快進、快退),則說明用戶對該塊不感興趣,則Si,k = Si,k - 1;
3、請求處理
大部分時候,塊等級的緩存算法,與基于分數因子的緩存算法十分相像,即上面SC出現的3種請求處理的情況都會出現。不同之處在于之前是比較Si來進行取舍,現在是比較Si,k。
4、其他
基于塊等級的緩存算法,主要用于單個內容較大的內容分發網絡,如視頻分發網絡。它考慮了以下一個事實,即人們可能對視頻的某一段感興趣,把整個視頻存儲下來會產生浪費;或者人們只瀏覽了視頻的開頭,就會選擇看或者不看。因此,在計分規則中,充分考慮了這些事實。
① 一個用戶請求了某個視頻,則可能對這個視頻的其他部分都感興趣,因此計分策略1體現了這個需求。
② 一個用戶看完了某一塊,則可能不會再回去看了,因此計分策略2體現了這個需求。
③ 一個用戶停止觀看某段視頻,則可能不會再看這段視頻之后的其他視頻塊,因此計分策略3體現了這個需求。

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

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

相關文章

前端開發常用正則表達式

1、電話 var phone /(^[^1][0-9\-]{6,20}$)|(^(134|135|136|137|138|139|150|151|152|157|158|159|182|183|187|188|147|130|131|132|155|156|185|186|145|133|153|180|189|181|184)\d{8}$)/ 2、郵箱 var email /^([a-zA-Z0-9_.-])([a-zA-Z0-9_-])((\.[a-zA-Z0-9_-]{2,3}){1,…

android 中調用接口發送短信

轉載&#xff1a;http://ziyu-1.iteye.com/blog/1013932 android中可以通過兩種方式發送短信 第一&#xff1a;調用系統短信接口直接發送短信&#xff1b;主要代碼如下&#xff1a; Java代碼//直接調用短信接口發短信 SmsManager smsManager SmsManager.getDefault(); List…

linux 命令案例學習——文件搜索

兩個搜索文件的工具 locate ——僅僅通過文件名查找文件find ——依據文件的各種屬性在既定目錄&#xff08;包括子目錄&#xff09;里查找一個通常與文件搜索命令一起使用、處理搜索結果文件列表的命令 xargs1 locate 1.1 查找文件名中含有zip的文件名 locate zip 看下結…

Redis 緩存擊穿、緩存穿透、緩存雪崩的處理方法

常用的分布式緩存Redis單機并發量能達到萬級&#xff0c;常用的關系型數據庫MySQL一般并發量是千級&#xff0c;他們支持的并發量可能差十倍&#xff0c;所以要盡可能把流量攔截在緩存層。 緩存擊穿 一個并發訪問量比較大的key在某個時間過期&#xff0c;導致所有的請求直接打…

Java-- 異常與記錄日志

可以使用java.util.logging工具將輸出記錄在日志中。記錄日志的的功能還是很簡單的&#xff0c;下面直接鋪出代碼&#xff1a; 1 package com.exceptions;2 3 import java.io.*;4 import java.util.logging.Logger;5 6 class LoggingException extends Exception{7 private…

圖像處理基礎

圖像處理基礎 在計算機中&#xff0c;按照顏色和灰度的多少可以將圖像分為二值圖像、灰度圖像、索引圖像和真彩色RGB圖像四種基本類型。目前&#xff0c;大多數圖像處理軟件都支持這四種類型的圖像。 (1) 二值圖像&#xff1a;一幅二值圖像的二維矩陣僅由0、1兩個值構成&#x…

緩存一致性解決方法

對于緩存 數據庫讀寫&#xff0c;有個經典的Cache Aside Pattern&#xff1a; 讀取&#xff1a;先讀取緩存&#xff0c;緩存里沒有&#xff0c;讀取數據庫&#xff0c;然后返回響應&#xff0c;順便保存緩存&#xff1a; 更新&#xff1a;先更新數據庫&#xff0c;然后刪除緩…

使用SpringMVC的表單驗證

上一篇搭建了基本項目&#xff0c;這一篇在此基礎上加入表單驗證功能。 第一步&#xff0c;添加command類 Java代碼 package test.bean; import javax.validation.constraints.Size; public class User { Size(min3,max30) private String username; …

hdu1247(Hat’s Words)

我以為像a、aa這樣的輸入應該是沒有輸出的&#xff0c;結果還是要輸出aa。 建樹的時候就是常規建樹&#xff0c;不過查找的時候要做一些變形&#xff1a;對于一個單詞&#xff0c;從第一位檢查有沒有單詞是它的前綴&#xff0c;如果有的話&#xff0c;再去檢查它的后半部分是不…

單體、分布式、微服務、Serverless軟件架構一覽

目錄軟件架構單體架構分布式應用微服務架構Serverless架構總結Reference軟件架構 軟件架構就是軟件的基本結構&#xff0c;合適的架構是軟件成功的最重要因素之一。這里列舉了目前流行的4種軟件架構。 單體架構 典型的三級架構&#xff1a;前端&#xff08;web/手機端&#…

MyBatis3 association error - The content of element type resultMap must match (constructor?,id*,r...

MyBatis3 association error - The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collection*,discriminator?)" 1.后臺錯誤信息-問題現象&#xff1a; ERROR [geby:Context initialization failed] 2013-0…

Midjourney V6刷屏,但它最可怕的地方居然不是那些神圖?

Midjourney在沉寂九個月后推出了Midjourney V6&#xff0c;這個文生圖產品體現出的更細膩的細節處理&#xff0c;更強大的語言理解能力和更加“不像AI”的圖片效果在過去幾天引發一片驚呼。 作為一個閉源的模型產品&#xff0c;Midjourney的魔法配方并不為人所知&#xff0c;但…

HTTP 錯誤500.19 -Internal Server Error

HTTP 錯誤500.19 -Internal Server Error 原文:HTTP 錯誤500.19 -Internal Server Error HTTP 錯誤500.19 -Internal Server Error 錯誤代碼 0x80070021 asp.net 2009-11-05 16:54:33 閱讀484 評論1 字號&#xff1a;大中小 錯誤摘要 HTTP 錯誤500.19 -Internal Server Error …

連續內存分區式內存管理

目錄前言分區式內存管理動態分區內存管理總結本筆記參考黃工的https://mp.weixin.qq.com/s/k0W_LqI1zBAYC1GU1U2HQA 前言 內存管理模塊主要負責內存的初始化、分配以及釋放。 從分配內存是否連續可以分為兩大類&#xff1a; 1、連續內存管理 為進程分配的內存空間是連續的&a…

用DEVC++作圖

小海豚學NOIP&#xff0c;老師說要用DEV C。 小海豚喜歡畫圖&#xff0c;記得以前用C#編些程序給她看。可前一陣打開看&#xff0c;我的免費Visual Studio過期了。可惡的Microsoft &#xff0c;不想用盜版難道就要每個月就下載一次&#xff1f; 于是就用DEV C的Windows調用吧。…

Python服務器開發三:Socket

Python服務器開發三&#xff1a;Socket socket是操作系統中I/O的延續&#xff0c;它可以使進程和機器之間的通信成為可能。socket可以看成一個標準的文件描述符。不同的是文件需要用open()函數打開&#xff0c;而socket用socket() 函數建立.recv()、send()函數和read()、write(…

Syntax error: Bad for loop variable解決辦法

在Ubuntu下寫的shell文件t.sh執行時出現錯誤&#xff1a; 1 t.sh: 6: Syntax error: Bad for loop variable 從ubuntu 6.10開始&#xff0c;ubuntu就將之前默認的bash shell更換成了dash shell&#xff0c;其表現為/bin/sh鏈接倒了/bin/dash&#xff0c;而不是傳統的/bin/bash&…

Linux命令常見

摘自&#xff1a; 常考的 21 條 Linux 命令 目錄&#xff09;cd,切換路徑ls,查看文件與目錄的命令cp,用于復制文件mv,用于移動文件、目錄cat,查看文件內容find&#xff0c;文件搜索文件權限命令&#xff0c; 設置權限&#xff0c;-取消權限文本處理命令打包和壓縮文件命令進程相…

記一次調試

這是我最近幾個月來遇到的最棘手的一個問題&#xff1a;* 昨天花了4個小時找出第一層次的原因這個糾結啊&#xff0c;本來和老婆說好準時下班回家吃飯的&#xff0c;結果被這個問題拖了老久。這是一個gradle的plugin&#xff0c;用來resolve公司內部的dependency的&#xff0c;…

OSGi.NET 學習筆記 [模塊化和插件化][小結]

【目錄】-【模塊化和插件化】-【小結】 現在我們來對OSGi.NET的“模塊化和插件化”做一個小結&#xff0c;再次把官方的說明拿出來  1&#xff09; 物理隔離&#xff1a;基于UIOSP開發的模塊是一個物理隔離的可單獨部署的模塊&#xff0c;每一個模塊擁有獨立的文件夾、類型空…