菜鳥怎么在.NetCore里使用Redis緩存


大家好,我是一個菜鳥,最近在搞.Net Core項目,項目里需要往緩存里插一些數據來提高功能的訪問速度和效率,一開始我把數據放到了Session里,但是在這里遇到了一個棘手的問題,我存的數據量較大,辣么大有好幾兆,可往服務器緩存里寫的時候發現數據被截斷了,啥意思呢,就是Session覺得他能存多少他就存多少,剩下的數據就丟了,不要了(心里一萬個wc,這也太任性了吧),找了好久沒有找到解決方案,那么我就靈機一動,想到了另一個菜鳥同事跟我說過Redis,隱隱約約記得是Redis是專門搞緩存的,效率賊高,然后我們就來看看它到底是個什么東西?

作為菜鳥的我默默的打開了百度,搜索Redis,第一個推薦就是菜鳥教程(果然菜鳥跟菜鳥有着千絲萬縷的聯系)

file

看到了這里發現還是不太明白是啥意思,為啥值是字符串、哈希、列表、集合等類型就被稱為數據結構服務器呢?我們接着往下看看

file

Redis是開源的,高性能,還可以持久化,把內存里的數據保存在磁盤中,斷電死機了開機還能繼續用,好nb,優勢性能極高,太厲害了,我們趕緊用一用吧。

大家都知道數據庫嘛,一般都是服務端和客戶端,那么我們先來看看Redis咋安裝的。

一、Redis的安裝

默認端口 6379

修改配置文件:

  1. 修改地址綁定信息

bind 0.0.0.0 運行所有IP進行訪問

bind 192.168.1.1 僅運行 192.168.1.1 這個IP進行訪問

file

  1. 如果不需要登陸密碼,修改如下參數;

file

設置密碼:requirepass foobared(去掉#,並將foobared修改為密碼。比如requirepass 123456)

如果是在騰訊、阿里雲或者亞馬遜部署的服務器,應在 雲平台上的安全組內,開放 6379 端口;

這些內容都做好了之后,我的Redis客戶端還是連不上Redis數據庫,咋回事?我就各種查各種問,試了網上的很多方法都不行,不過也有其它的收獲~

windows客戶端無法連接windows服務器的redis

修改服務器上的redis的配置文件"redis.windows.conf"

注釋掉redis.windows-service.conf 中的bind 127.0.0.1這一行(在前面加#)

將protected-mode yes 改成 protected-mode no

requirepass foobared(去掉#,並將foobared修改為密碼。比如requirepass 123456)

windows客戶端ping 服務器的公網ip

如果可以ping通,則直接通過redis Desktop Manager 連接遠程服務器

如果不能,關掉服務器的防火牆,找到windows防火牆的高級設置,在入站規則中找到“文件和打印機共享(回顯請求 - ICMPv4-In)”設置允許連接並啟動,然后在windows客戶端測試是否可以ping通 服務器的公網ip,通了就可以遠程連接啦

這個問題花了我很長時間,Redis Desktop Manager 怎么也連接不上,咨詢騰訊雲的客服人員,他們也只能幫我們看看端口號是否正常開通,

注意:如果修改完配置文件里的數據,重新啟動Redis,直接打開或者啟動並不會加載修改后的配置文件,需要手動指定修改后的配置文件

redis-server.exe redis.windows.conf

或者

redis-server.exe redis.conf

file

二、安裝Redis客戶端

推薦Redis Desktop Manager 和 *** ;

下載windows版的直接安裝。

file

三、VisualStudio使用Redis組件

ASP.NET Core 使用 Redis 組件,最好的選擇當然是 StackExchange.Redis,GitHub 地址:

https://github.com/StackExchange/StackExchange.Redis

使用很簡單,首先安裝程序包:

PM> Install-Package StackExchange.Redis

使用簡單示例:

static void Main(string[] args)
	{
			//var configurationOptions = new ConfigurationOptions
			//{
			//    EndPoints =
			//    {
			//        "10.11.22.1", "6379",
			//        "10.11.22.2", "6379",
			//        "10.11.22.3", "6379"
			//    },
			//    Password = "aqsea3491"
			//};
			ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("10.11.22.1:6379,10.11.22.1:6379,10.11.22.1:6379,password=123456");
			IDatabase db = redis.GetDatabase();
			string value = "abcdefg";
			db.StringSet("test_key", value);
			value = db.StringGet("test_key");
			Console.WriteLine(value);
			Console.ReadLine();
	}

當然,如果用於生產環境的話,需要再進行封裝下,如果我們使用的是 ASP.NET Core 的話,還有一種不用自己封裝的選擇,那就是

Microsoft.Extensions.Caching.Redis,GitHub 地址:

https://github.com/aspnet/Caching/tree/dev/src/Microsoft.Extensions.Caching.Redis

Microsoft.Extensions.Caching.Redis 是微軟自己封裝的 Redis 組件,內部使用的還是 StackExchange.Redis,但在 ASP.NET Core 中使用起來,非常簡單。

首先安裝程序包:

PM> Microsoft.Extensions.Caching.Redis

Startup.ConfigureServices配置:
public void ConfigureServices(IServiceCollection services)
{
		// Add framework services.
		services.AddMvc();
		// For redis
		// install-package Microsoft.Extensions.Caching.Redis
		services.AddDistributedRedisCache(options =>
		{
				options.InstanceName = "";
				options.Configuration = "10.11.22.1:6379,10.11.22.1:6379,10.11.22.1:6379,password=123456";
		});
}

簡單使用:

public class ValuesController : Controller
{
		private readonly IDistributedCache _distributedCache;
		public ValuesController(IDistributedCache distributedCache)
		{
				_distributedCache = distributedCache;
		}
		// GET api/values
		[HttpGet]
		public async Task<string> Get()
		{
				// redis operate
				var key = "test_key";
				var valueByte = await _distributedCache.GetAsync(key);
				if (valueByte == null)
				{
						await _distributedCache.SetAsync(key, Encoding.UTF8.GetBytes("world22222"), new DistributedCacheEntryOptions().SetSlidingExpiration(DateTimeOffset.Now.AddSeconds(3000)));
						valueByte = await _distributedCache.GetAsync(key);
				}
				var valueString = Encoding.UTF8.GetString(valueByte);
				return valueString;
		}
}

測試過程中,發現 Microsoft.Extensions.Caching.Redis 有一個問題,雖然IDistributedCache提供了SetStringAsync方法,但實際插入到 Redis 的值類型,並不是string,而是hash,可以用redis-cli命令進行測試:

114.55.56.213:6379> get test_key
(error) WRONGTYPE Operation against a key holding the wrong kind of value
114.55.56.213:6379> type test_key
hash

所以,沒辦法,只能使用SetAsync,然后讀取再由byte轉換為string。

另外,微軟封裝的Caching,除了 Microsoft.Extensions.Caching.Redis,還有:

• Microsoft.Extensions.Caching.Abstractions

• Microsoft.Extensions.Caching.Memory

• Microsoft.Extensions.Caching.SqlServer(使用 SqlServer 數據庫,作為緩存存儲)

四、參考資料

https://www.cnblogs.com/xishuai/p/asp-net-core-use-redis.html

https://www.cnblogs.com/dotnet261010/p/12033624.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM