菜鸟怎么在.NetCore里使用Redis缓存
大家好,我是一个菜鸟,最近在搞.Net Core项目,项目里需要往缓存里插一些数据来提高功能的访问速度和效率,一开始我把数据放到了Session里,但是在这里遇到了一个棘手的问题,我存的数据量较大,辣么大有好几兆,可往服务器缓存里写的时候发现数据被截断了,啥意思呢,就是Session觉得他能存多少他就存多少,剩下的数据就丢了,不要了(心里一万个wc,这也太任性了吧),找了好久没有找到解决方案,那么我就灵机一动,想到了另一个菜鸟同事跟我说过Redis,隐隐约约记得是Redis是专门搞缓存的,效率贼高,然后我们就来看看它到底是个什么东西?
作为菜鸟的我默默的打开了百度,搜索Redis,第一个推荐就是菜鸟教程(果然菜鸟跟菜鸟有着千丝万缕的联系)
看到了这里发现还是不太明白是啥意思,为啥值是字符串、哈希、列表、集合等类型就被称为数据结构服务器呢?我们接着往下看看
Redis是开源的,高性能,还可以持久化,把内存里的数据保存在磁盘中,断电死机了开机还能继续用,好nb,优势性能极高,太厉害了,我们赶紧用一用吧。
大家都知道数据库嘛,一般都是服务端和客户端,那么我们先来看看Redis咋安装的。
一、Redis的安装
默认端口 6379
修改配置文件:
- 修改地址绑定信息
bind 0.0.0.0 运行所有IP进行访问
bind 192.168.1.1 仅运行 192.168.1.1 这个IP进行访问
- 如果不需要登陆密码,修改如下参数;
设置密码: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
二、安装Redis客户端
推荐Redis Desktop Manager 和 *** ;
下载windows版的直接安装。
三、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