Dalam projek saya, terdapat senarai yang disediakan untuk Autocomplete的功能,数据量大概在几万。这篇文章里我用姓名检索的例子来说明,列表请戳来自Redis作者的Demo。
Senarai sedemikian penuh dengan nama pengguna Sebagai contoh, terdapat objek pengguna dalam kami sistem:
public Class User { public string Id{get; set;} public string Name {get; set;} .... public string UserHead {get; set;} }
Sistem memerlukan senarai juntai bawah pengguna Disebabkan jumlah data yang banyak, ia tidak boleh dipaparkan sekaligus, jadi fungsi AutoComplete telah ditambahkan. Cache boleh disimpan terus dalam memori tempatan Tidak perlu menggunakan cache berpusat seperti Redis, jadi struktur cache akan menjadi lebih mudah
var users = new List<User>{...};//读到一个用户列表MemoryCache.Set("capqueen:users", users);//放入内存//读取var users = MemoryCache.Get<List<User>>("capqueen:users");
Kerana semuanya dalam memori, ia sudah cukup untuk menyimpan Senarai. secara langsung. Apabila mencari Ia juga boleh secara langsung seperti berikut:
var findUsers = users.Where(user => user.Name.StartWith("A")).ToList();例如输入的字符是 “A“
Ia agak mudah. Tidak perlu mempertimbangkan cara menyimpan atau struktur data yang disimpan. Walau bagaimanapun, sebaik sahaja kami beralih ke perkhidmatan caching terpusat seperti Redis, kami perlu memikirkan semula cara kami menyimpannya.
Pilihan 1: Pelaksanaan cache berasaskan memori yang serupa.
Pustaka pautan Redis yang digunakan dalam artikel ini ialah StactkExchange.Redis, produk sumber terbuka daripada StackOverFlow.
var db = redis.GetDataBase();//获取0数据库var usersJson = JsonConvert.SerializeObject(users)//序列化db.StringSet("capqueen:users", usersJson);//存储var usersString = db.StringGet("capqueen:users"); var userList = JsonConvert.DeserializeObject<List<User>>(users);//反序列化
Tiada masalah dengan logik kaedah di atas, dan kompilasi juga boleh lulus. Tetapi jika anda memikirkannya dengan teliti, Redis ialah perkhidmatan cache bebas dan dipisahkan daripada appSever Kaedah bacaan jenis ini membebankan IO pelayan redis, malah bacaan sedemikian jauh lebih perlahan daripada cache memori tempatan.
Jadi bagaimana untuk menyelesaikannya? Bayangkan sahaja bahawa intipati nilai kunci terletak pada Kunci, jadi untuk Senarai, item harus disimpan secara berasingan.
Pilihan 2: Kekunci padanan kabur.
Selepas membelek dokumentasi arahan Redis (lihat Rujukan 4), dia terkejut apabila menemui arahan Keys, yang membuatkan dia segera mengubah suai rancangannya. Pertama, kita perlu menetapkan kata kunci untuk dicari sebagai kunci Di sini saya mentakrifkan kunci sebagai "capqueen:user:{id}:{name}", di mana item dalam {} harus digantikan dengan atribut yang sepadan bagi item. Kodnya adalah seperti berikut:
var redis = ConnectionMultiplexer.Connect("localhost");var db = redis.GetDatabase(); var users = new List<User> { new User{Id = 6, Name = "aaren", Age=10}, new User{Id = 7, Name = "issy", Age=11}, new User{Id = 8, Name = "janina", Age=13}, new User{Id = 9, Name = "karena", Age=14} }; users.ForEach(item => { var key = string.Format("capqueen:user:{0}:{1}", item.Id, item.Name); var value = JsonConvert.SerializeObject(item); db.StringSet(key, value); });
Semua pengguna disimpan dalam kaedah Nilai Kunci yang berasingan, jadi bagaimana cara menggunakan Kekunci untuk mencari? Mari kita lihat arahan Keys Redis:
KEYS pattern 查找所有符合给定模式 pattern 的 key 。 KEYS * 匹配数据库中所有 key 。 KEYS h?llo 匹配 hello , hallo 和 hxllo 等。 KEYS h*llo 匹配 hllo 和 heeeeello 等。 KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。 特殊符号用 \ 隔开
Dengan kata lain, Keys boleh melakukan pemadanan kabur mudah, jadi carian kami di sini boleh ditukar kepada kaedah berikut:
var redis = ConnectionMultiplexer.Connect("192.168.10.178");var db = redis.GetDatabase();var server = redis.GetServer("192.168.10.178", 6379);var keys = server.Keys(pattern: "capqueen:user:*:a*");var values = db.StringGet(keys.ToArray());//反序列化var jsonValues = new StringBuilder("["); values.ToList().ForEach(item => jsonValues.Append(item).Append(",")); jsonValues.Append("]");var userList = JsonConvert.DeserializeObject<List<User>>(jsonValues.ToString());
Perhatikan di atas Dalam kod, kerana setiap nilai adalah json, untuk meningkatkan kecekapan penukaran, saya mula-mula memprosesnya menjadi json arry dan kemudian menyahsirikannya.
Penyelesaian ini sememangnya menyelesaikan masalah semasa saya Namun, saya perhatikan petikan dalam dokumentasi Redis:
KEYS sangat pantas, tetapi apabila digunakan dalam pangkalan data yang besar Ia mungkin masih menyebabkan masalah prestasi. Jika anda perlu mencari key
tertentu daripada set data, anda lebih baik menggunakan struktur set (set) Redis.
Atas ialah kandungan terperinci Cara menggunakan Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!