查询商品详情添加缓存分析、商品详情缓存的实现、Mac下安装Redis及Redis Desktop Manager

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

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

因为查询商品详情涉及到查询数据库,当网站访问量很大时,查询商品详情都去查询数据库的话,数据库的压力是难以承受的,为了解决这个问题就要引入缓存。但是引入缓存又有个问题需要考虑,那就是缓存资源是非常有限的,如果我们把大量的商品详情信息都放到缓存当中的话,缓存的压力是非常大的。我们知道,商品是分热点商品和冷门商品的,热点商品的访问量很大,但是冷门商品可能十天半月也没有人访问,因此存储热门商品信息才能提高缓存的利用率。那么我们怎么能尽可能少的占用缓存资源呢?这里有两种解决方案,

第一种方案是利用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 aaaaa
OK

redis:0>set ITEM_INFO:1235:DESC ccccc
OK

redis:0>get ITEM_INFO:1235:BASE
aaaaa

redis:0>get ITEM_INFO:1235:DESC
ccccc

redis:0>

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

我们可以按"表名????列名"来表示
redis:0>set tb_user:7:id 7
OK

redis:0>set tb_user:7:username zhangsan
OK

redis:0>set tb_user:7:password e10adc3949ba59abbe56e057f20f883e
OK

redis:0>get tb_user:7:id
7

redis:0>get tb_user:7:username
zhangsan

redis:0>get tb_user:7:password
e10adc3949ba59abbe56e057f20f883e

redis:0>

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

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

商品详情缓存的实现

上节课我们一起分析了下商品详情缓存策略,这节课我们一起实现商品详情缓存的添加。

首先,我们要想清楚缓存应该加到哪个工程当中,现在我们有两个工程可以选择,第一个工程是taotao-item-web(商品详情工程),如果把缓存加到这个工程的话,由于该工程是个web工程,不被其它工程所共用,那么这块缓存的功能只能被它自己使用。第二个工程是taotao-manager(商品工程),由于多个工程都依赖taotao-manager,因此缓存的功能可以被多个工程所共用。显然,我们应该选择第二个工程taotao-manager-service来添加缓存。

要使用Redis缓存技术,就要先添加Redis的依赖

添加完依赖之后,需要添加对Redis操作的接口及实现类,由于我们在taotao-content工程已经实现过了,因此我们只需要把taotao-content-interface工程中关于jedis接口的包及接口类拷贝过来,然后把taotao-content-service工程中jedis的包及实现类拷贝过来

下面还需要把taotao-conent-service工程中关于jedis的配置文件给复制过来applicationContext-jedis.xml

我们打开applicationContext-jedis.xml文件,如下图所示,可以看到有单机版和集群版两种配置,现在我用的是单机版redis,因此我们打开的是单机版的redis配置。

在上节课中我们制定了通过添加redis缓存前缀来区分key的策略,而这个key我们是不能写死到代码当中的,应该配置到配置文件当中,还有就是商品的过期时间,这个也应该是可配置的,因此我们需要在taotao-manager-service工程添加一个配置文件resource.properties,如下图所示。不过需要提醒的是,刚建的配置文件默认编码是iso8859-1,是不能写中文注释的,因此为了能够写中文注释,我们把该文件的编码改成UTF-8。

添加了配置文件,要让Spring容器能够扫描到,因此我们打开applicationContext-dao.xml文件,把关于加载配置文件的配置由原来的db.properties修改为*.properties,这样properties目录下的所有配置文件都可以被扫描到了。

下面我们真正开始写缓存代码,在ItemServiceImpl类中的获取商品基本信息方法(getItemById)和获取商品描述信息方法(getItemDescById)中添加缓存代码,添加完缓存后,ItemServiceImplement类的所有代码如下:
其中新注入的内容如下图蓝色标注所示。

代码写好了,下面我们便要进行测试,由于我们修改了taotao-manager工程,最好我们重新打包taotao-manager工程到本地Maven仓库,然后我们重启taotao-manager工程,重启后,我们再来访问商品详情页面,第一次访问是查询数据库,然后我们再刷新页面,第二次访问就是查询的缓存了。缓存中存储的信息如下图所示。

代码写好了,下面我们便要进行测试,由于我们修改了taotao-manager工程,最好我们重新打包taotao-manager工程到本地Maven仓库,然后我们重启taotao-manager工程,重启后,我们再来访问商品详情页面,第一次访问是查询数据库,然后我们再刷新页面,第二次访问就是查询的缓存了。缓存中存储的信息如下图所示。

Mac下安装Redis及Redis Desktop Manager

查询商品详情添加缓存分析、商品详情缓存的实现、Mac下安装Redis及Redis Desktop Manager

如何开始使用Redis Desktop Manager for Mac?
Redis Desktop Manager for Mac又被称为RDM,是适用于MacOS的快速开源Redis数据库管理应用程序。将键视为树,CRUD键,通过shell执行命令。那么如何开始使用RDM,我们来介绍一下。
查询商品详情添加缓存分析、商品详情缓存的实现、Mac下安装Redis及Redis Desktop Manager
您之后安装 RDM第一需要,以开始使用它创建连接到你的Redis服务器来做。在主屏幕上,按“ 连接到Redis服务器”按钮。
查询商品详情添加缓存分析、商品详情缓存的实现、Mac下安装Redis及Redis Desktop Manager
连接到本地或公共redis服务器在“连接设置”的第一个选项卡上,输入有关您正在创建的连接的常规信
名称 - 新连接的名称(例如:my_local_redis)
主机 - redis-server主机(例如:localhost)
端口 - redis-server端口(例如:6379)
Auth - redis-server身份验证密码
使用SSL连接到公共redis-server
如果要使用SSL连接到redis-server,则需要在第二个选项卡上启用SSL并提供PEM格式的公钥。您可以找到特定云服务的说明。
查询商品详情添加缓存分析、商品详情缓存的实现、Mac下安装Redis及Redis Desktop Manager
Windows Azure Redis缓存1.使用所有请求的信息创建连接
查询商品详情添加缓存分析、商品详情缓存的实现、Mac下安装Redis及Redis Desktop Manager
2.确保已启用“使用SSL协议”复选框

3.您的Azure Redis连接已准备就绪
Redis Labs
要使用SSL / TLS加密连接Redis Labs实例,请执行以下步骤:
1.确保在Redis Labs仪表板中为Redis实例启用了SSL。
2.garantia_credentials.zip从Redis Labs仪表板下载并解压缩
3.选择garantia_user.crt在“公钥”字段
4.选择garantia_user_private.key在“私钥”字段
5.garantia_ca.pem在“权限”字段中选择

通过SSH隧道连接到私有redis-server
基本的SSH隧道
SSH选项卡应该允许您使用SSH隧道。如果您的redis-server无法通过网络公开访问,这将非常有用。要使用SSH隧道,请选中“使用SSH隧道”复选框。有不同的安全选项:您可以使用普通密码或OpenSSH私钥。

对于Windows用户:
您的私钥必须是.pem格式。
查询商品详情添加缓存分析、商品详情缓存的实现、Mac下安装Redis及Redis Desktop Manager
高级SSH隧道如果您需要高级SSH隧道,则应手动设置SSH隧道并通过localhost连接:
ssh SSH_HOST -L 7000:localhost:6379
如何通过EC2连接到Redis ElastiCache
按照此博客文章中的说明操作
如何通过EC2连接Redis ElastiCache和In-Transit Encryption
使用RedisDesktopManager> = 0.9.9
单击SSH连接设置中的“启用TLS-over-SSH”
使用RedisDesktopManager <0.9.9
按照本文档部分的说明在EC2实例上进行设置stunnel
之后通过EC2连接到Redis ElastiCache
连接到UNIX套接字
Redis Desktop Manager 不直接支持UNIX套接字,但您可以使用本地套接字重定向到unix域套接字,例如使用socat:
socat -v tcp-l:6379,reuseaddr,fork unix:/tmp/redis.sock
高级连接设置
使用下一个选项卡高级设置以设置命名空间分隔符或其他设置。
查询商品详情添加缓存分析、商品详情缓存的实现、Mac下安装Redis及Redis Desktop Manager
下一步现在您可以立即测试连接或创建连接。恭喜,现在您已连接到Redis服务器。您应该看到类似于我们在屏幕上显示的内容。
查询商品详情添加缓存分析、商品详情缓存的实现、Mac下安装Redis及Redis Desktop Manager

单击连接并展开键。通过单击右键,您可以看到控制台菜单并从那里管理您的连接。

我的操作:
查询商品详情添加缓存分析、商品详情缓存的实现、Mac下安装Redis及Redis Desktop Manager
查询商品详情添加缓存分析、商品详情缓存的实现、Mac下安装Redis及Redis Desktop Manager
密码就是你linux root的密码
查询商品详情添加缓存分析、商品详情缓存的实现、Mac下安装Redis及Redis Desktop Manager

缓存结果RDM页面

查询商品详情添加缓存分析、商品详情缓存的实现、Mac下安装Redis及Redis Desktop Manager

查询商品详情添加缓存分析、商品详情缓存的实现、Mac下安装Redis及Redis Desktop Manager
这下每点击一个商品详情页面,都会加入缓存中
查询商品详情添加缓存分析、商品详情缓存的实现、Mac下安装Redis及Redis Desktop Manager
设置缓存成功