在虛擬機器安裝Linux+Linux環境搭建Redis+.net core 3.1 使用Redis
一、安裝linux這個比較簡單,有安裝包就可以了
下面就不寫文字了,看圖片跟著做就好了
這裡需要一個映象檔案,去下載一個就好https://www.centos.org/ 我下載的版本是CentOS-7-x86_64-DVD-2003.iso
然後開機,會自動安裝,選項選第一個。接下來進行一些選項的選擇,按Continue
然後就選擇Done,等待安裝就好了
好了 如果到了這個介面 就差一步了,需要把網路搞定
輸入命令vi /etc/sysconfig/network-scripts/ifcfg-ens32 這裡的ens32是我的,你自己的網路是什麼就選什麼
進入之後按鍵盤“i” 然後移動游標把圖片中的onboot 改成yes 按ESC 輸入:wq 就能儲存退出了,
輸入:q! 就是直接退出 不儲存,如果改錯了 就不儲存直接退出
接下來重啟一下網絡卡service network restart 看到了已經聯網了,到這兒系統算是安裝完成了,需要安裝軟體了
接下來我們 使用yum 安裝 redis,安裝前 先把yum更新一下
更新完成,如果有錯誤,就自行百度一下吧。我裝了很多次 只要按照步驟去走,很難報錯的。
接下來需要下載redis,這裡我們使用 wget 直接在網上下載 wget http://download.redis.io/releases/redis-stable.tar.gz,但是提示我們 找不到wget
我們使用yum install wget 來安裝
安裝完成後按箭頭向上鍵。。把之前輸入的 命令敲回來,回車執行,等一會兒ll
可以看到已經在根目錄下有一個安裝包了
這裡我們新建一個資料夾,然後把壓縮包移動到 新建的資料夾中mkdir 建立 mv 移動 cd 是進入 ll檢視目錄檔案
解壓檔案 tar -xzvf redis-stable.tar.gz 解壓完成後,會多出來一個資料夾,我們會看到裡面有很多 子資料夾
接下來 我們要make 但是在那之前,我們先安裝一下gcc 因為 安裝redis 需要gcc yum install gcc 安裝完成後,make一下
這裡我們看到了在make的時候有兩個錯誤。。 一個 error1 一個error2 解決一下
原因是因為gcc版本過低,yum安裝的gcc是4.8.5的。因此需要升級gcc,升級過程如下:
yum -yinstallcentos-release-scl
yum -yinstalldevtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
sclenabledevtoolset-9bash
echo"source /opt/rh/devtoolset-9/enable">> /etc/profile
gcc -v
最後在執行一下make,這次編譯通過,我們接下來 make install
然後進入src 安裝redis
為了方便管理,我們新建兩個資料夾,etc 和bin
然後把 redis.conf 移動到etc 目錄下,把 常用的命令 移動到bin 目錄,
移動時需要注意,redis.conf 在redis-stable 目錄下,其他的在 redis-stable/src目錄下
mv redis.conf /usr/local/redis/etc
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server /usr/local/redis/bin/
檢視結果,已經轉移到相應的目錄
接下來我們設定後臺啟動 修改redis.conf vim redis.conf 按i 啟動編輯
註釋掉 bind 127.0.0.1 接著把 daemonize 改成yes 把 protected-mode 改成no 按ESC 輸入:wq
儲存退出後,後臺啟動redis 進入到bin 目錄 輸入命令 ./redis-server /usr/local/redis/etc/redis.conf
然後使用客戶端 ./redis-cli 這樣redis 就算是啟動了
接下來我們測試一下 yum install net-tools 先裝一個 net-tools
然後輸入命令netstat -tunpl|grep 6379,可以看到埠已經啟動
這裡有個很重要的點,如果不設定客戶端就一直連線不上,那就是防火牆需要在防火牆下開啟 6379的 埠
firewall-cmd --zone=public --add-port=6379/tcp --permanent 然後重啟 systemctl restart firewalld
redis服務已經啟動成功了,就等著客戶端連線了,下面我們開始使用.NET core 連線 redis
首先在appsettings.json增加一個redis配置串
在common類庫中新增一個類SerializeHelper.cs,存放序列化方法 先引用Nuget包Newtonsoft.Json 程式碼如下
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Text; namespace WebApi.Core.Common { public class SerializeHelper { /// <summary> /// 序列化 /// </summary> /// <param name="item"></param> /// <returns></returns> public static byte[] Serialize(object item) { var jsonString = JsonConvert.SerializeObject(item); return Encoding.UTF8.GetBytes(jsonString); } /// <summary> /// 反序列化 /// </summary> /// <typeparam name="TEntity"></typeparam> /// <param name="value"></param> /// <returns></returns> public static TEntity Deserialize<TEntity>(byte[] value) { if (value == null) { return default(TEntity); } var jsonString = Encoding.UTF8.GetString(value); return JsonConvert.DeserializeObject<TEntity>(jsonString); } } }
繼續在common類庫中 新建兩個類RedisCacheManager.cs IRedisCacheManager.cs,redis介面和 實現類 引用Nuget包 StackExchange.Redis
程式碼如下
using StackExchange.Redis; using System; using System.Collections.Generic; using System.Text; namespace WebApi.Core.Common.Redis { public class RedisCacheManager:IRedisCacheManager { private readonly string redisConnenctionString; public volatile ConnectionMultiplexer redisConnection; private readonly object redisConnectionLock = new object(); public RedisCacheManager() { string redisConfiguration = AppSettings.app(new string[] { "AppSettings", "RedisCaching", "ConnectionString" });//獲取連線字串 if (string.IsNullOrWhiteSpace(redisConfiguration)) { throw new ArgumentException("redis config is empty", nameof(redisConfiguration)); } this.redisConnenctionString = redisConfiguration; this.redisConnection = GetRedisConnection(); } /// <summary> /// 核心程式碼,獲取連線例項 /// 通過雙if 夾lock的方式,實現單例模式 /// </summary> /// <returns></returns> private ConnectionMultiplexer GetRedisConnection() { //如果已經連線例項,直接返回 if (this.redisConnection != null && this.redisConnection.IsConnected) { return this.redisConnection; } //加鎖,防止非同步程式設計中,出現單例無效的問題 lock (redisConnectionLock) { if (this.redisConnection != null) { //釋放redis連線 this.redisConnection.Dispose(); } try { this.redisConnection = ConnectionMultiplexer.Connect(redisConnenctionString); } catch (Exception) { throw new Exception("Redis服務未啟用,請開啟該服務"); } } return this.redisConnection; } public void Clear() { foreach (var endPoint in this.GetRedisConnection().GetEndPoints()) { var server = this.GetRedisConnection().GetServer(endPoint); foreach (var key in server.Keys()) { redisConnection.GetDatabase().KeyDelete(key); } } } public bool Get(string key) { return redisConnection.GetDatabase().KeyExists(key); } public string GetValue(string key) { return redisConnection.GetDatabase().StringGet(key); } public TEntity Get<TEntity>(string key) { var value = redisConnection.GetDatabase().StringGet(key); if (value.HasValue) { //需要用的反序列化,將Redis儲存的Byte[],進行反序列化 return SerializeHelper.Deserialize<TEntity>(value); } else { return default(TEntity); } } public void Remove(string key) { redisConnection.GetDatabase().KeyDelete(key); } public void Set(string key, object value, TimeSpan cacheTime) { if (value != null) { //序列化,將object值生成RedisValue redisConnection.GetDatabase().StringSet(key, SerializeHelper.Serialize(value), cacheTime); } } public bool SetValue(string key, byte[] value) { return redisConnection.GetDatabase().StringSet(key, value, TimeSpan.FromSeconds(120)); } } }
using System; using System.Collections.Generic; using System.Text; namespace WebApi.Core.Common.Redis { public interface IRedisCacheManager { //獲取 Reids 快取值 string GetValue(string key); //獲取值,並序列化 TEntity Get<TEntity>(string key); //儲存 void Set(string key, object value, TimeSpan cacheTime); //判斷是否存在 bool Get(string key); //移除某一個快取值 void Remove(string key); //全部清除 void Clear(); } }
接下來該註冊redis服務了,進入到startup中的 ConfigureServices 新增如下程式碼 紅色
public void ConfigureServices(IServiceCollection services) { //註冊AppSettings讀取類 services.AddSingleton(new AppSettings(Configuration)); //註冊Swagger服務 services.AddSwaggerSetup(); //jwt授權驗證 services.AddAuthorizationJwtSetUp(); //資料庫配置 BaseDBConfig.ConnectionString = Configuration.GetSection("AppSettings:ConnectionStringOrg").Value; //註冊Redis services.AddSingleton<IRedisCacheManager, RedisCacheManager>(); services.AddControllers(); }
接下來測試一下,我們在UserORMController 新增一個函式,函式中使用的redis物件是注入進去的 如下程式碼,紅色程式碼
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using WebApi.Core.Common.Redis; using WebApi.Core.IService; using WebApi.Core.Model; namespace WebApi.Core.Api.Controllers { /// <summary> /// 使用者表測試ORMSqlSuggr /// </summary> public class UserORMController : BaseController { //宣告一個常量 private readonly IUserService userService; private readonly IRedisCacheManager redisManager; /// <summary> /// 通過建構函式依賴注入 /// </summary> /// <param></param> public UserORMController(IUserService userSer,IRedisCacheManager redisCache) { userService = userSer; redisManager = redisCache; } /// <summary> /// 根據id獲取資料 /// </summary> /// <param>引數id</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> GetUser(int id) { UsersModel user = await userService.QueryByID(id); return Ok(user); } /// <summary> /// 新增資料 /// </summary> /// <param>引數id</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> Add(UsersModel user) { var count = await userService.Add(user); return Ok(count); } /// <summary> /// 更新資料 /// </summary> /// <param>引數id</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> Update(UsersModel user) { var sucess = await userService.Update(user); return Ok(sucess); } /// <summary> /// 刪除資料 /// </summary> /// <param>引數id</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> Delete(object[] ids) { var sucess = await userService.DeleteByIds(ids); return Ok(sucess); } /// <summary> /// 測試sqlSugar 常用語句 /// </summary> /// <returns></returns> [HttpGet] public IActionResult testSqlSugar() { userService.testSqlSugar(); return Ok("true"); } /// <summary> /// 測試Redis /// </summary> /// <returns></returns> [HttpGet] public async Task<IActionResult> Redis(int id) { var key = $"Redis{id}"; UsersModel user = new UsersModel(); if (redisManager.Get<object>(key) != null) { user = redisManager.Get<UsersModel>(key); } else { user = await userService.QueryByID(id); redisManager.Set(key, user, TimeSpan.FromHours(2));//快取2小時 } return Ok(user); } } }
執行F5一下 可以看到已經連線redis 成功。
我們再來看一下 redis 是否有資料了,可以看到已經存入值了
可以在請求一次,就是從redis取資料了,也可以改一下controller裡面的過期時間,自己除錯一番