我有一个场景,我想知道我是否以正确的方式使用 Azure Redis 缓存,因为我绝对没有看到任何性能。
网络应用程序允许客户创建、读取和更新记录,并假设这些是客户记录。 Azure 中有一个 SQL 数据库,有近 60,000 条客户记录,我们假设有一个表,其中包含客户详细信息、姓名、电子邮件、地址等。
你们将如何构建这个网络应用程序以提高性能,因为直接查询数据库比将所有记录放入缓存要快得多。我目前使用缓存做了什么:
- 对于每次读取,包括过滤器(搜索、排序等),我都会从 Redis 缓存中获取数据,并将其反序列化为
List<T>
并进行查询、拟合、搜索等操作并返回结果。 - 对于更新,我更新 SQL 数据库中的记录,从数据库中获取所有记录作为
List<T>
并将其存储到缓存中。 - 创建和删除与上面的更新相同。
使用缓存的性能优势为零。难道是我用错了?
我认为序列化大量数据并将其存储到缓存中是一个坏主意。有什么想法可以让它变得更好吗?
最佳答案
虽然我没有对 Redis 中的键进行基准搜索,但您可以预期 O(N) 搜索时间,因为 Redis 必须检查每个键以查看它是否满足查询。具有涵盖您的查询的索引的数据库将能够在远小于 O(N) 的时间内进行搜索,因为它不必查看每条记录。我认为对于大型数据集,数据库可以更好地执行搜索,因为它不必查看每条记录。
现在介绍使用 Redis 提高性能的最佳方法。
当您拥有要检索的值的 key 时,Redis 就会大放异彩。在这种情况下,它的速度非常快,并且会在单个值查找的性能上压垮 SQL 数据库。如果您正在处理读取量大的数据,您将看到总体上最大的好处。例如,如果您的应用程序有每个用户的用户首选项记录,必须针对每个请求进行检查,那么这将是在 Redis 中进行缓存的绝佳候选者。您还可以获得从数据库卸载流量并将其发送到 Redis 的好处。
查看 Cache Aside Pattern以获得更深入的解释。
使用 Redis 的另一个问题:确保您重用 ConnectionMultiplexor,并且不要根据请求不断尝试重新连接到 Redis 缓存实例。这很慢,而且每个缓存实际上有最大连接限制。
关于Azure Redis 缓存 - 应用程序性能改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48026815/