大家好,我是一個菜鳥,最近在搞.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