当前位置: 首页 > news >正文

《设计》完整版搜索引擎优化seo专员招聘

《设计》完整版,搜索引擎优化seo专员招聘,防控措施有这些优化,注册去美国做住家保姆的网站目录 一、Spring Data Redis 1.1、缓存功能 1.1.1、分析 1.1.2、案例实现 1.1.3、效果演示 1.2、计数功能(Redis RabbitMQ) 1.2.1、分析 1.2.2、案例实现 一、Spring Data Redis 1.1、缓存功能 1.1.1、分析 使用 redis 作为缓存, M…

目录

一、Spring Data Redis

1.1、缓存功能

1.1.1、分析

1.1.2、案例实现

1.1.3、效果演示

1.2、计数功能(Redis + RabbitMQ)

1.2.1、分析

1.2.2、案例实现


一、Spring Data Redis


1.1、缓存功能

1.1.1、分析

使用 redis 作为缓存, MySQL 作为数据库组成的架构

整体思路:

应用服务器访问数据的时候,先查询 Redis,如果 Redis 上存在该数据,就从 Redis 中取数据直接交给应用服务器,不用继续访问数据库了;如果 Redis 上不存在该数据,就会去 MySQL 中把读到的结构返回给应用服务器,同时,把这个数据也写入到 Redis 中.

由于 Redis 这样的缓存经常用来存储 “热点数据”,也就是高频使用的数据,那什么样的数据算高频呢?这里暗含了一层假设,某个数据一旦被用到了,那么可能在最近这段时间就可能被反复用到.

随着时间推移,越来越多的 key 在 redis 上访问不到,那 redis 的数据不是越来越多么?

  1. 把数据写给 redis 的同时,会给这个 key 设置一个过期时间.
  2. Redis 也有内存不足的时候,因此提供了 淘汰策略(之前的文章展开讲过).

1.1.2、案例实现

例如论坛网站,有些帖子的访问评论很高,就需要设置成热点文章,缓存起来(比起去 MySQL 数据库中查询文章要快的多). 

实现思路:

        根据上面理论,暗含假设当前使用的文章就是热点文章,也就是说,如果在缓存中有该文章,就直接返回,如果没有,就去数据库中查,然后再缓存起来,同时设置 30min(不同场景合理分配) 的过期时间.

帖子实体类.

@Data
public class Article {private String title;private String content;}

文章 mapper.

@Mapper
public interface ArticleMapper {/*** 根据 id 查询文章* @param id* @return*/Article selectArticleById(@Param("id") Integer id);}
    <select id="selectArticleById" resultType="com.example.cyk.cache.Article">select * from article where id = #{id};</select>

帖子 controller

@RestController
@RequestMapping("/article")
public class ArticleController {@Autowiredprivate IArticleService articleService;@GetMapping("/get")public HashMap<String, Object> get(@NonNull Integer id) {//1.获取文章服务Article article = articleService.getArticleInfo(id);//2.返回响应return HandlerResponse(1000, "操作成功", article);}/*** 处理返回格式* @param code* @param msg* @param data* @return*/private HashMap<String, Object> HandlerResponse(Integer code, String msg, Object data) {HashMap<String, Object> result = new HashMap<>();result.put("code", code);result.put("msg", msg);result.put("data", data);return result;}}

帖子 service .

@Slf4j
@Service
public class ArticleService implements IArticleService {@Autowiredprivate ArticleMapper articleMapper;@Autowiredprivate StringRedisTemplate redisTemplate;@Overridepublic Article getArticleInfo(Integer id) {//1.非空校验if(id == null) {log.warn("文章 id 为空");throw new RuntimeException("文章 id 为空");}//2.先去 redis 上看有没有文章对应的这个id//我这里约定 redis 上存储格式://key: art:id//value: $title$content  ($ 是分隔符)//例如 key: art:1    value: $决定$今天要好好学习String articleInfo = redisTemplate.opsForValue().get("art:" + id);if(articleInfo != null) {//存在直接返回log.info("从 redis 中获取到文章数据");//1) 解析格式Article article = analysisArticle(articleInfo);//2) 返回数据return article;}//3.redis 上没有数据,因此需要从 mysql 中取Article article = articleMapper.selectArticleById(id);if(article == null) {log.warn("文章不存在");throw new RuntimeException("文章不存在!");}//4.将文章存到 redis 中//1) 合成 redis 所需格式的文章articleInfo = synthesisArticle(article);//2) 设置 5 分钟过期时间(为了演示效果)redisTemplate.opsForValue().set("art:" + id, articleInfo, 5, TimeUnit.SECONDS);log.info("从 mysql 中获取到文章数据");return article;}/*** 合成 redis 需要的格式(提前约定好的)* @param article* @return*/private String synthesisArticle(Article article) {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("$");stringBuilder.append(article.getTitle());stringBuilder.append("$");stringBuilder.append(article.getContent());return stringBuilder.toString();}/*** 解析文章格式* @param articleInfo* @return*/private Article analysisArticle(String articleInfo) {Article article = new Article();String title = articleInfo.split("\\$")[1];String content = articleInfo.split("\\$")[2];article.setTitle(title);article.setContent(content);return article;}}

1.1.3、效果演示

1.2、计数功能(Redis + RabbitMQ)

1.2.1、分析

许多都会使应用用 Redis 作为计数的基础⼯具,它可以实现快速计数、查询缓存的功能,例如网站视频的播放量,点赞数量......

Ps:这些都是相比较 MySQL 数据库而言的,Redis 可以通过简单的键值对操作完成计数任务并且实在内存中完成的,而 MySQL 就需要先查询数据库,然后 +1,然后再存入数据库,是在需要进行硬盘存储的

1.2.2、案例实现

实现思路:

        假设,用户点击某个帖子,此时需要进行访问量 + 1 的操作,这时候应用服务器就会直接去操作 Redis ,执行 incr 命令,然后将返回的数据反馈给用户,最后 Redis 会以异步的方式(RabbitMQ 实现异步)将播放量同步到 MySQL 数据库中(异步就表示:这里并不是每一个播放请求,都需要立即写入数据~ 至于什么时候写入,需要根据实际的业务需求场景而定),将数据持久化.

Ps:实际中要开发⼀个成熟、稳定的真实计数系统,要⾯临的挑战远不⽌如此简单:防作弊、按 照不同维度计数、避免单点问题、数据持久化到底层数据源等。

文章实体类

@Data
public class Article implements Serializable {private Integer id;private String title;private String content;private Long visits; //访问量}

rabbit 交换机、队列、绑定配置.

public class MqFinal {//处理文章的直接交换机public static final String UPDATE_DIRECT = "article.update.direct";//用于修改文章数据的队列public static final String UPDATE_QUEUE = "article.update.queue";//bindingKeypublic static final String UPDATE_KEY = "article.update.key";}
@Configuration
public class MqConfig {/*** 消息转化器* @return*/@Beanpublic MessageConverter jsonMessageConverter() {return new Jackson2JsonMessageConverter();}@Beanpublic DirectExchange ArticleDirectExchange() {return new DirectExchange(MqFinal.UPDATE_DIRECT, true, false);}@Beanpublic Queue ArticleUpdateQueue() {return new Queue(MqFinal.UPDATE_QUEUE, true);}@Beanpublic Binding ArticleUpdateBinding() {return BindingBuilder.bind(ArticleUpdateQueue()).to(ArticleDirectExchange()).with(MqFinal.UPDATE_KEY);}}

mq 监听配置

@Slf4j
@Component
public class MqListenerArticle {@Autowiredprivate ArticleMapper articleMapper;/*** 同步数据库*/@RabbitListener(queues = MqFinal.UPDATE_QUEUE)public void syncVisits(HashMap<String, Object> data) {Integer id = (Integer) data.get("id");// Rabbitmq 这里有一个问题,Map<String, Object> 中 Object 传入为 Long 类型,需要用 Integer 来接受,否则报错// 因此发送消息之前,体现将 Long 类型转化为 String,接收到消息之后只需要将 String 转化为 Long 即可String visits = (String) data.get("visits");articleMapper.updateArticleVisits(id, Long.valueOf(visits));log.info("访问量数据同步完成!");}}

访问量增加服务(这里为了可读性,只展示了本业务的核心逻辑)

    @Overridepublic Article getArticleInfo(Integer id) {//1.非空校验if(id == null) {log.warn("文章 id 为空");throw new RuntimeException("文章 id 为空");}//2.访问量 +1//注意:incr 这个命令执行时,即使 key 不存在,也会自动生成 key,然后自增Long visits = redisTemplate.opsForValue().increment("v_art:" + id);//3.rabbitmq 实现异步数据同步(发送一个消息即可)HashMap<String, Object> visitsInfo = new HashMap<>();visitsInfo.put("id", id);visitsInfo.put("visits", visits.toString()); //转化原因前面解释过了rabbitTemplate.convertAndSend(MqFinal.UPDATE_DIRECT, MqFinal.UPDATE_KEY, visitsInfo);//4.获取文章数据//业务逻辑(这里为了可读性,就先不展示这里了)......//5.放入文章Article article = new Article();article.setVisits(visits);article.setId(id);return article;}

http://www.hkea.cn/news/416265/

相关文章:

  • 徐州营销网站建设产品线上推广渠道
  • 绍兴市网站建设公司企业官网搭建
  • 关于网页设计的网站免费发布信息网站大全
  • 郑州新闻头条seo基础教程
  • 做网站比较大的公司朔州seo
  • 如何制作私人网站福州专业的seo软件
  • 做网站主流技术南宁在哪里推广网站
  • 老板让我做网站负责人微博营销软件
  • 教我做网站百度打开
  • 网站开发时如何兼容电商运营是做什么的
  • 河北建设银行石家庄分行招聘网站怎么申请自己的网络平台
  • vs2008 做网站搜索引擎的工作原理是什么
  • 东莞常平做网站公司app营销策划方案
  • 爱用建站 小程序重庆网站制作公司
  • 网站建设小企业案例漯河网络推广哪家好
  • wordpress 清空回收站合肥网站优化软件
  • 电站建设招聘网站智推教育seo课程
  • 做静态网站选用什么服务器站长素材网站
  • 网站建设先做前台还是后台百度认证是什么
  • 广州专业做crm系统的供应商seo网站培训班
  • 景安建网站企业网站seo方案案例
  • 山东滕州疫情最新消息今天i长沙官网seo
  • 公司做网站买域名之后做什么百度一下你就知道手机版
  • 北京婚恋网站哪家最好企业推广宣传方式
  • 国发网站建设西安做网站公司
  • 网站推广服务合同简述网络营销的主要方法
  • 信息门户网站是什么成人计算机培训机构哪个最好
  • 网站建设公司 中企动力公司东莞商城网站建设
  • b2c的电子商务网站自己想做个网站怎么做
  • 京东pc网站用什么做的如何注册网站怎么注册