• .NET Core如何连接Redis
  • 发布于 2个月前
  • 504 热度
    0 评论

前言:

Redis是我们现在最为常用的缓存数据库,今天我们就讲解一下如何在.NET Core中使用Redis。

环境准备:

1.在本机或者服务器上已安装好Redis,并保证可以正常访问

2.需要安装NRedisStack库


开始

第一步:打开包管理工具,搜索NRedisStack并进行安装,也可以直接在程序包管理控制台输入命令进行安装

dotnet add package NRedisStack

第二步:在项目中添加如下命名空间的引用

// 堆代码 duidaima.com
using NRedisStack;
using NRedisStack.RedisStackCommands;
using StackExchange.Redis;
第三步:创建Redis连接
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("127.0.0.1:6379");//传入你的Redis服务器地址,有域名的用域名也可以
IDatabase db = redis.GetDatabase();
通过以上步骤我们就创建了Redis的连接了,现在就可以使用db对象来做缓存的创建,查询,删除等操作了。

例子:

1.创建,查询字符串缓存

db.StringSet("sitename", "www.duidaima.com");//创建缓存
Console.WriteLine(db.StringGet("sitename")); // 查询缓存
2.HashMap类型缓存的创建和查询
  var hash = new HashEntry[] {
              new HashEntry("name", "张三"),
              new HashEntry("age",21),
              new HashEntry("nickname","kitty"),
              new HashEntry("weight","60KG")
            };
            db.HashSet("player1", hash);
            var hashFields = db.HashGetAll("player1");
            Console.WriteLine(String.Join("; ", hashFields));

要访问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
{
    //集群地址
    EndPoints = {
        { "localhost", 16379 },
        { "localhost", 16380 },
        // ...
    },            
};
ConnectionMultiplexer cluster = ConnectionMultiplexer.Connect(options);
IDatabase db = cluster.GetDatabase();
db.StringSet("foo", "bar");
Console.WriteLine(db.StringGet("foo")); 
使用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.io/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



用户评论