-----------------------------------------------------------
"模块"【网站首页广告管理】:广告的展示,广告数据的管理,---
-----------------------------------------------------------
分为两张表 广告分类表 和广告表 1对多的关系
分类表主要有 id 和name 有 轮播图 今日推荐 猜你你喜欢 楼层广告
广告表主要是具体广告: 有分类id 广告标题 连接 是否启用 展示顺序等
后台查询出对应分类的广告,前端采用angularjs展示到相应的首页的位置
技术点: 实现了广告后台管理和广告前台展示,但是对于首页每天有大量的人访问,对数据库造成很大的访问压力,甚至是瘫痪。
那如何解决呢?我们通常的做法有两种:一种是数据缓存、一种是网页静态化。我们今天讨论第一种解决方案。
缓存解决方案: Spring Data Redis
Spring-data-redis 是 spring 大家族的一部分,提供了在 srping 应用中通过简单的配置访问 redis 服务,
对 reids 底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate 提供了 redis 各种操作、
异常处理及序列化,支持发布订阅,并对 spring 3.1 cache 进行了实现。
spring-data-redis 针对 jedis 提供了如下功能:
1.连接池自动管理,提供了一个高度封装的“RedisTemplate”类
2.针对 jedis 客户端中大量 api 进行了归类封装,将同一类型操作封装为 operation 接口
ValueOperations:简单 K-V 操作
SetOperations:set 类型数据操作
ZSetOperations:zset 类型数据操作
HashOperations:针对 map 类型的数据操作
ListOperations:针对 list 类型的数据操作
首页的广告每次都是从数据库读取,这样当网站访问量达到高峰时段,对数据库压力很大,并且影响执行效率。
我们需要将这部分广告数据缓存起来。 当根据广告分类查询所有广告的时候首先先去缓存中去查询有没有该分类的缓存数据
如果查询出来的结果有就直接返回,如果是等于空的话说明缓存中没有数据 这样就去走数据库查询,查询出相应分类的所有广告
放到缓存中去,
当广告数据发生变更时,需要将缓存数据清除,这样再次查询才能获取最新的数据
add:清除所添加广告分类的所有广告缓存
delete:先查询出广告分类id 根据该id清除该分类下的所有广告缓存
update: 考虑到用户可能会修改广告的分类,这样需要把原分类的缓存和新分类的缓存都清除掉。
先查询出修改前的分类id 清除缓存 判断分类id是否发生修改 如果变化就清除修改后分类id的缓存
---------------------------------------------------------------------------------------------------------
技术点:redis缓存来缓存页面上的广告(轮播图,广告模块),-- 使用的redis集群
什么时候用缓存:数据访问频繁,实时性要求比较低
① redis常用数据类型
*String:value可容纳的长度是512M,使用":"可优化存储,在可视化的cli端中":"会分文件夹分层;
*List : 是按照插入顺序排序的"链表",value可以在头部"left"插入,也可以在尾部"right"插入;
在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库 中删除,可用于队列,进行简单的任务调度;
*Hash : 主键是字符串,值是map集合,可以用于存储对象信息;
*Set : 无序集合,value不能重复,可用作跟踪唯一性的数据;
*ZSet : 和set一样,是不重复的集合,每个元素对应一个分数,可根据分数进行排序,在实际应用当中可以用作排行榜
② redis的持久化方案:
RDB:把内存中的数据按照一定的策略存储在硬盘上的持久化方式,可在redis.conf中利用save属性进行配置,保存的方案;
缺点:在没有达到存储策略所配置的频次,但是也进行了存储,那么那段时间内存储的内容会丢失;
AOF:把对redis进行操作的命令存储在日志文件中,默认不开启,默认配置是每秒执行一次,可以配置为每次修改后写入aof,数据完整性高,但是消耗性 能,利用redis做数据库就可以开启;
③ redis集群:
选择一台redis服务器作为主机master结点,另外一台或者多台redis服务器作为slave结点,降低了单结点redis服务器的读写负载,将读写分离到不同的服务 器,提高数据的可用性;
在redis.conf中配置cluster-enable yes; 在所有slave结点中redis.conf配置 slaveof <masterip> <masterport>;和 slave-read-only yes
④ redis缓存同步问题:数据库中的数据进行增删改的时候,缓存库也要同步;
* 采用硬编码的方式进行同步,操作数据库,缺点就是系统的耦合度过高,维护很麻烦
* 采用消息队列:数据库更改---消息队列---缓存更新
⑤ 和mysql的区别:
* mysql的存储介质是硬盘,redis是内存;
* mysql数据是基于二维表格的,redis是基于key/value的;
* mysql对事务的支持性好,redis事务支持弱;
⑥ 如何保证redis中缓存的是热点数据
* redis中可以在配置文件中设置lru策略,设置成MAXMEMORY POLICY:allkeys-lru,不常使用的数据就会被淘汰
* 在数据添加到redis的时候设置数据的过期时间,在过期时间内访问
-------------------------------------------------------------------------------------------------------------------
|
|