【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
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...