外行做网站wordpress 语言设置中文
2026/1/10 7:51:36 网站建设 项目流程
外行做网站,wordpress 语言设置中文,网站怎样建设友情链接,网站多种语言是怎么做的JSR107在我们了解SpringBoot缓存深入的时候#xff0c;我们首先需要了解JSR107。JSR#xff1a;是Java Specification Requset 的缩写#xff0c;Java规范请求#xff1b;其是Java提供的一个接口规范#xff0c;类似于jdbc规范#xff0c;但是没有具体的实现#xff0c;…JSR107在我们了解SpringBoot缓存深入的时候我们首先需要了解JSR107。JSR是Java Specification Requset 的缩写Java规范请求其是Java提供的一个接口规范类似于jdbc规范但是没有具体的实现具体的实现就是redis等这些缓存。JSR107核心接口CachingProvider缓存提供者创建配置获取管理和控制多个CacheManagerCacheManager缓存管理器创建配置获取管理和控制多个唯一命名的CacheCache存在于CacheManager的上下文中一个CacheManager仅对应一个CachingProviderCache缓存是由CacheManager管理的CacheManager仅对应一个Cache的生命周期Cache存在于CacheManager的上下文中。类似于map的数据结构并临时存储以key为索引的值。一个Cache仅被一个CacheManager所拥有Entry缓存键值对是一个存储在Cache中的key-value对Expiry缓存时效每一个存储在Cache中的条目都有一个定义的有效期。一旦超过这个时间条目就会自动过期过期后条目将不可用访问更新和删除操作。缓存有效期可以通过ExpiryPolicy设置。要使用JSR107需要导入相关的maven依赖dependency groupIdjavax.cache/groupId artifactIdcache-api/artifactId /dependencySpring的缓存抽象Spring Cache只负责维护抽象层具体的实战由自己的技术选型来决定;将缓存处理和缓存技术解除耦合每次调用缓存功能方法时Spring会检查指定参数的目标方法是否已经被调用如果有就直接从缓存中获取方法调用后的结果如果没有就调用方法并缓存结果返回给用户下次直接从缓存中获取即可。当我们使用Spring Cache缓存抽象的时候我们需要关注两点确定那些方法需要被缓存缓存策略。Spring 缓存使用重要概念和缓存注解在正式开始进入SpringCache实战之间我们需要先了解一下Spring Cache 的缓存注解和几个重要概念。概率/注解作用Cache缓存接口定义缓存操作。实现有RedisCache等CacheManaer缓存管理器管理各种缓存Cache组件Cacheable主要针对方法配置能够根据方法的请求参数对其结果进行缓存CacheEvict清空缓存CachePut保证方法被调用又希望结果被缓存EnableCaching开启缓存注解keyGenerator缓存数据时key生成serialize缓存数据时value序列化策略说明Cacheable标注在方法上表示该方法的结果需要被缓存起来缓存的键由keyGenerator的策略决定缓存的值的形式是由serialize决定序列化还是json格式标注上该注解之后在缓存时效内再次调用该方法将不会调用方法本身而是直接从缓存中获取结果CachePut也是标注在方法上和Cacheable相似也会将方法的返回值存储起来不同的是标注CachePut的方法每次都会被调用而且每次都会将结果缓存起来适用对象的更新。环境搭建首先我们要创建数据库表结构SET FOREIGN_KEY_CHECKS0; DROP TABLE IF EXISTS department; CREATE TABLE department ( id int(11) NOT NULL AUTO_INCREMENT, department_name varchar(255) DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8; DROP TABLE IF EXISTS employee; CREATE TABLE employee ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(255) DEFAULT NULL, email varchar(255) DEFAULT NULL, gender int(11) DEFAULT NULL, d_id int(11) DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;然后添加maven依赖?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.2.9.RELEASE/version relativePath/ !-- lookup parent from repository -- /parent groupIdcom.guslegend/groupId artifactIdSpringCacheDemo/artifactId version1.0-SNAPSHOT/version properties maven.compiler.source11/maven.compiler.source maven.compiler.target11/maven.compiler.target project.build.sourceEncodingUTF-8/project.build.sourceEncoding /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.1.4/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration excludes exclude groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /exclude /excludes /configuration /plugin /plugins /build /project接下来生成实体类controller层service层mapper层。还有我们需要开启mybatis的驼峰映射和配置日志级别方便我们查看sql语句看缓存是否生效。缓存初体验首先我们需要再启动类上添加EnableCaching允许使用缓存。Cacheable属性名描述cacheNames/value指定缓存的名字用于区分不同缓存组件可通过该属性指定缓存键值将一个缓存键值分到多个缓存中。key缓存数据时的 key 值默认使用方法参数值支持 SpEL 表达式生成 key。keyGenerator缓存的生成策略与 key 功能一致支持自定义生成规则。cacheManager定义缓存管理器如 ConcurrentHashMap、Redis 等。cacheResolver与 cacheManager 功能一致二者选其一。condition指定缓存的条件满足条件时才缓存如#id0表示入参大于 0 时缓存支持 SpEL 表达式。unless缓存后判断条件满足时不缓存如#resultnull表示结果为 null 时不缓存支持 SpEL 表达式。sync是否使用异步模式进行缓存。注意即满足condition又满足unless条件的也不进行缓存使用异步模式进行缓存时(synctrue)unless条件将不被支持。名字位置描述示例methodNameroot object当前被调用的方法名#root.methodNamemethodroot object当前被调用的方法#root.method.nametargetroot object当前被调用的目标对象#root.targettargetClassroot object当前被调用的目标对象类root.targetClassargsroot object当前被调用的方法的参数列表#root.args[0]cachesroot object当前方法调用使用的缓存列表如 cacheNames{cache1,cache2} 则有两个 cache#root.caches[0].nameargument nameevaluation context方法参数的名字可直接用 #参数名或 #p0/#a00 代表参数索引#iban, #a0, #p0resultevaluation context方法执行后的返回值仅当方法执行之后判断有效如 cacheable 的 unless、cachePut 的表达式、cacheEvict 的beforeInvocationfalse#result实战进行两次查询方法只出现一次sql语句GetMapping(/{id}) Cacheable(cacheNames emp,key #id,condition #id0,unless #result null ) public Employee getEmpById(PathVariable(id) Integer id) { return employeeService.getEmpById(id); }Cacheable源码分析在运行方法之间会先去查询Cache缓存组件按照cacheNames指定的名字获取CacheManager先获取相应的缓存第一次获取缓存如果没有Cache组件会自动创建去Cache里面查找缓存的内容使用的key默认就是方法的参数key默认是使用keyGenerator生成的默认使用SimpleKeyGenerator没有查询到缓存就调用目标方法将目标方法返回的结果放到缓存里面。CachePut CacheEnvict CacheConfigCachePut调用方法有更新缓存数据一般用于更新操作在更新缓存时一定要和想要更新的缓存有相同的缓存名称和相同的key可类比同一张表的同一条数据。PutMapping(/update) CachePut(cacheNames emp,key #employee.id) public void updateEmp(RequestBody Employee employee) { employeeService.updateEmployee(employee); }CacheEnvict缓存清除清除缓存时要指定缓存的名字和key相当于告诉数据库要删除哪个表中的哪个数据key默认为参数值。属性value/cacheNames缓存的名字key缓存的键allEnries是否清除指定缓存中的所有键值对默认为false设置为true时会清除缓存中的所有键值对与key属性二选一使用beforeInvocation在CacheEnvict注解的方法调用之间清除指定缓存默认为false即在方法调用之后清除缓存设置为true时则会在方法调用之间清除缓存子啊方法调用之前还是之后清除缓存的区别在于方法调用时是否会出现异常若不出现异常这两种设置没有区别若出现异常设置为在方法调用之后清除缓存则不起作用因为方法调用失败了。Delete(/{id}) CacheEvict(cacheNames emp,key #id,beforeInvocation true) public void deleteEmp(PathVariable(id) Integer id) { employeeService.deleteEmployee(id); }CacheConfig作用标注在类上抽取缓存相关的公共配置可抽取的公共配置有缓存的名字主键生成器等Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface CacheConfig { String[] cacheNames() default {}; String keyGenerator() default ; String cacheManager() default ; String cacheResolver() default ; }实列通过CacheConfig的cacheNames属性指定缓存的名字之后该类中的其他缓存注解就不必再写value或者cacheName了会使用该名字作为value或cacheName的值也会遵循就近原则。Service CacheConfig(cacheNames emp) public class EmployeeServiceImpl implements EmployeeService { Autowired private EmployeeMapper employeeMapper; Override Cacheable(key #empId) public Employee getEmpById(int empId) { return employeeMapper.getEmpById(empId); } }自定义RedisCacheManager通过前面运用缓存我们发现缓存乱码了这时我们就需要自定义RedisCacheManager将其加入到SpringIOC容器中解决这个问题Configuration public class CacheConfig { Bean public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { // 分别创建String和JSON格式序列化对象对缓存数据key和value进行转换 RedisSerializerString strSerializer new StringRedisSerializer(); Jackson2JsonRedisSerializer jacksonSeial new Jackson2JsonRedisSerializer(Object.class); // 解决查询缓存转换异常的问题 ObjectMapper om new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jacksonSeial.setObjectMapper(om); // 定制缓存数据序列化方式及时效 RedisCacheConfiguration config RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofDays(1)) .serializeKeysWith(RedisSerializationContext.SerializationPair .fromSerializer(strSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair .fromSerializer(jacksonSeial)) .disableCachingNullValues(); RedisCacheManager cacheManager RedisCacheManager .builder(redisConnectionFactory).cacheDefaults(config).build(); return cacheManager; } }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询