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

了解更多信息

给此页面评分