在现代应用程序中,缓存是提高性能和实现关键功能的重要手段。本文将解释如何在Windows上使用Redis以一种清晰的方式解决这个问题,将使用MicrosoftVisual Studio和C#语言。StackExchange Redis是.NET中最好的Redis客户端之一,本文也将使用它。
以下步骤将指导如何在解决方案中包含Redis缓存:
通过MSOpenTech页面上提供的任何版本安装Redis forWindows。此解决方案已在2.8.2104、2.8.2400和3.0.501版本上进行了测试。安装后,Windows机器的服务控制台中应该有一个Redis服务。确保此服务正在运行。
使用MicrosoftVisual Studio创建一个新的.NET解决方案。
使用包管理器或以下命令将StackExchange.Redis客户端和其他两个NuGet包添加到解决方案中:
PM> Install-Package StackExchange.Redis
PM> Install-Package StackExchange.Redis.Extensions.Core
PM> Install-Package StackExchange.Redis.Extensions.Newtonsoft
这将在项目中添加对StackExchange.Redis库的引用。
注意:如果解决方案需要强命名,请使用StackExchange.Redis.StrongName。
在App.Config(如果是Web应用程序,则为Web.Config)中添加Redis连接字符串。一个简单的连接字符串如下所示:
<connectionStrings>
<clear />
<add name="RedisCacheConnection" connectionString="localhost:6379,ssl=false" />
</connectionStrings>
在Config文件中添加以下键,以显式选择特定的Redis数据库。默认情况下,单个Redis实例中有16个数据库/段(0到15)。
<appSettings>
<add key="RedisDatabaseNumber" value="1" />
<add key="RedisCacheExpiration" value="20" />
</appSettings>
添加对System.Configuration库的引用。
创建一个新类,该类将连接到Redis客户端,类似于以下类:
using StackExchange.Redis.Extensions.Core;
using StackExchange.Redis.Extensions.Newtonsoft;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
namespace RedisDemo
{
public class RedisClient<T>
{
protected string cacheConnectionString;
protected int cacheObjectExpiration;
protected short redisDb;
public RedisClient()
{
cacheConnectionString = ConfigurationManager.ConnectionStrings["RedisCacheConnection"].ConnectionString;
redisDb = Convert.ToInt16(ConfigurationManager.AppSettings["RedisDatabaseNumber"]);
cacheObjectExpiration = Convert.ToInt32(ConfigurationManager.AppSettings["RedisCacheExpiration"]);
}
protected StackExchangeRedisCacheClient GetCacheClient()
{
var serializer = new NewtonsoftSerializer();
var cacheClient = new StackExchangeRedisCacheClient(serializer, cacheConnectionString, redisDb);
return cacheClient;
}
public void FlushCache()
{
using (var cacheClient = this.GetCacheClient())
{
cacheClient.FlushDb();
}
}
public void AddToCache(string key, T cacheObject)
{
using (var cacheClient = GetCacheClient())
{
if (cacheClient.Exists(key))
{
cacheClient.Replace(key, cacheObject, new TimeSpan(0, cacheObjectExpiration, 0));
}
else
{
cacheClient.Add(key, cacheObject, new TimeSpan(0, cacheObjectExpiration, 0));
}
}
}
public T GetCachedItem(string key)
{
using (var cacheClient = this.GetCacheClient())
{
var cachedObject = cacheClient.Get<T>(key);
return cachedObject;
}
}
public IEnumerable<T> GetAllCachedItems()
{
using (var cacheClient = GetCacheClient())
{
var keys = cacheClient.SearchKeys("*");
var dictCollection = cacheClient.GetAll<T>(keys);
return dictCollection.Values.ToList();
}
}
}
}
缓存客户端类已准备好使用。现在可以实例化它,并使用它来存储和检索缓存中的数据。
以下是在使用Windows上的Redis时可以使用的一些额外提示和技巧。
Windows上的Redis会使用大量磁盘空间来持久化一些数据。尽管2.8.2400版本已经做了一些修复来解决这个问题,但以下是如何配置Redis不消耗任何磁盘空间的方法:
save 900 1
save 300 10
save 60 10000
# persistence-available [(yes)|no]
在这一行下面添加:
persistence-available [no]
每个Redis实例默认带有16个数据库或分区。可以在每个分区中存储相似或不同的对象。这些分区可以用来分隔应用程序可能需要缓存的不同类型对象。
如果需要启动多个Web服务器来扩展Web应用程序,管理会话会有点棘手。有各种选项,如使用粘性会话、状态服务器和SQL服务器。
同样,可以使用Redis缓存来存储会话。有一个会话状态提供程序可以使用Redis缓存。这里是,描述了如何使用它。
这里是可以用来通过命令行管理Redis的。
Redis安装位置的Redis-Cli.exe可以用来连接到Redis服务器实例。