Redis數據結構和持久化

數據類型

String:Map<String,String>

命令格式

set key value(相同的key會覆蓋)
get key
incr key
decr key
setex key seconds value seconds秒后失效
ttl key
del key
setnx ke value(if not exist)

應用場景

計數器
比如:訪問次數,減少mysql訪問
共享session
用戶登錄后將信息存儲在共享redis緩存層中

Hash:Map<String,HashMap<String,String>>使用ziplist和hash表來實現

命令格式

hset key filed value
hget key filed
hexist key field
hvals key
hkeys key
hgetall key
hincrby key field increment
hdel key filed

應用場景

存儲對象,代替String,String是使用的json來存儲對象,而hash使用一個hashmap來存儲對象,filed-value這樣,將對象存儲在hash比存儲在String空間小。
session也可以用hash存儲。
當使用string存儲對象,需要將對象轉換為json(所以查更容易,而修改某一字段需要轉為對象然后再轉為json),而用hash,查詢需要自己做序列化(但是修改某一字段容易)

List:Map<String,List >使用ziplist和雙向鏈表來實現

命令格式

rpush key value
lpush key value
rpop key
lpop key
llen key
lrange key start stop//如果是[0,-1]則是所有數據
List相當于一個雙端隊列來使用的,也可以從中間插入和刪除數據但是不常用

應用場景

常用于單key,多value
用戶收藏列表

Set:Map<String,Set>用intset和哈希表實現

無序,不重復,單key,多value

命令格式

sadd key [members]
smembers key 遍歷所有
srem key [members]
spop key count 隨機彈出key

特點

差集,并集,交集
sdiff key1 key2
sunion key1 key2
sinter key1 key2

應用場景

去重
抽獎:pop

Zset: Map<String,Set>跳表和哈希表

每個元素都有一個double的分數(在add時必須添加),然后用分數做key排序

zset的插入流程

會先在hash表中查找該元素是否存儲,如果存在則更新分數,然后在跳表中重新插入。
如果不存在,則插入跳表和hash表。

操作指令

zadd key scrose value
zincrby key increment member
zrange key start stop [withscores]
zrevrange key start stop
zcard key 數量
zrank key member member的排名
zrevrank key member member的逆序排名
范圍刪除,返回范圍等操作

應用場景

排行榜
延遲隊列,定時任務
優先級隊列

各種數據類型的效率

String插入O1,查詢O1

Hash插入O1,查詢O1

List插入O1,查詢On

Set插入O1,查詢O1

ZSet插入Ologn,查詢Ologn/nlogn

當使用成員查看排名時rank,先用hash定位在跳表中的位置,然后遍歷跳表,查看其排名,所以是logn
當查看zrange一定排名的成員時,過程和rank相似

設計redis

如果需要一個map形式的緩存,并且本地Map不太合適:

redis集群,分片,保證了數據的高可用和高可靠
redis有持久化機制
高效了數據結構
Lua腳本
分布式鎖
過期鍵

設計v

是否需要排序:zset
單value還是多value?
多value:List,hash,set
單value:string
不允許重復:set

設計key

唯一性
可讀性

模塊名:數據名:主鍵id
表名:主鍵名:主鍵值:列名

全局命令

key pattern
exists key
type key
expire key seconds
perist key
select 0-15 選數據庫
randomkey 一個隨機key
rename key newname
dbsize

redis事務

單個redis命令是原子性的,因為redis單線程,執行完一個命令才會執行下一個。
redis存在事務的概念,但是只是一個執行腳本包,不支持事務的回滾等。
加入隊列,順序執行任務。如果在此期間有其他命令插入,需要等待事務執行完畢。
multi
command:queued
command:queued
command:queued
exec

持久化

RDB

使用save(阻塞)或者bgsave(子進程)來創建一個新的rdb文件。

間隔RDB自動保存

redis每個數據庫都會保存上次save時間以及期間做的dirty次數。
save 100 2 如果100有兩個修改,則會調用save

RDB二進制文件內容

下面是RDB文件的內容:
redis:db_version:selectdb:0:paris:selectdb:3:pairs:EOF:check_sum
selectdb:0代表0號數據庫,pairs中存儲鍵值對和過期時間(如果有)

AOF

將用戶的命令記錄到文件中。

當啟用AOF時,載入數據庫時就會優先載入AOF而不是RDB

格式

set msg “hello”
/r/nset/r/n$3/r/nmsg/r/n$5/r/nhello/r/n

AOF的實現流程:命令追加,文件寫入,文件同步

命令追加:每次執行完一個命令后,就會將其加入aof_buf緩沖區尾部。
AOF文件寫入和同步:時間事件的AOF寫入觸發時,會將aof_buf的數據寫入aof,并且文件同步。
aof文件寫入策略:
(1)always : 每次寫入aof_buf都會寫入并且同步aof落到磁盤。
(2)everysec:每秒寫入aof文件,但是每秒才會將最新的aof文件修改落到磁盤。
(3)no:有操作系統完成aof落磁盤

AOF文件載入

依次執行AOF文件中的內容

AOF文件重寫:不會阻塞

會讀數據庫,然后創建aof語句。

Redis中的過期刪除策略

redis可以減少mysql的讀操作,減少磁盤io。
但是內存如果只放不刪,遲早會滿。
所以Redis設置了一個屬于每個數據庫的過期字典。

設置過期時間來判定鍵是否過期

設置過期時間:expire key second

查看過期時間:ttl key

移除過期時間:persist key

過期字典:key是鍵對象指針,value是long類型的UNIX時間戳

檢查鍵是否過期

檢查該鍵是否存在于過期字典,如果存在獲得該鍵的過期時間。檢查當前UNIX時間戳是否大于鍵的ttl,如果大于則過期

過期鍵刪除策略:如果一個鍵過期了,那么它什么時候被刪除

redsi使用:惰性刪除+定期刪除(每隔一段時間就掃描一些過期鍵空間)

采用隨機掃描,而不是順序記錄掃描

設置的參數:
hz 20 (config set hz 20):每秒掃描20次
active-expire-effort 1 : 每次掃描的努力情況,越大掃描越徹底

RDB對過期鍵的處理

在生成RDB文件時,會檢查鍵是否過期,如果過期,則不會放入RDB文件中。

載入RDB文件中對過期鍵的處理

如果過期,不會載入

AOF對過期鍵的處理

當一個鍵被過期刪除時,會向AOF文件中寫入一條del命令

AOF重寫對過期鍵的處理

重寫時,過期則不會寫入AOF文件

集群模式下的鍵過期

集群下,從服務器不會主動刪除過期鍵(惰性和定期都不會),主服務器檢測到過期鍵會向從服務器發生del命令。
通過主服務器控制所有過期鍵,可以保證主從一致性,當一個過期鍵在主服務器中沒有被刪除,那么從服務器中也一定沒有被刪除(此時客戶端仍然可以讀到)。

Redis的內存淘汰策略(主動刪除,即使是一些鍵沒有到達ttl也會被刪除)

當reids使用的內存空間超過設置的最大內存空間,就會使用內存淘汰策略:
配置:
maxmemory 256mb (config set maxmemory 256mb)
maxmemory-policy allkeys-lru

觸發內存淘汰策略是漸進式的,分階段回收內存的,避免長時間阻塞

處理設置了過期時間的數據

volatile-lru(最近最少使用,維持一個LRU的隊列)
volatile-ttl(設置了過期時間的,剩余存活時間最短的鍵)(鍵有一個訪問頻率的計數器,并且使用了時間衰減機制)
volatile-lfu(最不常使用)
volatile-random

LFU:A最近調用了3次(時間無關,次數有關)
LRU:A在3秒前調用了一次(時間相關)

處理全部數據

allkeys-lru
allkeys-lfu
allkeys-random

不處理,直接報錯異常

no-enviction

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

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

相關文章

1招搞定maven打包空間不足問題

目錄 一、工具應用問題 二 、使用效果 三、使用方法 四、練習手段 一、工具應用問題 使用maven的package功能打包失敗&#xff0c;報錯“Java heap space”錯誤。 二 、使用效果 修改IDEA中maven內存使用大小后&#xff0c;打包成功。 三、使用方法 點擊菜單“File->Set…

C++ 例外處理 try throw catch

例外處理 程式中可能會發生的錯誤有三種&#xff0c;分別是語法錯誤(syntax error) 、執行期間錯誤(runtime error) 及語意錯誤(semantic error) &#xff0c;其中編譯器會直接檢查出語法錯誤&#xff0c;如果含有語法錯誤的程式無法過編譯&#xff0c;例如 $ g u06.cpp u06.c…

【PythonRS】基于Python分塊處理大型遙感影像的方法

RSer工作時不可避免會用到大型的遙感影像,由于分辨率過高、區域過大、波段信息過多等原因,都會導致數據非常的大。這個時候我們在進行一些簡單的操作,如計算NDVI、二值化、分類等時,計算機的內存都會溢出。因此今天跟大家分享一下我平時分塊的方法,中間如何計算就按照自己…

Docker 使用基礎(3)—容器

&#x1f3ac;慕斯主頁&#xff1a;修仙—別有洞天 ??今日夜電波&#xff1a;秒針を噛む—ずっと真夜中でいいのに。 0:34━━━━━━?&#x1f49f;──────── 4:20 &#x1f504; ?? ? …

let/const/var的區別及理解

在JavaScript中&#xff0c;let、const 和 var 是用來聲明變量的關鍵字&#xff0c;但它們之間在作用域、變量提升、重復聲明等方面存在區別&#xff0c;詳細情況如下: 1. let、const、var 的區別 (1) 塊級作用域 let 和 const&#xff1a;具有塊級作用域&#xff0c;由 {} 包…

百數教學秘籍:三步走,輕松規劃你的自動化計劃任務

通過設定任務計劃&#xff0c;用戶可以輕松安排指定的功能插件或數據助手在特定時間自動執行&#xff0c;有效提高工作效率&#xff0c;還確保了數據的及時更新和處理。任務計劃在應用啟動時自動啟動并在后臺運行&#xff0c;無需用戶持續監控&#xff0c;為用戶帶來極大的便利…

oracle哪些后臺進程不能殺?

oracle 有很多的后臺進程&#xff0c;在遇到特殊情況的時候如鎖表&#xff0c;如果等待的是一個后臺進程&#xff0c;那這時就需要考量是不是能殺掉這個后臺進程&#xff1f;殺掉這個后臺進程會不會引起實例崩潰&#xff1f;本著實踐出真知&#xff0c;本文針對oracle 11g&…

游戲開黑語音-使用云服務器部署teamspeak服務(系統Ubuntu 20.04 LTS)

目錄 前置物品服務器調整及部署1.重裝系統2.換源3.下載teamspeak服務端并部署 連接服務器參考 前置物品 一臺云服務器&#xff08;系統&#xff1a;Ubuntu 20.04 LTS) 服務器調整及部署 1.重裝系統 在騰訊云官網的主機控制臺內&#xff0c;選擇重裝系統 (由于之前為了快點和…

【刷題匯總 -- 最長回文子串、買賣股票的最好時機(一)、[NOIP2002 普及組] 過河卒】

C日常刷題積累 今日刷題匯總 - day0101、最長回文子串1.1、題目1.2、思路1.3、程序實現 2、買賣股票的最好時機(一)2.1、題目2.2、思路2.3、程序實現2.4、程序實現 -- 優化 3、[NOIP2002 普及組] 過河卒3.1、題目3.2、思路3.3、程序實現 -- dp 4、題目鏈接 今日刷題匯總 - day0…

Excel中用VBA實現Outlook發送當前工作簿

Excel中用VBA實現Outlook發送當前工作簿&#xff0c;首先按AltF11打開VBA編輯器&#xff0c;插入模塊&#xff0c;并在工具-引用中勾選 Microseft Outlook .0 Object Library(其中為你Microseft Outlook的版本號。 Sub 發送郵件() 保存當前excel ThisWorkbook.Save讓excel連接…

Linux 入門教程 by 程序員魚皮

本文作者&#xff1a;程序員魚皮 免費編程學習 - 編程導航網&#xff1a;https://www.code-nav.cn 大家好&#xff0c;我是魚皮。 前兩天我學編程的老弟小阿巴過生日&#xff0c;我問他想要什么禮物。 本來以為他會要什么游戲機、Q 幣卡、鼠標鍵盤啥的&#xff0c;結果小阿巴…

模擬防止重復提交

gitee地址&#xff08;需要自取&#xff09;AopProxy重復提交: 防止重復提交 (gitee.com) RestController public class SubmissionController {Autowiredprivate SubmissionService submissionService;private static Jedis jedis new Jedis("localhost",6379);pr…

短視頻矩陣:批量發布的秘密揭秘

在數字化時代&#xff0c;短視頻已經成為一種廣受歡迎的媒體形式。無論是用于品牌推廣、產品營銷還是個人創作&#xff0c;短視頻都提供了一種直觀、生動的方式來吸引觀眾的注意力。然而&#xff0c;有效地制作、管理和發布短視頻對于許多創作者和企業來說是一個挑戰。 為此&am…

什么是 C 語言中的宏定義?

&#x1f345;關注博主&#x1f397;? 帶你暢游技術世界&#xff0c;不錯過每一次成長機會&#xff01; &#x1f4d9;C 語言百萬年薪修煉課程 通俗易懂&#xff0c;深入淺出&#xff0c;匠心打磨&#xff0c;死磕細節&#xff0c;6年迭代&#xff0c;看過的人都說好。 文章目…

解決 Yarn 運行時的 Node.js 版本問題:一個詳盡的指南

引言 Yarn 是一個流行的 JavaScript 包管理器&#xff0c;它與 Node.js 緊密集成&#xff0c;用于管理項目依賴。然而&#xff0c;在開發過程中&#xff0c;開發者可能會遇到 Node.js 版本不兼容的問題&#xff0c;這會導致 Yarn 運行時出錯。本文將提供一個詳細的指南&#x…

動態規劃之數字三角形模型+最長上升子序列模型

首先&#xff0c;我們從集合角度重新看待DP&#xff1a; 直接看題&#xff1a;https://www.acwing.com/problem/content/1029/ 就是取紙條的原題&#xff0c;我們令f[i1,j1,i2,j2]表示從(1,1),(1,1)分別走到(i1,j1),(i2,j2)的路徑的max i1j1i2j2&#xff0c;于是我們可以把狀…

機器學習 | 對K-Means聚類假設的研究演示及實踐示例

我們在Scikit-learn對K-means假設的調查中探索了揭示算法優勢和局限性的場景。我們研究了K-means對不正確的聚類大小的敏感性&#xff0c;它在各向異性分布中面臨的困難&#xff0c;它在不同的聚類方差中面臨的困難&#xff0c;以及使用合成數據集的大小不均勻的聚類問題。我們…

準備工作+1、請求和響應+2、模型和管理站點

Django快速入門——創建一個基本的投票應用程序 準備工作1、創建虛擬環境2、安裝django 1、請求和響應&#xff08;1&#xff09;創建項目&#xff08;2&#xff09;用于開發的簡易服務器&#xff08;3&#xff09;創建投票應用&#xff08;4&#xff09;編寫第一個視圖1、編寫…

家用激光投影儀品牌排行榜:這幾個品牌口碑好產品好最適合家用

現在人們生活水平提升&#xff0c;對投影這類產品的認知接受度也提升&#xff0c;有條件的家庭都想在家里整一個家庭影院&#xff0c;對于這些消費者來說挑選一臺性價比高的家用投影至關重要&#xff0c;既省到錢又買對了產品&#xff1b;投影市場發展迅速目前市面上大大小小的…

華為機考真題 -- 多段線數據壓縮

題目描述: 下圖中,每個方塊代表一個像素,每個像素用其行號和列號表示,但可以發現,這種表示不是最簡的,其實只需要存儲 6 個藍色的關鍵點即可,它們是線段的起點、拐點、終點,而剩下 4 個點是冗余的。現在,請根據輸入的包含有冗余數據的多段線坐標列表,輸出其最簡化的…