免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yanyangtian4502

从案例引发的对缓存设计的思考,干货讨论,绝对不玩虚的(获奖名单已公布-2012-6-13) [复制链接]

论坛徽章:
0
发表于 2012-05-21 16:33 |显示全部楼层
呵呵呵,我又来了!
朋友们之前谈了Apache,Nigx等,虽然我不同非常的懂,但愿我的一些帖子起到抛砖引玉的效果!

那我接着谈
如何设计比较智能的缓存

很多的时候,我们再添加缓存的时候,采用的是键值对的形式,
例如
key                 value
demokey          demoValue

很多的缓存组件,也是采用字典的形式进行数据的存取的。

我们在获取缓存中的数据的时候,也是通过这样的方式,例如get("demokey")

这样的方式,没有问题。但是如果需要缓存一些比较动态的信息,例如:根据用户的查询关键字来缓存数据,那么问题就出来了。

试想这样一个场景:在购物站点中,用户在查找产品的时候,肯定会输入很多的不同的关键字,而每次用户查询的关键字对应的产品有很多,而我们采用之前讲述的“全缓存,半缓存”等策略的时候,这个缓存就不是很高效。

举个例子,如果用户查询“海尔冰箱”,那么,我们在缓存中数据就是这样的:
key                   value
海尔冰箱          XXXXX(表示很多的数据)

如果用户再输入“冰箱”,那么此时,缓存结果为:
key                    value
海尔冰箱          XXXXX(表示很多的数据)
冰箱              YYYYYY(表示很多的数据)

以此类推.

其实”海尔冰箱“与”冰箱“有相似之处,或者换句话说:冰箱的结果,可能会包含”海尔冰箱“中的数据。

此时,我们很有可能就把两份数据缓存了两次。浪费了内存!

如何处理???

论坛徽章:
54
2017金鸡报晓
日期:2017-02-08 10:39:42操作系统版块每日发帖之星
日期:2016-03-08 06:20:00操作系统版块每日发帖之星
日期:2016-03-07 06:20:00操作系统版块每日发帖之星
日期:2016-02-22 06:20:00操作系统版块每日发帖之星
日期:2016-01-29 06:20:00操作系统版块每日发帖之星
日期:2016-01-27 06:20:00操作系统版块每日发帖之星
日期:2016-01-20 06:20:00操作系统版块每日发帖之星
日期:2016-01-06 06:20:0015-16赛季CBA联赛之江苏
日期:2015-12-21 20:00:24操作系统版块每日发帖之星
日期:2015-12-21 06:20:00IT运维版块每日发帖之星
日期:2015-11-17 06:20:002015亚冠之广州恒大
日期:2015-11-12 10:58:02
发表于 2012-05-22 11:29 |显示全部楼层
回复 79# 方兆国


    这个根据配置不同会有不同结果,很容易暴露源代码,并且在nginx下此路不通,所以还是扩展名为php为好。

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
发表于 2012-05-22 11:56 |显示全部楼层
回复 82# lsstarboy


    我测试了,Nginx下确实不可以,不过,你说得那个暴露源代码,我不认可

QQ截图20120522115022.png

QQ截图20120522114944.png


对于index.html文件

我的源代码
  1. <html>
  2.         <body>
  3.                 <?php
  4.                         echo "PHP and Apache2.2 is working !";
  5.                 ?>
  6.                 <a href="./test.html">test</a>
  7.         </body>
  8. </html>
复制代码
浏览器中的源代码
  1. <html>
  2.         <body>
  3.                 PHP and Apache2.2 is working !                <a href="./test.html">test</a>
  4.         </body>
  5. </html>
复制代码
对于test.html文件

我的源代码
  1. <html>
  2.         <body>
  3.                 <?php
  4.                         echo "Test is OK !";
  5.                 ?>
  6.         </body>
  7. </html>
复制代码
浏览器中的源代码
  1. <html>
  2.         <body>
  3.                 Test is OK !        </body>
  4. </html>
复制代码

论坛徽章:
54
2017金鸡报晓
日期:2017-02-08 10:39:42操作系统版块每日发帖之星
日期:2016-03-08 06:20:00操作系统版块每日发帖之星
日期:2016-03-07 06:20:00操作系统版块每日发帖之星
日期:2016-02-22 06:20:00操作系统版块每日发帖之星
日期:2016-01-29 06:20:00操作系统版块每日发帖之星
日期:2016-01-27 06:20:00操作系统版块每日发帖之星
日期:2016-01-20 06:20:00操作系统版块每日发帖之星
日期:2016-01-06 06:20:0015-16赛季CBA联赛之江苏
日期:2015-12-21 20:00:24操作系统版块每日发帖之星
日期:2015-12-21 06:20:00IT运维版块每日发帖之星
日期:2015-11-17 06:20:002015亚冠之广州恒大
日期:2015-11-12 10:58:02
发表于 2012-05-22 18:11 |显示全部楼层
本帖最后由 lsstarboy 于 2012-05-22 18:16 编辑

回复 83# 方兆国


    直接上图:

php代码.jpg

论坛徽章:
0
发表于 2012-05-23 09:15 |显示全部楼层
本帖最后由 飞鸿无痕 于 2012-05-23 09:17 编辑

讨论很热烈,楼主辛苦,看了了所有回复,收益匪浅。看到很少人提到现在linux下比较流行的lnmp架构的相关缓存情况,我这里稍微总结一下:
缓存顺序从前端(或者CDN)---代理---web server--memcache缓存--DB,从目前我较常用的架构来说:
前端缓存:我们可以设置squid、varnish缓存,这两个太常用就不详细解释了。如果公司出点钱,用CDN的效果更好。目前我们用的CDN。
代理缓存:通过nginx做代理,在上面配置expires来在客户端缓存一些图片以及js、css文件,注意图片可以设置过期时间长一点,js、css文件不要设置太长。nginx上也有自带的缓存,这个根据需要启用,如果有前端缓存就不需要在这里设置缓存了,如果前端没有设置,这里设置会取到比较好的效果。
web server缓存:楼主说的内核缓存是一方面,另外还有一些低三方的缓存,比如php的xcache以及eaccelerator等加速器,都能对php进行预编译,并执行计划进行缓存。
memcache缓存:采用memcache来缓存数据库的查询结果,尽量将压力往前推,减少数据库的压力。
DB缓存:DB缓存的就是开启query_cache。这里有一个陷阱:如果是更新非常频繁的表最好使用SQL_NO_CACHE不缓存结构,不然会频繁更新query cache内容,导致性能下降!
就说那么多,欢迎高手拍砖!

论坛徽章:
0
发表于 2012-05-23 09:27 |显示全部楼层
学习一下,好久没来了。

论坛徽章:
0
发表于 2012-05-23 11:18 |显示全部楼层
回复 81# yanyangtian4502


    对这个没啥经验,期待楼主分享!

论坛徽章:
0
发表于 2012-05-23 13:43 |显示全部楼层
飞鸿无痕 发表于 2012-05-23 09:15
讨论很热烈,楼主辛苦,看了了所有回复,收益匪浅。看到很少人提到现在linux下比较流行的lnmp架构的相关缓存 ...



DB缓存真的会像你说的那样???

论坛徽章:
0
发表于 2012-05-23 13:56 |显示全部楼层
回复 85# 飞鸿无痕


    看了所有留言,新学很多词汇,正一头雾水,飞鸿兄的总结来得正是时候啊。上网大致查了各种web服务器,总算有些对号入座了。
本人能看到这个帖子,主要得感谢一个打不开的网页:
nginx.png

论坛徽章:
54
2017金鸡报晓
日期:2017-02-08 10:39:42操作系统版块每日发帖之星
日期:2016-03-08 06:20:00操作系统版块每日发帖之星
日期:2016-03-07 06:20:00操作系统版块每日发帖之星
日期:2016-02-22 06:20:00操作系统版块每日发帖之星
日期:2016-01-29 06:20:00操作系统版块每日发帖之星
日期:2016-01-27 06:20:00操作系统版块每日发帖之星
日期:2016-01-20 06:20:00操作系统版块每日发帖之星
日期:2016-01-06 06:20:0015-16赛季CBA联赛之江苏
日期:2015-12-21 20:00:24操作系统版块每日发帖之星
日期:2015-12-21 06:20:00IT运维版块每日发帖之星
日期:2015-11-17 06:20:002015亚冠之广州恒大
日期:2015-11-12 10:58:02
发表于 2012-05-23 14:51 |显示全部楼层
回复 89# chenjintao_ii


    nginx的502错误确实很让人头疼,有多种原因,最常见的是php没有执行完或者是数据库返回数据不及时,一般日志里有说明,应该根据不同情况进行调整。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP