C#/.NET 指南
将 .NET 应用程序连接到 Redis 数据库
安装 Redis 和 Redis 客户端,然后将 .NET 应用程序连接到 Redis 数据库。
NRedisStack
NRedisStack 是 Redis 的 .NET 客户端。NredisStack
需要一个正在运行的 Redis 或 Redis Stack 服务器。有关 Redis 安装说明,请参阅 入门。
安装
使用 dotnet
CLI,运行
dotnet add package NRedisStack
连接
连接到端口 6379 上的本地主机。
using NRedisStack;
using NRedisStack.RedisStackCommands;
using StackExchange.Redis;
//...
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
IDatabase db = redis.GetDatabase();
存储和检索一个简单的字符串。
db.StringSet("foo", "bar");
Console.WriteLine(db.StringGet("foo")); // prints bar
存储和检索一个哈希表。
var hash = new HashEntry[] {
new HashEntry("name", "John"),
new HashEntry("surname", "Smith"),
new HashEntry("company", "Redis"),
new HashEntry("age", "29"),
};
db.HashSet("user-session:123", hash);
var hashFields = db.HashGetAll("user-session:123");
Console.WriteLine(String.Join("; ", hashFields));
// Prints:
// name: John; surname: Smith; company: Redis; age: 29
要访问 Redis Stack 功能,您应该使用类似这样的适当接口
IBloomCommands bf = db.BF();
ICuckooCommands cf = db.CF();
ICmsCommands cms = db.CMS();
IGraphCommands graph = db.GRAPH();
ITopKCommands topk = db.TOPK();
ITdigestCommands tdigest = db.TDIGEST();
ISearchCommands ft = db.FT();
IJsonCommands json = db.JSON();
ITimeSeriesCommands ts = db.TS();
连接到 Redis 集群
要连接到 Redis 集群,您只需在客户端配置中指定一个或所有集群端点
ConfigurationOptions options = new ConfigurationOptions
{
//list of available nodes of the cluster along with the endpoint port.
EndPoints = {
{ "localhost", 16379 },
{ "localhost", 16380 },
// ...
},
};
ConnectionMultiplexer cluster = ConnectionMultiplexer.Connect(options);
IDatabase db = cluster.GetDatabase();
db.StringSet("foo", "bar");
Console.WriteLine(db.StringGet("foo")); // prints bar
使用 TLS 连接到您的生产 Redis
在部署应用程序时,请使用 TLS 并遵循 Redis 安全 指南。
在将应用程序连接到启用了 TLS 的 Redis 服务器之前,请确保您的证书和私钥采用正确的格式。
要将用户证书和私钥从 PEM 格式转换为 pfx
,请使用此命令
openssl pkcs12 -inkey redis_user_private.key -in redis_user.crt -export -out redis.pfx
输入密码以保护您的 pfx
文件。
使用此代码段与 Redis 数据库建立安全连接。
ConfigurationOptions options = new ConfigurationOptions
{
EndPoints = { { "my-redis.cloud.redislabs.com", 6379 } },
User = "default", // use your Redis user. More info https://redis.ac.cn/docs/management/security/acl/
Password = "secret", // use your Redis password
Ssl = true,
SslProtocols = System.Security.Authentication.SslProtocols.Tls12
};
options.CertificateSelection += delegate
{
return new X509Certificate2("redis.pfx", "secret"); // use the password you specified for pfx file
};
options.CertificateValidation += ValidateServerCertificate;
bool ValidateServerCertificate(
object sender,
X509Certificate? certificate,
X509Chain? chain,
SslPolicyErrors sslPolicyErrors)
{
if (certificate == null) {
return false;
}
var ca = new X509Certificate2("redis_ca.pem");
bool verdict = (certificate.Issuer == ca.Subject);
if (verdict) {
return true;
}
Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
return false;
}
ConnectionMultiplexer muxer = ConnectionMultiplexer.Connect(options);
//Creation of the connection to the DB
IDatabase conn = muxer.GetDatabase();
//send SET command
conn.StringSet("foo", "bar");
//send GET command and print the value
Console.WriteLine(conn.StringGet("foo"));
示例:索引和查询 JSON 文档
此示例展示了如何使用 NRedisStack
将 Redis 搜索结果转换为 JSON 格式。
确保已安装 Redis Stack 和 NRedisStack
。
导入依赖项并连接到 Redis 服务器
using NRedisStack;
using NRedisStack.RedisStackCommands;
using NRedisStack.Search;
using NRedisStack.Search.Aggregation;
using NRedisStack.Search.Literals.Enums;
using StackExchange.Redis;
// ...
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
获取对数据库以及搜索和 JSON 命令的引用。
var db = redis.GetDatabase();
var ft = db.FT();
var json = db.JSON();
让我们创建一些测试数据添加到你的数据库中。
var user1 = new {
name = "Paul John",
email = "paul.john@example.com",
age = 42,
city = "London"
};
var user2 = new {
name = "Eden Zamir",
email = "eden.zamir@example.com",
age = 29,
city = "Tel Aviv"
};
var user3 = new {
name = "Paul Zamir",
email = "paul.zamir@example.com",
age = 35,
city = "Tel Aviv"
};
创建一个索引。在此示例中,所有键前缀为 user:
的 JSON 文档都已编入索引。有关详细信息,请参阅 查询语法。
var schema = new Schema()
.AddTextField(new FieldName("$.name", "name"))
.AddTagField(new FieldName("$.city", "city"))
.AddNumericField(new FieldName("$.age", "age"));
ft.Create(
"idx:users",
new FTCreateParams().On(IndexDataType.JSON).Prefix("user:"),
schema);
使用 JSON.SET
在指定路径处设置每个用户值。
json.Set("user:1", "$", user1);
json.Set("user:2", "$", user2);
json.Set("user:3", "$", user3);
让我们查找用户 Paul
并按年龄过滤结果。
var res = ft.Search("idx:users", new Query("Paul @age:[30 40]")).Documents.Select(x => x["json"]);
Console.WriteLine(string.Join("\n", res));
// Prints: {"name":"Paul Zamir","email":"paul.zamir@example.com","age":35,"city":"Tel Aviv"}
仅返回 city
字段。
var res_cities = ft.Search("idx:users", new Query("Paul").ReturnFields(new FieldName("$.city", "city"))).Documents.Select(x => x["city"]);
Console.WriteLine(string.Join(", ", res_cities));
// Prints: London, Tel Aviv
统计同一城市中的所有用户。
var request = new AggregationRequest("*").GroupBy("@city", Reducers.Count().As("count"));
var result = ft.Aggregate("idx:users", request);
for (var i=0; i<result.TotalResults; i++)
{
var row = result.GetRow(i);
Console.WriteLine($"{row["city"]} - {row["count"]}");
}
// Prints:
// London - 1
// Tel Aviv - 2