【Redis】入門

来源:https://www.cnblogs.com/WilsonPan/archive/2020/04/05/12635605.html
-Advertisement-
Play Games

Redis是一個開源的、基於記憶體的數據結構存儲器,可以用作資料庫、緩存和消息中間件 Redis最常用的功能 緩存 分散式鎖 ...


  1. Redis概述
  2. Redis常用數據結構
  3. Redis刪除過期數據策略
  4. Redis記憶體淘汰機制
  5. Redis持久化機制
  6. 緩存問題及解決方案

Redis概述

 Redis是一個開源的、基於記憶體的數據結構存儲器,可以用作資料庫、緩存和消息中間件

Redis最常用的功能

  • 緩存
  • 分散式鎖
 本文介紹使用環境
  • Windows 10

  • Redis 3.0.504

如何安裝Redis就不做介紹,若不想安裝Redis環境,可以使用try redis嘗試Redis功能 CMD 啟動 Redis,打開Reids目錄,執行下麵命令,出現下麵圖片代表啟動成功
redis-server redis.windows.conf

 

 

Redis常用數據結構

字元串(String)

用途

  • 存放字元串/數字
  • 常規key-value緩存應用
  • 常規計數:訂單數,商品數
常用命令用途
set key value 設置指定 key 的值
get key 獲取指定key的值
decr key 將指定的key的值遞減1,若設置的值不是數字,報錯
incr key 將指定的key的值遞增1,若設置的值不是數字,報錯
mget key1 [key2] 獲取指定的key,返回多個值

 

哈希(Hash)

用途

  • hash 特別適合用於存儲對象(用戶信息,商品信息)
  • 可以修改/讀取對象某個值
常用命令用途
hset key field value 設置單個對象值
hget key field value 獲取的那個對象值
hmset key field1 value [field2 value2] 設置對象多個欄位值
hmget 獲取對象多個值 , 返回列表
hgetall 獲取指定key對象欄位和值

 

 

列表(List)

用途

  • 雙向鏈表 ,支持反向查找和遍歷
  • 可以添加重覆數據
  • 適合存放消息列表,產品列表,訂單列表等
常用命令用途
lpush key value 向鏈表左邊推送值
rpush key value 向鏈表右邊推送值
lpop key 鏈表的左邊彈出值
rpop key 鏈表的右邊彈出值
lrange key start end 鏈表左邊指定範圍內的元素 , 多用於分頁
llen key 獲取鏈表長度

 

 

集合(Set)

用途

  • 跟列表類似,集合會去重覆
常用命令用途
sadd key value 添加一個元素
spop key value 隨機返回一個元素
smembers key 返回集合所有成員
sunion key1 key2 返回所有給定集合的並集

 

有序集合(Sorted Set)

 用途

  • 集合中的元素能夠按score進行有序排列
  • 多用於排名數據
  • score 相同情況下,按字典鍵值排序
常用命令用途
zadd key score1 member1 [score2 member2] 向有序集合添加一個或多個成員,或者更新已存在成員的分數
zrange key start end 返回有序集合指定範圍數據
zrem key member 移除指定成員
zcard key 獲取集合成員數

 

 

 

Redis刪除過期數據策略

Redis刪除過期數據有兩種機制

1. 定期刪除 :redis預設是每隔 100ms 就隨機抽取過期的數據刪除

2. 惰性刪除 : 訪問數據的時候檢查數據是否過期

 

Redis記憶體淘汰機制

當遇到寫入數據的時候記憶體不夠,Redis有下麵幾種機制來決定如何操作

方式說明
volatile-lru 從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
volatile-ttl 從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰
volatile-random 從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰
allkeys-lru 當記憶體不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的key
allkeys-random 從數據集(server.db[i].dict)中任意選擇數據淘汰
noeviction 禁止刪除,若超出記憶體報錯
volatile-lfu 從已設置過期時間的數據集挑選使用頻率最低的數據淘汰(Redis5.0 以後才有)
allkeys-lfu 從數據集中挑選使用頻率最低的數據淘汰(Redis5.0 以後才有)

在配置文件裡面打開maxmemory-policy配置項,預設是:noeviction

通常情況配合maxmemory配置設置最大記憶體使用

 

Redis持久化機制

Redis支持兩種持久化方式

快照(snapshotting)持久化(RDB)

  • Redis可以通過創建快照來獲得存儲在記憶體裡面的數據在某個時間點上的副本
  • Redis預設採用的持久化方式
  • 配置多個save配置項指定觸發創建副本條件,例:save 900 1 , 900秒內至少一個Key發生變化觸發創建快照
  • 缺點:若沒達到觸發條件,數據容易丟失

AOF(append-only file)持久化

  • 開啟AOF持久化後,根據選擇的方式寫入AOF文件中
  • 配置appendfsync 配置項,配置同步頻率
  • 缺點:可能經常發生同步,影響Redis的速度 

AOF有3種方式

方式說明
appendfsync always 每次有數據修改發生時都會寫入AOF文件 ,嚴重降低Redis的速度
appendfsync everysec 每秒鐘同步一次,顯示地將多個寫命令同步到硬碟
appendfsync no 讓操作系統決定何時進行同步

為了兼顧數據和寫入性能,用戶可以考慮 appendfsync everysec 選項 ,讓 Redis 每秒同步一次 AOF 文件,Redis 性能幾乎沒受到任何影響。

Redies預設AOF是關閉的,通過修改配置打開

 

 

Redis 4.0 對於持久化機制的優化

Redis 4.0 開始支持 RDB 和 AOF 的混合持久化(預設關閉,可以通過配置項 aof-use-rdb-preamble 開啟)。

如果把混合持久化打開,AOF 重寫的時候就直接把 RDB 的內容寫到 AOF 文件開頭。

這樣做的好處是可以結合 RDB 和 AOF 的優點, 快速載入同時避免丟失過多的數據。

當然缺點也是有的,AOF 裡面的 RDB 部分是壓縮格式不再是 AOF 格式,可讀性較差。

由於Windows的版本最新只有3.0,這個就沒法驗證

緩存問題及解決方案

緩存雪崩

同一時間大面積緩存失效,大量請求落到資料庫上

解決

  • 緩存設置過期時間時加上一個隨機值時間,使得每個key的過期時間分佈開來,不會集中在同一時刻失效

緩存穿透

請求緩存不存在的數據,然請求穿透緩存到資料庫,通常是黑客攻擊

解決

  • 採用布隆過濾器,使用一個足夠大的bitmap,用於存儲可能訪問的key,不存在的key直接被過濾
  • 訪問key未在DB查詢到值,也將空值寫進緩存,但可以設置較短過期時間
  • 採用簽名驗證提交數據

緩存擊穿

緩存過期的一刻,同時有大量的請求,由於緩存失效,導致請求都落到DB

解決

  • 單體使用互斥鎖(mutex key)
  • 分散式使用setnx
  • 雙重校驗訪問緩存數據(Double Check),就是線程安全的單例模式

轉發請標明出處:https://www.cnblogs.com/WilsonPan/p/12635605.html

參考文章

Command reference – Redis


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 ...
  • 在閱讀unpv1時運行源代碼的環境配置,這裡簡單記錄一下 源代碼里的README 寫得挺詳細的,但是在Linux 系統的下還是沒辦法直接編譯通過的, 這裡我使用的是ubuntu 19.10(在騰訊雲ubuntu server 18.04.1也測試通過) 以下是簡單的步驟: 1.下載源碼並解壓 2.解 ...
  • 安裝流程 這裡使用 brew 來安裝軟體。 安裝 查看安裝信息(經常用到, 比如查看安裝目錄等) 安裝後,主要看brew把nginx安裝到哪裡去了,預設是安裝到 常用命令記錄 查看nginx版本 啟動nginx服務 訪問: 後,看到如下內容就是啟動成功了。 如果沒有啟動成功,查看一下進程, : 查看 ...
  • 本次實驗環境:cn_windows_server_2019_x64_dvd_4de40f33cn_windows_7_enterprise_x64_dvd_x15-70741第一步:用戶創建第二步:添加主機第三步:資源分配1、用戶創建點擊工具選擇Active Directory用戶和電腦右鍵添加一... ...
  • 本次實驗環境:cn_windows_server_2019_x64_dvd_4de40f33第一步:安裝DNS服務搭建,提供域環境的功能變數名稱解析;第二部:安裝Active Directory服務搭建,域服務。1、安裝DNS服務安裝DNS服務,伺服器必須設置為固定IP地址。伺服器管理模板點擊管理-添加角色... ...
  • CentOS7主要有rpm和yum這兩種包軟體的管理。兩者有功能上的區別,其中主要區別是:yum使用簡單但需要聯網,yum會去網上包源去獲取所需要的軟體包。而rpm的需要做的事情就更細一些,比如我們需要記錄軟體的安裝位置、版本、信息等,類似macOS的homebrew。 rpm的工作原理是以一種數據 ...
  • 更多電腦使用技巧可以訪問 "https://xiaoheidiannao.com" 查看哦 今天打開微信電腦版的時候就自動更新到了2.9.0測試版(可能早已經有人更新到此版本了),更新內容如下: 1.Windows7及以上系統新增小程式面板,可查看最近使用和我的小程式。 2.聊天中可以引用更多類型的 ...
  • 先安裝zsh 安裝oh my zsh 手動安裝 自動安裝 ` 不管使用手動 自動安裝,完成後都需要重啟。oh my zsh才能生效。 修改主題 挑選你喜歡的主題:https://github.com/robbyrussell/oh my zsh/wiki/Themes ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...