C Redis 的基本使用

2021-10-05 20:57:23 字數 3987 閱讀 9201

redis 概述

在我們日常的開發中,無不都是使用資料庫來進行資料的儲存,由於一般的系統任務中通常不會存在高併發的情況,所以這樣看起來並沒有什麼問題,可是一旦涉及大資料量的需求,比如一些商品搶購的情景,或者是主頁訪問量瞬間較大的時候,單一使用資料庫來儲存資料的系統會因為面向磁碟,磁碟讀/寫速度比較慢的問題而存在嚴重的效能弊端,一瞬間成千上萬的請求到來,需要系統在極短的時間內完成成千上萬次的讀/寫操作,這個時候往往不是資料庫能夠承受的,極其容易造成資料庫系統癱瘓,最終導致服務宕機的嚴重生產問題。

解決應用伺服器的cpu和記憶體壓力

減少io的讀操作,減輕io的壓力

關係型資料庫的擴充套件性不強,難以改變表結構 優點

1.nosql資料庫沒有關聯關係,資料結構簡單,拓展表比較容易

2.nosql讀取速度快,對較大資料處理快

適用場景

資料高併發的讀寫

海量資料的讀寫

對擴充套件性要求高的資料

不適場景

需要事務支援(非關係型資料庫)

基於sql結構化查詢儲存,關係複雜

* 儲存 快取 用的資料;

* 需要高速讀/寫的場合使用它快速讀/寫;

快取在日常對資料庫的訪問中,讀操作的次數遠超寫操作,比例大概在 1:9 到 3:7,所以需要讀的可能性是比寫的可能大得多的。當我們使用sql語句去資料庫進行讀寫操作時,資料庫就會去磁碟把對應的資料索引取回來,這是乙個相對較慢的過程。如果我們把資料放在 redis 中,也就是直接放在記憶體之中,讓服務端直接去讀取記憶體中的資料,那麼這樣速度明顯就會快上不少,並且會極大減小資料庫的壓力,但是使用記憶體進行資料儲存開銷也是比較大的,限於成本的原因,一般我們只是使用 redis 儲存一些常用和主要的資料,比如使用者登入的資訊等。一般而言在使用 redis 進行儲存的時候,我們需要從以下幾個方面來考慮:

* 業務資料常用嗎?命中率如何?如果命中率很低,就沒有必要寫入快取;

* 該業務資料是讀操作多,還是寫操作多?如果寫操作多,頻繁需要寫入資料庫,也沒有必要使用快取;

* 業務資料大小如何?如果要儲存幾百兆位元組的檔案,會給快取帶來很大的壓力,這樣也沒有必要;

在考慮了這些問題之後,如果覺得有必要使用快取,那麼就使用它!使用 redis 作為快取的讀取邏輯如下圖所示:從上圖我們可以知道以下兩點:

1. 當第一次讀取資料的時候,讀取 redis 的資料就會失敗,此時就會觸發程式讀取資料庫,把資料讀取出來,並且寫入 redis 中;

2. 當第二次以及以後需要讀取資料時,就會直接讀取 redis,讀到資料後就結束了流程,這樣速度就大大提高了。

便捷方式

為了方便啟動,我們在該目錄下新建乙個 startup.cmd 的檔案,然後將以下內容寫入檔案:redis-server redis.windows.conf1這個命令其實就是在呼叫 redis-server.exe 命令來讀取 redis.window.conf 的內容,我們雙擊剛才建立好的 startup.cmd 檔案,就能成功的看到 redis 啟動:

上圖的提示資訊告訴了我們:

① redis 當前的版本為 3.0.503;

② redis 執行在 6379 埠;

③ redis 程序的 pid 為 14748;

④ 64 位。我們可以開啟同乙個資料夾下的 redis-cli.exe 檔案

這是 redis 自帶的乙個客戶端工具,它可以用來連線到我們當前的 redis 伺服器,我們做以下測試:如此,我們便在 windows 的環境下安裝好了 redis

安裝後的測試

1.雙擊啟動redis-cil 輸入命令測試redis 的安裝set key的名稱 value會返回你ok

2.輸入get key的名稱就會返回你輸入的資訊,就證明你安裝的redis沒有問題

我首先第一次存進去的是net分享字串在後台顯示的也是二進位制

string 字串(可以為整形、浮點型和字串,統稱為元素)

list 列表(實現佇列,元素不唯一,先入先出原則)

set 集合(各不相同的元素)

hash hash雜湊值(hash的key必須是唯一的)

sort set 有序集合

具體**實現下文的demo

1、servicestack.redis,據說是redis官方推薦使用的驅動類庫,但是是收費的。

2、stackexchange.redis,可能性能要比servicestack.redis差點,但是是免費的。(案例)

1.新建專案控制台程式(redisdemo)

2.安裝stackexchange.redis通過netget或者命令安裝

3.新建redishelper.cs幫助類,(到後面會具體封裝,先測試)

class

redishelper}}

return _redisconn;}}

}

新增使用者實體

public class userinfodto

public string staffid

public string staffname

public string password

public system.datetime lastlogintime

}

4.string類操作

1.字串的存放

:該key值加了冒號,成為資料夾

也可以將物件序列化存入裡面

字串的獲取

字串刪除

5.hash型別的操作

redis hash 是乙個 string 型別的 field(字段) 和 value(值) 的對映表,hash 特別適合用於儲存物件。

redis 中每個 hash 可以儲存 232 - 1 鍵值對(40多億)

為雜湊表的每乙個域設值

bool hashset(rediskey key, redisvalue hashfield, redisvalue value)

6.list型別的操作

listlength  獲取list的長度

listleftpop 從頂部拿出資料

listrightpop 從底部拿出資料

listremove 刪除list中的單個數值

listinsertafter 在某一位置後插入資料

listinsertbefore 在某一位置前插入資料

C Redis使用及幫助類

redis server.exe redis.windows.conf提示服務啟動成功後,進行簡單的測試 讀取寫入及刪除都正常,環境準備已經完成。首先vs通過nuget安裝stackexchange.redis 然後我們嘗試通過stackexchange.redis對redis快取資料庫做一些基本的...

C Redis分布式鎖的應用

我們在開發很多業務場景會使用到鎖,例如庫存控制,等。一般我們會使用記憶體鎖的方式來保證線性的執行。但現在大多站點都會使用分布式部署,那多台伺服器間的就必須使用同乙個目標來判斷鎖。分布式與單機情況下最大的不同在於其不是多執行緒而是多程序。分布式站點使用記憶體鎖方式如下圖 假設有3個使用者同時購買一件商...

gulp的使用基本使用

1.全域性安裝gulp 目的是在命令列裡使用gulp的命令 2.命令列中cd到專案目錄,區域性安裝gulp 如果不在專案中再次安裝會報錯,據說這樣是為了避免發生版本衝突 3.在專案目錄下新建乙個gulpfile.js檔案 必須這個名字,這個檔案算是乙個配置檔案 編寫我們的需求,以便gulp能按著我們...