前言:
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群集
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
openssl pkcs12 -inkey redis_user_private.key -in redis_user.crt -export -out redis.pfx输入密码以保护您的pfx文件。
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文档
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