菜鸟怎么在.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

posted @ 2022-04-05 23:14  小堂子  阅读(1058)  评论(0编辑  收藏  举报