Maison > base de données > Redis > le corps du texte

Comment utiliser Redis

WBOY
Libérer: 2023-06-03 12:48:00
avant
1131 Les gens l'ont consulté

Scénarios d'utilisation

Dans mon projet, une fonction est fournie pour Autocomplete, et la quantité de données est probablement de plusieurs dizaines de milliers. Dans cet article, j'utilise l'exemple de récupération de nom pour illustrer. Pour la liste, veuillez cliquer sur la démo de l'auteur de Redis. Autocomplete的功能,数据量大概在几万。这篇文章里我用姓名检索的例子来说明,列表请戳来自Redis作者的Demo。

在这样的列表里全是用户名,例如我们的系统里有一个用户对象:

public Class User
{     public string Id{get; set;}  
     public string Name {get; set;}
     ....     public string UserHead {get; set;}    
}
Copier après la connexion

系统里需要一个用户的下拉列表,由于数据量大不能一次显示完,于是就加上了一个AutoComplete功能。缓存可以在本地内存中直接存储,不必使用像Redis这样的集中式缓存,这样缓存结构会更加简单

var users = new List<User>{...};//读到一个用户列表MemoryCache.Set("capqueen:users", users);//放入内存//读取var users = MemoryCache.Get<List<User>>("capqueen:users");
Copier après la connexion

因为都是在内存里,所以直接存List就可以了,搜索的时候也可以直接的如下:

var findUsers = users.Where(user => user.Name.StartWith("A")).ToList();例如输入的字符是 “A“
Copier après la connexion

相当简单,完全不用考虑如何存储,存储的数据结构。然而,一旦转向使用Redis这样的集中式缓存服务,我们需要重新考虑如何存储。

方案一:类似内存式的缓存实现。

本文里使用的Redis链接库是StactkExchange.Redis,出自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);//反序列化
Copier après la connexion

上面的方式逻辑上是没有问题的,编译也可以通过。但是仔细想一想,Redis作为独立的缓存服务和appSever是分开来的,这样的读取方式对redis服务器的IO是个负担,甚至这样的读取比本地内存缓存慢了太多了。

那如何解决呢?试想key-value的精髓是在于Key,那么对于List来说应该要把item分开来存储。

方案二:Keys模糊匹配。

在翻阅Redis的命令文档(见参考资料4)后,他惊奇地发现了Keys命令,这让他立刻修改了自己的方案。首先我们需要把要搜索的关键词建立为key,这里我把key定义为 "capqueen:user:{id}:{name}",其中{}内的是要用item对应属性替换的。代码如下:

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);
});
Copier après la connexion

所有的user都以单独的Key-Value方式存储,那么如何利用Keys搜索呢?我们来看下Redis的Keys命令:

KEYS pattern

查找所有符合给定模式 pattern 的 key 。

KEYS * 匹配数据库中所有 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h*llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
特殊符号用 \ 隔开
Copier après la connexion

也就是说Keys能够进行简单的模糊匹配,那么我们这里的搜索就可以换成如下的方式:

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());
Copier après la connexion

注意以上的代码里,因为每个value是一个json,为了增加转化时的效率,我先处理成json arry再进行反序列化。

这种方案,确实是解决了我目前的问题,然而我注意到了Redis文档里的一段话:

KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 key

Dans une telle liste, ce sont tous des noms d'utilisateurs. Par exemple, il y a un objet utilisateur dans notre système : 🎜rrreee🎜Le système a besoin d'une liste déroulante d'utilisateurs en raison de la grande quantité de données. , il ne peut pas être affiché en une seule fois, nous ajoutons donc une fonction AutoComplete installée. Le cache peut être stocké directement dans la mémoire locale. Il n'est pas nécessaire d'utiliser un cache centralisé comme Redis. Cette structure de cache sera plus simple🎜rrreee🎜Parce que tout est en mémoire, il suffit de stocker la Liste directement, et c'est possible. également être recherché directement Comme suit : 🎜rrreee🎜C'est assez simple, il n'est pas nécessaire de réfléchir à la manière de stocker ou à la structure des données stockées. Cependant, une fois que nous passons à un service de mise en cache centralisé comme Redis, nous devons repenser la façon dont nous le stockons. 🎜🎜Option 1 : implémentation similaire du cache basé sur la mémoire. 🎜🎜La bibliothèque de liens Redis utilisée dans cet article est StactkExchange.Redis, un produit open source de StackOverFlow. 🎜rrreee🎜La méthode ci-dessus est logiquement correcte et la compilation peut réussir. Mais si vous y réfléchissez bien, Redis est un service de cache indépendant et est séparé d'appSever. Ce type de méthode de lecture est un fardeau pour les E/S du serveur Redis, et même une telle lecture est beaucoup plus lente que le cache mémoire local. 🎜🎜Alors comment le résoudre ? Imaginez simplement que l'essence de la clé-valeur réside dans Key, donc pour List, les éléments doivent être stockés séparément. 🎜🎜Option 2 : Correspondance floue des clés. 🎜🎜Après avoir feuilleté la documentation de la commande Redis (voir référence 4), il a été surpris de trouver la commande Keys, ce qui lui a fait immédiatement modifier son plan. Tout d'abord, nous devons établir le mot-clé à rechercher en tant que clé. Ici, je définis la clé comme "capqueen:user:{id}:{name}", où les éléments de {} doivent être remplacés par les attributs correspondants du article. Le code est le suivant : 🎜rrreee🎜Tous les utilisateurs sont stockés dans des méthodes Key-Value distinctes, alors comment utiliser les clés pour rechercher ? Jetons un coup d'œil à la commande Keys de Redis :🎜rrreee🎜C'est-à-dire que Keys peut effectuer une simple correspondance floue, donc notre recherche ici peut être modifiée par la méthode suivante :🎜rrreee🎜Faites attention au code ci-dessus, car chaque la valeur est A json, afin d'augmenter l'efficacité de la conversion, je la traite d'abord en json arry, puis je la désérialise. 🎜🎜Cette solution a effectivement résolu mon problème actuel. Cependant, j'ai remarqué un passage dans la documentation Redis : 🎜🎜KEYS est très rapide, mais son utilisation dans une grande base de données peut quand même causer des problèmes de performances si vous avez besoin de trouver un clé à partir d'un ensemble de données, vous feriez mieux d'utiliser la structure de collection (ensemble) de Redis à la place. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!