淘淘商城——查询商品详情添加缓存分析

通过上文的学习,我相信大家一定实现了商品详情页面展示,接下来我们将学习如何在商品详情页面展示时添加缓存。
因为查询商品详情涉及到查询数据库,当网站访问量很大时,查询商品详情都去查询数据库的话,数据库的压力是难以承受的,为了解决这个问题就要引入缓存了,即使用Redis做缓存。但是引入缓存又有一个问题需要考虑,那就是缓存资源是非常有限的,如果我们把大量的商品详情信息都放到缓存当中的话,缓存的压力是非常大的。我们知道,商品是分热点商品和冷门商品的,热点商品的访问量很大,但是冷门商品可能十天半月也没有人访问,因此存储热门商品信息才能提高缓存的利用率。那么我们怎么能尽可能少的占用缓存资源呢?这里有两种解决方案,第一种方案是利用Redis的访问量统计功能并利用其zset数据类型进行访问量排序(抱歉!我不明白这种方案),把访问量高的商品详情内容添加到缓存当中,这种方案比较麻烦,我们不建议采用这种方式。第二种方案是设置缓存的过期时间,用户只要点击查看商品详情,我们一律都先存放到缓存当中,但是我们要设置一下该条商品的缓存时间(比如半天或一天或其它,一般是一天的时间,可以根据实际情况而定),到期后该商品的缓存就会被删除掉,如果该商品是热门商品的话,用户再次查看商品详情的时候就又会向缓存中添加该商品的缓存信息,如果该商品是冷门商品,过期后缓存中便没有这款商品的缓存信息了(直到有下一位用户查看该商品的详情信息),这样就可以节约缓存的空间,而且这种方式无疑是提高缓存利用率最简单的方法了。一句话,怎么简单怎么来!
Redis存储信息有两种方式,一种是哈希方式,这种存储方式的好处是可以将缓存信息分类存储,比如之前我们在首页展示的时候,页面上的商品都是分类展示的,为了区分要缓存的是首页的信息,因此设置哈希的key是CONTENT_KEY,首页大广告位的分类ID是89,因此89作为第二个参数(key),value则是首页大广告位的所有商品信息,如下图所示。
这里写图片描述
另一种存储方式是String存储方式,也就是普通的key-value形式,如下图所示。
这里写图片描述
哈希存储方式适合做缓存处理但是它却不适合设置缓存过期时间,这是因为它不支持具体到每个Field进行设置过期时间,比如上面提到的首页展示时存储的key(CONTENT_KEY),Redis仅支持对hash的key设置过期时间,这也就意味着如果我们设置的CONTENT_KEY这个key到期后,首页所有的商品的缓存信息都将消失,这显然是不合理的,我们想要的是针对每个商品设置过期时间,因此设置过期时间的话,hash存储不合适,String存储是比较适合的,那么问题又来了,String存储时key是容易重复的,怎么来避免key冲突呢?我们可以通过添加前缀、后缀的方式对Redis的key进行分类,如下图所示。既然是要存储商品详情,就在商品ID前面起个名字,就叫做ITEM_INFO(大家可以随便起),在ID的后面添加后缀BASE(代表是商品基本信息),DESC(代表是商品描述信息)。
这里写图片描述
这样我们既可以区分key还可以针对每个商品设置过期时间,但是现在又有个问题来了,我们怎样存储二维表(就是我们表格的数据,表格有行和列,这就是二维表)中的信息呢?我们以tb_item表为例,如下图所示,我们怎么把这张表中的数据进行存储呢?
这里写图片描述
如果把二维表中的信息保存到Redis中:

  1. 表名就是第一层
  2. 主键是第二层
  3. 字段名第三层

三层使用“:”分隔作为key,value就是字段中的内容。
下面我们按”表名:id:列名”来表示,如下图所示。
这里写图片描述
我们可以设置过期时间,比如给tb_user:7:id设置过期时间为100秒。这样每次查看tb_user:7:id时都可以看到TTL剩余秒数在减少直到减到0,然后就过期了。
这里写图片描述
过期后使用ttl tb_user:7:id命令来查看剩余时间,查到的值是-2。tb_user:7:id这个key就从Redis数据库中清除了,如下图所示。
这里写图片描述我们便可以通过这种方式来添加商品详情缓存以及提高缓存的利用效率。