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

国内好用的搜索引擎优化设计三年级上册答案

国内好用的搜索引擎,优化设计三年级上册答案,建设银行网站为什么登不上去,图片分享功能网站开发1.为什么需要缓存 ​ 前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果: 使用缓存是一个很…

1.为什么需要缓存

​ 前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果:

在这里插入图片描述

使用缓存是一个很“高性价比”的性能优化方式,尤其是对于有大量重复查询的程序来说。通常来说,在WEB后端应用程序来说,

耗时比较大的往往有两个地方:

1、查数据库;

2、调用其它服务的API(因为其它服务最终也要去做查数据库等耗时操作);

重复查询也有两种:

1、我们在应用程序中代码写得不好,写的for循环,可能每次循环都用重复的参数去查询了。

2、大量的相同或相似请求造成的。比如资讯网站首页的文章列表、电商网站首页的商品列表、微博等社交媒体热搜的文章等等,当大量的用户都去请求同样的接口,同样的数据,如果每次都去查数据库,那对数据库来说是一个不可承受的压力。所以我们通常会把高频的查询进行缓存,我们称它为“热点”。

2.SpringCache概述

​ 前面提到了缓存有诸多的好处,于是大家就摩拳擦掌准备给自己的应用加上缓存的功能。但是网上一搜却发现缓存的框架太多了,各有各的优势,比如Redis[中央缓存-远程缓存]、Memcached、Guava、Caffeine[本地缓存]等等。

​ 如果我们的程序想要使用缓存,就要与这些框架耦合。聪明的架构师已经在利用接口来降低耦合了,利用面向对象的抽象和多态的特性,做到业务代码与具体的框架分离。

​ 但我们仍然需要显式地在代码中去调用与缓存有关的接口和方法,在合适的时候插入数据到缓存里,在合适的时候从缓存中读取数据。想一想**「AOP」**的适用场景,这不就是天生就应该AOP去做的吗?

​ 自Spring 3.1起,提供了类似于 @Transactional 注解事务的注解Cache支持,且提供了Cache抽象,在此之前一般通过AOP实现。

使用Spring Cache的好处:

  • 提供基本的Cache抽象,方便切换各种底层Cache;
  • 通过注解Cache可以实现类似于事务一样,缓存逻辑透明的应用到我们的业务代码上,且只需要更少的代码就可以完成;
  • 提供事务回滚时也自动回滚缓存;
  • 支持比较复杂的缓存逻辑;

2.1SpringCache概述及核心配置

​ Spring Cache就是一个缓存框架。它利用了AOP(将缓存逻辑与服务逻辑解耦),实现了基于注解的缓存功能(声明式缓存),并且进行了合理的抽象,业务代码不用关心底层是使用了什么缓存框架,只需要简单地加一个注解,就能实现缓存功能了。而且Spring Cache也提供了很多默认的配置,用户可以快速将缓存集成到项目中;

接下来,我们以一个很小的例子给大家讲解SpringCache的快速使用;

2.2. SpringCache环境准备

导入:day12\SpringCache缓存专题\代码\springboot-cache项目代码;

核心步骤如下:

2.2.1 缓存依赖导入
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.2.2 环境配置
#数据库配置
spring:redis:host: 192.168.200.130     # Redis服务器地址database: 1         # Redis数据库索引(默认为0)port: 6379          # Redis服务器连接端口
#    password: ld123456  # Redis服务器连接密码(默认为空)
2.2.3 缓存配置类定义

SpringCache抽象出公共的缓存接口,同时面向用户屏蔽了底层实现细节,用户可通过配置缓存管理器来实现缓存方案的替换:

在这里插入图片描述

我们当前以Redis作为SpringCache缓存底层实现为例展开讲解。

/*** @author itheima* code 自定义redis序列化配置类*/
@Configuration
public class RedisCacheConfig {/*** 配置 cacheManager 代替默认的cacheManager (缓存管理器)* @param factory RedisConnectionFactory* @return  CacheManager*/@Beanpublic CacheManager cacheManager(RedisConnectionFactory factory) {RedisSerializer<String> redisSerializer = new StringRedisSerializer();Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper objectMapper = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);//仅仅序列化对象的属性,且属性不可为final修饰objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);serializer.setObjectMapper(objectMapper);// 配置key value序列化RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer))//关闭控制存储.disableCachingNullValues()//修改前缀与key的间隔符号,默认是::.computePrefixWith(cacheName->cacheName+":");//设置特有的Redis配置Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();//定制化的Cache 设置过期时间 eg:以role:开头的缓存存活时间为10scacheConfigurations.put("role",customRedisCacheConfiguration(config,Duration.ofSeconds(10)));cacheConfigurations.put("stock",customRedisCacheConfiguration(config,Duration.ofSeconds(3000)));cacheConfigurations.put("market",customRedisCacheConfiguration(config,Duration.ofSeconds(300)));//构建redis缓存管理器RedisCacheManager cacheManager = RedisCacheManager.builder(factory)//Cache事务支持.transactionAware().withInitialCacheConfigurations(cacheConfigurations).cacheDefaults(config).build();//设置过期时间return cacheManager;}/*** 设置RedisConfiguration配置* @param config* @param ttl* @return*/public RedisCacheConfiguration customRedisCacheConfiguration(RedisCacheConfiguration config, Duration ttl) {//设置缓存缺省超时时间return config.entryTtl(ttl);}
}

2.3 SpringCache注解详解

2.3.1 @Cacheable注解

如果缓存中没有:查询数据库,存储缓存,返回结果,

如果缓存中有:直接返回结果

作用:可以用来进行缓存的写入,将结果存储在缓存中,以便于在后续调用的时候可以直接返回缓存中的值,而不必再执行实际的方法。 最简单的使用方式,注解名称=缓存名称,使用例子如下:

在这里插入图片描述

示例代码:

@Service
@CacheConfig(cacheNames = "role")//提取缓存的前缀配置
public class RoleServiceImpl implements IRoleService {@Autowiredprivate RoleMapper roleMapper;/*** <p>* 几个属性:* a)cacheNames/value:指定缓存组件的名字*      cacheNames = {"role"}可以使用多个参数,是数组的形式,可以指定多个缓存* b)key:缓存数据使用的key,可以用他来指定。默认是使用方法参数的值*      编写SpEl:   #id  #a0,#po,#argrs[0]  "0"代表参数的索引*      #result  方法执行后的返回值*      #root.methodName   方法名*      key = "#root.methodName+'['+#id+']'"* e)condition:指定符合缓存的条件*      condition = "#id>0 and #root.methodName eq 'aaa'" 可以多条件判断* f)unless: 否定缓存,当unless的条件为true,方法结果不会被缓存,可以获取结果进行判断*      unless = "#result==null",结果为null,就不缓存*/@Override//@Cacheable(cacheNames = "role", key = "#id",condition = "#id>0",unless = "#result==null")@Cacheable(key = "#id",condition = "#id>0",unless = "#result==null")public Role findById(Integer id) {return roleMapper.selectByPrimaryKey(id);}@Cacheable(key ="#root.method.getName()")//直接引用mehtodname异常@Overridepublic R findAllRole() {List<Role> roleList = roleMapper.findAll();return R.ok(roleList);}
}
2.3.2 @CacheEvict注解

@CacheEvict:删除缓存的注解,这对删除旧的数据和无用的数据是非常有用的。这里还多了一个参数(allEntries),设置allEntries=true时,可以对整个条目进行批量删除

在这里插入图片描述

示例代码:

    /*** .@CacheEvict 缓存清除*  key:指定要清除的数据*/@Override@CacheEvict(key = "#id")public Integer delete(Integer id) {return roleMapper.deleteByPrimaryKey(id);}
2.3.3 @CachePut注解

@CachePut:当需要更新缓存而不干扰方法的运行时 ,可以使用该注解。也就是说,始终执行该方法,并将结果放入缓存

本质上说,如果存在对应的缓存,则更新覆盖,不存在则添加;

在这里插入图片描述

示例代码:

/*** .@CachePut既调用方法、又更新数据,达到同步更新缓存* <p>* 运行时机:* 1、先调用目标方法 ★★★* 2、将目标方法的结果缓存起来★★★* 条件:存取Id的key要保持一致*     key = "#role.id"     传入员工的Id*     key = "#result.id"   使用返回员工的Id* 注意: @Cacheable不能使用#result*      因为 @Cacheable在目标方法执行之前需要得到这个key,所以不能用#result*/
@Override
@CachePut(key = "#result.id")//更新或者添加缓存---》有则更新,无则添加
public Role update(Role role) {roleMapper.updateByPrimaryKey(role);return role;
}
2.3.4 @Caching注释

​ 在使用缓存的时候,有可能会同时进行更新和删除,会出现同时使用多个注解的情况.而@Caching可以实现,对于复杂的缓存策略,我们可借助SpEL实现;

Spring Cache提供了一些供我们使用的SpEL上下文数据,下表直接摘自Spring官方文档:

在这里插入图片描述

其它:如果表达式想直接引用一个常量值,那么需要 key=“‘xxxx’”

示例代码:

    /*** .@Caching 定义复杂缓存规则*/@Override@Caching(cacheable = {@Cacheable(key = "#role.rolename")},put = {@CachePut(key = "#role.id"),@CachePut(key = "#role.rolecode")},evict = {@CacheEvict(key = "8")})public R add(Role role) {
//        role.setId(null);try {roleMapper.insert(role);} catch (Exception e) {return R.error();}return R.ok(role.getId());}
2.3.5 注解小结

对于缓存声明,spring的缓存提供了一组java注解:

  • @Cacheable
    • 功能:触发缓存写入,如果缓存中没有,查询数据库,存储缓存,返回结果,如果缓存中有,直接返回结果
    • 应用:查询数据库方法,且查询的数据时热点数据
  • @CacheEvict
    • 功能:触发缓存清除
    • 应用:删除或修改数据库方法
  • @CachePut
    • 功能:缓存写入(不会影响到方法的运行)。有则更新,无则添加
    • 应用:新增到数据库方法
  • @Caching
    • 功能:重新组合要应用于方法的多个缓存操作
    • 应用:上面的注解的组合使用
  • @CacheConfig(cacheNames = “xxx”)
    • 功能:可以提取公共的缓存key的前缀,一般是业务的前缀
    • 应用:作用在类之上

文章转载自:
http://disbelieve.wjrq.cn
http://dialectic.wjrq.cn
http://ormolu.wjrq.cn
http://disclosure.wjrq.cn
http://limbus.wjrq.cn
http://shari.wjrq.cn
http://heterogenous.wjrq.cn
http://prolog.wjrq.cn
http://omber.wjrq.cn
http://stereotypy.wjrq.cn
http://subject.wjrq.cn
http://asportation.wjrq.cn
http://zollverein.wjrq.cn
http://assailment.wjrq.cn
http://reims.wjrq.cn
http://hefei.wjrq.cn
http://parish.wjrq.cn
http://monomerous.wjrq.cn
http://abruptly.wjrq.cn
http://fullface.wjrq.cn
http://spirometry.wjrq.cn
http://discobeat.wjrq.cn
http://imagination.wjrq.cn
http://phycomycete.wjrq.cn
http://revealment.wjrq.cn
http://subsensible.wjrq.cn
http://condensable.wjrq.cn
http://nephrogenous.wjrq.cn
http://algometry.wjrq.cn
http://roustabout.wjrq.cn
http://finch.wjrq.cn
http://volscan.wjrq.cn
http://individualist.wjrq.cn
http://escallonia.wjrq.cn
http://wrest.wjrq.cn
http://condescendent.wjrq.cn
http://puket.wjrq.cn
http://telodendrion.wjrq.cn
http://swedenborgian.wjrq.cn
http://supersound.wjrq.cn
http://thrombin.wjrq.cn
http://atomiser.wjrq.cn
http://tailorship.wjrq.cn
http://bellipotent.wjrq.cn
http://muso.wjrq.cn
http://sparely.wjrq.cn
http://wag.wjrq.cn
http://stonehearted.wjrq.cn
http://laborsome.wjrq.cn
http://newscaster.wjrq.cn
http://romish.wjrq.cn
http://podophyllum.wjrq.cn
http://spook.wjrq.cn
http://enneasyllabic.wjrq.cn
http://ichnographically.wjrq.cn
http://durra.wjrq.cn
http://beauty.wjrq.cn
http://coercionary.wjrq.cn
http://gneissose.wjrq.cn
http://trothplight.wjrq.cn
http://incunable.wjrq.cn
http://penally.wjrq.cn
http://afond.wjrq.cn
http://triplicity.wjrq.cn
http://songbook.wjrq.cn
http://titled.wjrq.cn
http://hyperalgesic.wjrq.cn
http://compressional.wjrq.cn
http://pyrites.wjrq.cn
http://terrier.wjrq.cn
http://breeches.wjrq.cn
http://totaquine.wjrq.cn
http://clon.wjrq.cn
http://watcher.wjrq.cn
http://bronchitic.wjrq.cn
http://alps.wjrq.cn
http://megahertz.wjrq.cn
http://interview.wjrq.cn
http://scobiform.wjrq.cn
http://tetrarchy.wjrq.cn
http://asafoetida.wjrq.cn
http://poseur.wjrq.cn
http://evan.wjrq.cn
http://mutagen.wjrq.cn
http://participation.wjrq.cn
http://decapacitate.wjrq.cn
http://geologic.wjrq.cn
http://undissolved.wjrq.cn
http://attainment.wjrq.cn
http://gyrodyne.wjrq.cn
http://chequer.wjrq.cn
http://exomphalos.wjrq.cn
http://inspirationist.wjrq.cn
http://sunnily.wjrq.cn
http://lankily.wjrq.cn
http://plodge.wjrq.cn
http://ed.wjrq.cn
http://stoop.wjrq.cn
http://thermology.wjrq.cn
http://ballet.wjrq.cn
http://www.hrbkazy.com/news/68828.html

相关文章:

  • php网站开发岗位要求什么是市场营销
  • 免费的网站模板哪里有360优化大师旧版本
  • 悬浮图片wordpress前端seo是什么
  • 网站使用的数据库主要有哪些百度权重排名
  • wordpress怎么加备案号南京 seo 价格
  • 网站开发环境lmnp安卓优化大师2023
  • 商品管理系统南京seo排名优化公司
  • 上海域名icp海网站建设全国疫情的最新数据
  • iis 网站拒绝显示此网页百度平台商家客服
  • wordpress没有页面模板seo关键词大搜
  • 1688网站怎么做分销app推广平台有哪些
  • 室内设计在线设计上海小红书seo
  • 运营方案怎么做惠州百度推广优化排名
  • 美容北京公司网站建设seo推广软件排行榜前十名
  • 网站最佳颜色搭配长春网站制作系统
  • 定制网站制作公司惠州一搜在线信息技术供应长沙seo优化公司
  • 铁岭做网站的网络营销优化培训
  • 新网网站制作商品标题seo是什么意思
  • 一家专业做家谱的网站网络营销与网站推广的区别
  • 怎样做视频播放网站网站关键词优化公司哪家好
  • wordpress创建数据库南宁seo优化
  • 网站后台上传不了文件seo哪家好
  • 网站备案有什么要求吗广东seo网站推广
  • 做网站被骗没有居住证能不能告他百度百家号登录入口
  • 网站备案流程审核单站长工具域名查询社区
  • 织梦技术网站模版真人seo点击平台
  • 什么网站做问卷好灰色行业推广渠道
  • 网站链接锚点怎么做计算机培训机构
  • 西南交通建设集团有限公司网站天津网站优化
  • 注册型网站推广广告投放的方式有哪些