Java电商项目-6.实现门户首页数据展示_Redis数据缓存
目录
项目的 Github 地址
需求介绍
- 为了缩短用户看到首页信息的时间, 我们把首页显示的类目信息, 广告等数据放到 Redis 缓存中, 这样就不用通过耗时的数据库操作获取数据, 而是直接从 Redis 缓存中获取.
- 在开始之前先记录一个坑: 重启虚拟机后 nginx 服务器关闭了, 导致 nginx 上的图片无法访问, 当再次启动 nginx 的时候遇到
- 进入 nginx.conf 文件把 HTTPS SERVER 里面的 root 注释掉后问题就没有了, 能正常启动.
搭建 Redis 集群环境
- 实现 Redis 3 主 3 从集群搭建
- Redis3.0 开始支持集群,在每个 Master 上存放着各不相同的数据,即分布式存储的思想。
集群中的每个节点都需要知道集群中自己之外的其它节点。 - Redis 集群主 (Master(M1,M2,M3)) 从(Slave(S1,S2,S3))复制、读写分离 。Master 只负责写和
同步数据给 Slave,Slave 负责被读的任务,可以通过 Slave 的扩容提高读的速度。
下面先描述单机版 redis 的安装
- 首先要把 redis 的安装包上传到虚拟机上.
- 安装 gcc-c++ 编译器, 输入命令:
yum install gcc-c++
(我的机器已经安装过了, 第一次安装中途需要输入确定信息)
- 解压 redis 安装包:
tar zxvf 压缩包名...
- 进入解压后的文件夹, 输入指令
make
进行编译, 结果如下
- 接下来执行安装操作:
make PREFIX=/usr/local/redis/ install
(PREFIX 指定了安装位置)
- 进入 bin 目录后就可以登陆 redis 了. 但是 redis 有两种启动方式, 默认是前台启动:
./redis-server
- 使用前台启动的话, 命令行就不能用来输入命令了, 可以按 Ctrl + C 强行退出.
- 然后进入到解压目录, 把解压文件中的
redis.conf
文件拷贝到安装目录下:cp redis.conf /usr/local/redis/bin
- 编辑 redis.conf:
vi redis.conf
- 重新启动 redis:
./redis-server redis.conf
(指定配置文件) - 查看是否启动:
ps -ef | grep -i redis
- 在防火墙中配置 6379 端口为打开.
- 重启防火墙:
service iptables restart
- 测试是否能够连接上 redis 服务:
./redis-cli
- 单机安装到这里便告一段落.
下面将进行 Redis3 主 3 从集群环境搭建
- 安装集群需要 ruby 脚本, 先解压 ruby 脚本
tar zxvf 压缩包名
- 进入解压目录, 执行 install.sh
- 然后创建 redis 集群相关目录
- 首先在 /opt 目录下创建 redis 目录
- 然后进入 redis 目录, 在这创建 3 个集群相关目录:
mkdir conf
,mkdir logs
,mkdir data
- 其中 conf 目录用于存放 6 个 redis 共用的配置文件
- 需要将原始的 redis.conf 配置文件, 拷贝到 /opt/redis/conf 中, 更名为 redis-common
- 建议如果不熟悉的话在 windows 下进行配置, 然后在上传到 linux 中. (该配置文件已经给出, 可以到素材文件夹中获取)
- 然后进入
/usr/local/redis/bin
目录中, 加入各个 redis 的配置文件.
-
关闭防火墙:
service iptables stop
-
然后启动 redis 的 6 个服务. (先把之前启动的单机 redis 进程 kill 掉)
-
然后逐个启动 6 个服务
- 接下来要创建集群:(按照自己的 ip 地址进行修改), 执行目录为 redis 解压目录下的 src 目录
./redis-trib.rb create --replicas 1 192.168.117.130:6380 192.168.117.130:6381 192.168.117.130:6382 192.168.117.130:6383 192.168.117.130:6384 192.168.117.130:6385
- 找到执行这行命令的目录, redis 压缩包的解压目录 /src: 复制执行上面的命令
- 下面连接上集群进行测试, 进入
/usr/local/redis/bin
- 输入指令:
./redis-cli -c -p 6380
, -c 表示集群
- 这里记录一下 redis 集群的重启.
- 重启的参考连接
- 大致步骤是要把 /opt/redis/data 目录下的文件清空, 然后重新启动每个 redis 服务, 最后创建 redis 集群.
基于 SOA 架构, 创建门户 ashop-portal-web 门户项目
- 在 ashop 项目下创建 war 类型子模块
ashop-portal-web
- 接着配置好 pom.xml, src/main/resource 下的配置文件和 web.xml. 这些文件的配置可在源码中获得.
- 然后把静态资源复制到项目中
- 接着创建 PageController
- 打包部署项目, 显示出网站首页本阶段完成.
实现门户首页商品类目显示
- 创建远程服务方法:
- 然后封装回显数据的实体类对象
- 在 ashop-common 模块下的 beans 包中创建
CatResult
类
- 创建 CatNode 实体类.
- 编写 web 模块的 service 接口和实现类, 里面涉及到 json 字符串的封装
- 编写 controller, 这次响应回去的类型是 text/html
- 最后实现这样的效果
实现门户首页大广告轮播
- 远程服务提供者实现
- 编写封装响应信息的实体类.
-
编写 web 模块的 service 接口及实现类
-
编写 controller
- 最后打包部署, 能在商品的大广告位看到图片
实现商品类目缓存
- 考虑到商城首页的并发量很大, 如果每个用户的请求都从数据库中查询商品类目效率将会很低. 我们将会用 redis 把商品类目缓存到内存中, 加快响应速度.
- 整个逻辑是很好理解的:
- 如果 redis 缓存中没有商品类目数据, 就通过调用 ashop-rpc 远程服务获得数据, 通过处理后保存到 redis 中, 再返回给用户进行展示.
- 如果 redis 缓存中已经缓存了商品类目数据, 就直接返回给客户, 不需要调用 ashop-rpc.
- 首先在 pom 文件中添加依赖
-
创建 applicationContext-redis.xml
-
在 src 下创建文件 cache.properties, 记录 redis 中保存商品类目的键, 注意要在上面的 spring 配置文件中添加 context 头
- 接下来修改 service 实现类中的逻辑
实现大广告缓存, 缓存同步
- 缓存的逻辑和上面商品类目的缓存一样.
缓存同步
- 使用缓存就肯定要考虑缓存更新的问题. 如果后台更新了数据, 而 redis 缓存中的数据没有更新, 用户就会获取到非最新数据, 出现脏读.
- 关于实现缓存与数据库之间的同步, 以下提供两种思路:
- 设置 key 的生命周期, 定期同步数据库.
- 当调用远程服务操作数据库后, 同时清空缓存中的内容, 这样当客户访问时服务器将重新到数据库读取数据.