using NetTopologySuite.Index.HPRtree; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using StackExchange.Redis; using System.Collections.Generic; using static Server.System.Redis; using static System.Formats.Asn1.AsnWriter; namespace Server.System { public class Redis { ConnectionMultiplexer redis; IDatabase db; bool local = false; Dictionary stringType; Dictionary> listType; Dictionary> zType; Dictionary> hashType; public Redis(string host = "127.0.0.1", int port = 6379) { if (host == "localhost") { local = true; stringType = new Dictionary(); listType = new Dictionary>(); zType = new Dictionary>(); hashType = new Dictionary>(); } else { redis = ConnectionMultiplexer.Connect($"{host}:{port}"); db = redis.GetDatabase(); } test(); } public void test() { Console.WriteLine("----------"); Console.WriteLine("----------"); } public void SetString(object value, params string[] keys) { if (local) { if (stringType.ContainsKey(KeySet(keys))) stringType[KeySet(keys)] = JsonConvert.SerializeObject(value); else stringType.Add(KeySet(keys), JsonConvert.SerializeObject(value)); } else db.StringSet(KeySet(keys), JsonConvert.SerializeObject(value)); } public T GetString(params string[] keys) { if (local) return JsonConvert.DeserializeObject(stringType[KeySet(keys)]); else return JsonConvert.DeserializeObject(db.StringGet(key: KeySet(keys))); } public void SetList(T value, params string[] keys) { if (local) { if (listType.ContainsKey(KeySet(keys))) listType[KeySet(keys)].Add(JsonConvert.SerializeObject(value)); else listType.Add(KeySet(keys), [JsonConvert.SerializeObject(value)]); } else db.ListRightPush(KeySet(keys), JsonConvert.SerializeObject(value)); } public void SetList(List value, params string[] keys) { foreach (var item in value) { SetList(item, keys); } } public T GetList(long index, params string[] keys) { if (local) return JsonConvert.DeserializeObject(listType[KeySet(keys)][(int)index]); else return JsonConvert.DeserializeObject(db.ListGetByIndex(KeySet(keys), index)); } public List GetList(params string[] keys) { List result = new List(); if (local) { List strings = listType[KeySet(keys)]; foreach (var item in strings) { result.Add(JsonConvert.DeserializeObject(item)); } } else { RedisValue[] strings = db.ListRange(KeySet(keys)); foreach (var item in strings) { result.Add(JsonConvert.DeserializeObject(item)); } } return result; } public void SetZ(string value, double score, params string[] keys) { SetZ(new Rank(value, score), keys); } public void SetZ(Rank rank, params string[] keys) { if (local) { if (zType.ContainsKey(KeySet(keys))) zType[KeySet(keys)].Add(rank); else zType.Add(KeySet(keys), [rank]); zType[KeySet(keys)].OrderBy(r => r.score).ToList(); } else { db.SortedSetAdd(KeySet(keys), rank.value, rank.score); } } public double GetZScore(string value, params string[] keys) { if (local) return zType[KeySet(keys)].Find(n => n.value == value).score; else return (double)db.SortedSetScore(KeySet(keys), value); } public long GetZRank(string value, params string[] keys) { if (local) return zType[KeySet(keys)].FindIndex(n => n.value == value) + 1; else return (long)db.SortedSetRank(KeySet(keys), value); } public List GetZ(long rank, params string[] keys) { List result = new List(); if (local) { List ranking = new List(zType[KeySet(keys)]); if (ranking.Count > rank) for (long n = 0; n < rank; n++) result.Add(ranking[(int)n]); else result = new List(ranking); } else { var topRankEntries = db.SortedSetRangeByRank(KeySet(keys), 0, rank - 1); foreach (var entry in topRankEntries) result.Add(new Rank(entry, GetZScore(entry, keys))); } return result; } private string KeySet(string[] keys) { return string.Join(":", keys); } public class Rank { public string value; public double score; public Rank(string value, double score) { this.value = value; this.score = score; } } } }