学习淘淘商城第六十五课(查询商品详情添加缓存分析)

来源:互联网 发布:京东人工智能 编辑:程序博客网 时间:2024/06/01 08:14

         上节课我们一起学习了商品详情展示,这节课我们一起学习下如何添加缓存。

         因为查询商品详情涉及到查询数据库,当网站访问量很大时,查询商品详情都去查询数据库的话,数据库的压力是难以承受的,为了解决这个问题就要引入缓存。但是引入缓存又有个问题需要考虑,那就是缓存资源是非常有限的,如果我们把大量的商品详情信息都放到缓存当中的话,缓存的压力是非常大的。我们知道,商品是分热点商品和冷门商品的,热点商品的访问量很大,但是冷门商品可能十天半月也没有人访问,因此存储热门商品信息才能提高缓存的利用率。那么我们怎么能尽可能少的占用缓存资源呢?这里有两种解决方案,第一种方案是利用redis的的访问量统计功能并利用其zset数据类型进行访问量排序,把访问量高的商品详情内容添加到缓存当中。这种方案比较麻烦,我们不建议采用这种方式。第二种方案是设置缓存的过期时间,用户只要点击查看商品详情,我们一律先都存放到缓存当中,但是我们要设置一下该条商品的缓存时间(比如半天或一天或其它),到期后该商品的缓存就会被删除掉,如果该商品是热门商品的话,用户再查看详情的时候就又会向缓存中添加该商品的缓存,如果该商品是冷门商品,过期后缓存中便没有这款商品的缓存信息了(直到有下一位用户查看该商品的详情信息),这样就可以节约缓存的空间,而且这种方式无疑是提高缓存利用率最简单的方法了。

        redis存储信息有两种方式,一种是哈希方式,这种存储方式的好处是可以将缓存信息分类存储,比如在前面我们在首页展示的时候,页面上的商品都是分类展示的,为了区分要缓存的是首页的信息,因此设置哈希的key是INDEX_CONTENT,首页大广告位的分类ID是89,因此89作为第二个参数(key),value则是首页大广告位的所有商品信息。如下图所示。


          另一种存储方式是string存储方式,也就是普通的key-value形式,如下图所示。


       哈希存储方式适合做缓存处理但是它却不适合设置缓存过期时间,这是因为它不支持具体到每个Field进行设置过期时间,比如上面提到的首页展示时存储的key(INDEX_CONTENT),redis仅支持对hash的key设置过期时间,这也就意味着如果我们设置的INDEX_CONTENT这个key到期后,首页所有的商品的缓存信息都将消失,这显然是不合理的,我们想要的是针对每个商品设置过期时间,因此设置过期时间的话,hash存储不合适。String存储是比较适合的,那么问题又来了,String存储时key是容易重复的,怎么来避免key冲突呢?我们可以通过添加前缀、后缀的方式对redis的key进行分类,如下图所示。既然是要存储商品详情,就在商品ID前面起个名字,就叫做ITEM_INFO(大家可以随便起),在ID的后面添加后缀BASE(代表是基本信息),DESC(代表是商品描述信息)


         上图操作步骤如下:

redis:0>set ITEM_INFO:1235:BASE aaaaaOKredis:0>set ITEM_INFO:1235:DESC cccccOKredis:0>get ITEM_INFO:1235:BASEaaaaaredis:0>get ITEM_INFO:1235:DESCcccccredis:0>

       这样我们既可以区分key还可以针对每个商品设置过期时间,但是现在又有个问题来了,我们怎样存储二维表(就是我们表格的数据,表格有行和列,这就是二维表)信息?我们以user表为例,如下图所示,我们怎么把这张表中的数据进行存储呢?


       我们可以按"表名:id:列名"来表示,如下图所示。


         操作命令如下

redis:0>set tb_user:7:id 7OKredis:0>set tb_user:7:username zhangsanOKredis:0>set tb_user:7:password e10adc3949ba59abbe56e057f20f883eOKredis:0>get tb_user:7:id7redis:0>get tb_user:7:usernamezhangsanredis:0>get tb_user:7:passworde10adc3949ba59abbe56e057f20f883eredis:0>

         我们可以设置过期时间,比如给tb_user:7:id设置过期时间为100秒。这样每次查看tb_user:7:id时都可以看到TTL剩余秒数在减少直到减到0,然后就过期了。


         过期后查看剩余时间,查到的值是-2,如下所示。

redis:0>ttl tb_user:7:id-2

          我们便可以通过这种方式来添加商品详情缓存以及提高缓存的利用效率。


0 0