如何建设网站后台,世界500强企业名录,舆情数据分析,做网站用的pm是啥1.非注解式实现
2.1使用之前要明确使用的业务场景
例如我们在登录时#xff0c;可以让redis缓存验证码#xff0c;又如在分类下显示菜品数据时#xff0c;我们可以对分类和菜品进行缓存数据等等。
2.2导入Redis相关依赖
dependencygroupIdorg.springfra…1.非注解式实现
2.1使用之前要明确使用的业务场景
例如我们在登录时可以让redis缓存验证码又如在分类下显示菜品数据时我们可以对分类和菜品进行缓存数据等等。
2.2导入Redis相关依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId
/dependency
2.3在使用的controller层导入RedisTemplate
例如
说明一下这里为什么使用Resource注解而不使用Autowired注解。
在Spring框架中Resource和Autowired都是用来完成依赖注入的注解它们可以将其他组件或者资源注入到当前的类中。在Spring框架中Resource和Autowired都是用来完成依赖注入的注解它们可以将其他组件或者资源注入到当前的类中。
Resource是Java提供的一个通用注解而Autowired是Spring框架提供的注解。Resource注解默认按照名称进行装配通过name属性指定注入的目标对象名称。而Autowired默认按照类型进行装配它会自动根据类型选择合适的对象进行注入。另外Autowired注解可以配合Qualifier注解一起使用通过指定具体的bean名称来完成注入。
其次Resource可以用于注入任意的bean包括其他类、接口、甚至是字符串等类型的资源。而Autowired注解主要用于注入其他的bean对象。
此外Resource注解可以标注在字段、setter方法、构造方法和方法上而Autowired注解通常标注在字段和构造方法上。
在实践中选择使用Resource还是Autowired取决于具体的需求和场景。如果需要按照名称进行注入或者需要注入的对象是一个非Spring托管的对象可以使用Resource注解。如果只是简单的注入Spring托管的对象并且希望按照类型自动选择合适的bean进行注入可以使用Autowired注解。
需要注意的是Resource和Autowired注解都需要对应的类进行配置以让Spring框架知道需要进行依赖注入的对象。
通过上面的说明其实我们自己内心里已经有答案孰强孰弱啦。 2.4此时我们要配置Redis
2.4.1配置application.yml 2.4.2编写RedisConfig配置类
由于Redis是一个内存数据库它将数据存储在内存中因此需要将数据序列化为字节流进行存储。在将数据存入Redis或从Redis中取出数据时需要进行序列化和反序列化的操作。
Configuration
public class RedisConfig extends CachingConfigurerSupport {/*** 自定义RedisTemplate* 设置Redis序列化方式默认使用的是JDKSerializer的序列化方式效率低所以这里设置使用FastJsonRedisSerializer*/BeanSuppressWarnings(value {unchecked, rawtypes})public RedisTemplateString, Object redisTemplate(LettuceConnectionFactory connectionFactory) {RedisTemplateString, Object redisTemplate new RedisTemplate();// 设置redis连接LettuceConnectionFactory实现了RedisConnectionFactoryredisTemplate.setConnectionFactory(connectionFactory);FastJsonRedisSerializer serializer new FastJsonRedisSerializer(Object.class);// key设置StringRedisSerializer序列化redisTemplate.setKeySerializer(new StringRedisSerializer());// Hash key设置序列化redisTemplate.setHashKeySerializer(new StringRedisSerializer());return redisTemplate;}}可以参考一下或许有更好的大家可以借鉴一下。
2.5使用缓存验证码为例 此时我们可以测试一下在此之前呢怎么看缓存数据是一个问题所以安排一下Redis的可视化工具 链接https://pan.baidu.com/s/1OUNza9ea9fQepXqNTeTq-g 提取码frpd 2.6测试 这只是一个简单的应用然后我们再来一个其他的案例缓存菜品数据
业务场景如下 每个分类比如湘菜川菜每次点击都需要再次重新查询数据库不仅压力更大而且造成资源浪费我们可以把这些查询的数据按菜品分类给存入redis中设置其30分钟生存周期这样再次点击查看就不会再查询数据库直接从redis中获取数据降低服务器压力也避免资源浪费。 缓存逻辑 我们先动态构造唯一key值然后根据key来获取value接下来判断value是否为空若不为空则表示redis中有该分类下的数据直接返回若为空则需要去数据库查询数据然后再把查询的数据放入redis缓存中下次再查询直接走redis缓存不用再次查询数据库。 这个就不再演示了到这里我们就可以明显觉得代码量上来了这只是一个查询都这样再细想一下这个查询会不会因为这个缓存出现问题比如说我们新增了菜品修改了菜品删除了菜品这个缓存区是不是得动一动那这个重复的代码多不多显而易见。
2.使用Spring Cache框架优化Redis缓存的过程
简单介绍一下这一位大咖Spring Cache框架是Spring框架提供的一套基于注解的缓存解决方案它在应用程序中简化了缓存操作的管理和使用。 Spring Cache框架的核心思想是通过在方法上添加缓存注解来实现自动缓存的功能。它提供了一些常用的注解如 Cacheable标注在方法上表示该方法的返回结果可以被缓存当方法被调用时会首先检查缓存如果缓存命中则直接返回缓存中的结果不再执行方法体中的逻辑。CachePut标注在方法上表示该方法的返回结果需要更新缓存每次方法被调用后都会将返回结果更新到缓存中。CacheEvict标注在方法上表示该方法会清除缓存中的数据可以用于在更新或删除数据时清除相应的缓存。 2.1导入Spring Cache依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-cache/artifactId/dependency2.2启动类上加上注解开启缓存 2.3返回结果类实现序列化接口 2.4改造上一个案例的代码 不用意外就是什么关于redis的什么都不剩了 我们只需要再控制层的接口上加上一个注解就完事了。 2.5测试
测试后即会在redis中产生一个这样的目录结构 对照接口上的注解再理解一下你就会明白其中的意思了。
这个时候你和非注解方式对比你会发现一个问题过期时间去哪啦没法设置过期时间了
3.再次优化Spring Cache使用
使用Cacheable时无法直接设置过期时间需要自定义RedisCacheManager来实现ttl设置。
3.1编写TtlRedisCacheManager类来获取注解Cacheable的参数
public class TtlRedisCacheManager extends RedisCacheManager {public TtlRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {super(cacheWriter, defaultCacheConfiguration);}Overrideprotected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {String[] cells StringUtils.delimitedListToStringArray(name, );name cells[0];if (cells.length 1) {long ttl Long.parseLong(cells[1]);// 根据传参设置缓存失效时间默认单位是秒cacheConfig cacheConfig.entryTtl(Duration.ofMinutes(ttl));}return super.createRedisCache(name, cacheConfig);}
}3.2修改RedisConfig配置类
Configuration
public class RedisConfig extends CachingConfigurerSupport {/*** 自定义RedisTemplate* 设置Redis序列化方式默认使用的是JDKSerializer的序列化方式效率低所以这里设置使用FastJsonRedisSerializer*/BeanSuppressWarnings(value {unchecked, rawtypes})public RedisTemplateString, Object redisTemplate(LettuceConnectionFactory connectionFactory) {RedisTemplateString, Object redisTemplate new RedisTemplate();// 设置redis连接LettuceConnectionFactory实现了RedisConnectionFactoryredisTemplate.setConnectionFactory(connectionFactory);FastJsonRedisSerializer serializer new FastJsonRedisSerializer(Object.class);// key设置StringRedisSerializer序列化redisTemplate.setKeySerializer(new StringRedisSerializer());// Hash key设置序列化redisTemplate.setHashKeySerializer(new StringRedisSerializer());return redisTemplate;}/*** 实例化自定义的缓存管理器*/BeanPrimarySuppressWarnings(value {unchecked, rawtypes})public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {RedisCacheWriter redisCacheWriter RedisCacheWriter.nonLockingRedisCacheWriter(Objects.requireNonNull(redisTemplate.getConnectionFactory()));RedisCacheConfiguration redisCacheConfiguration RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));return new TtlRedisCacheManager(redisCacheWriter, redisCacheConfiguration);}}
注意项目中已配置了RedisCacheManager需要在原配置的bean上添加注解Primary以免造成干扰。
3.3修改controller层数据接口的注解 根据你在RedisCacheManager中设置的什么格式来填写value即可。
即完成对Redis缓存数据的使用。有什么问题还请留言。