首页 > 编程知识 正文

redis技术笔记,为啥使用redis

时间:2023-05-05 13:00:06 阅读:178945 作者:1391

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

世界上没有漏洞,但摔倒的人多了就会变成漏洞。

有人说Redis的HGETALL是个漏洞,但我偏偏不相信。 不管是什么样的洞,都必须自己踩着双脚放弃。 说得好,这就是不到黄河,说得不好,就是看不见棺材,不落泪。

程序开始非常稳定地运行。 HGETALL很稳定,想给所有说是洞的人发一个字。 呸! 此时的我忘记了温水中青蛙般危险的存在,时间就这样一天一天地过去,有一天突然需求发生了变化,我把HASH数据的内容从十几个字段扩展到一百多个字段,同时用Pipelining一次完成几百个HGETALL的于是我掉进了洞里。 服务器宕机了。

为什么会变成这样? Redis是单线程的! 处理一个请求时,其他请求只能等待。 通常,请求会立即处理,但在使用HGETALL时,必须遍历每个字段以检索数据。 其间消耗的CPU资源与字段数量成比例。 如果还使用PIPELINING的话,会更加雪上加霜。

你怎么解决这个问题? 请允许我给出一个像样的公式:

PERFORMANCE=CPUs/OPERATIONs也就是说,在此场景中,是否要增加运算中的CPU数量以提高性能? 是否减少运算中的操作数? 具体来说,想到了以下方法。

在不改变Memcached Redis存储方式的前提下,额外的,我们还需要利用Memcached实现一系列缓存,在Redis中存储HGETALL的HASH。 当然,保存在Memcached中的都是字符串,因此保存HASH时,实际上是保存HASH序列化后的字符串。 该方案的优点是Memcached支持多线程,因此更多的CPU可以参与运算。 此外,由于不需要遍历每个字段,因此需要较少的操作。 当然坏处也不少。 由于引入了新的缓存层,浪费了内存,增加了复杂性。 此外,即使只是检索少数字段的数据,也可能需要查询完整的数据,然后进行过滤。 这一定是在浪费带宽。 当然,在这种情况下可以直接联系Redis,但这无疑增加了复杂性。

顺便说一下,Memcached支持多孔工具,可以实现类似于Pipelining的效果,但对于其中与Memcached相关的孔,也就是多孔工具的无底孔问题要格外小心。

序列化字段冗馀Redis在存储散列时会多存储一个名为" all "的字段。 其内容是原HASH数据的串行化,实际查询时,只需保存HGET这个冗余字段,然后反串行化即可。 该方案的优点是通过序列化和冗馀字段,将原来的HGETALL操作简化为HGET。 这意味着,由于不再需要遍历HASH中的所有字段,因此即使多个CPU不能参与运算,操作数量也会大幅减少,因此性能的提高仍然非常显著。 当然劣势也很明显,和所有冗馀方式一样,该方案浪费了大量的内存。

虽然不再有这种遍历字段的过程,但反序列化过程会增加,反序列化的成本也很高,但这样做会提高性能吗? 问题的关键是,遍历字段的操作现在只需要一个CPU。 然后,反序列化操作可以确保任何语言的多进程或多线程都在多个CPU上进行,从而提高整体性能。

……

此外,许多人直觉通过运行Redis的多个实例来解决问题。 确实,这可以增加运算中的CPU数量,有助于提高性能。 但是需要注意的是,HGETALL和PIPELINING经常会使运算中的操作数呈几何爆炸式增长,而我们可以增加的Redis多实例数却杯水车薪,因此在本例中该方法无法完全解决问题。

……

洞是用来踩的。 你不需要害怕掉下来。 当然,前提是自己能出来。

呼叫我的老师人工智能教程! 33558 blog.csdn.net/jiangjun show

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。