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

教育类的网站案例免费空间赞

教育类的网站案例,免费空间赞,北京海大网智网站建设制作公司,治疗早射最有效的方法是什么我们在进行Java项目开发时候,经常会用到Redis缓存例如数据库里的一些信息、手机验证码之类的,正常写法就会像去连mysql一样,这种硬编码的方式肯定是非常不合适的。 Autowireprivate UserMapper userMapper;Autowireprivate StringCommand str…

我们在进行Java项目开发时候,经常会用到Redis缓存例如数据库里的一些信息、手机验证码之类的,正常写法就会像去连mysql一样,这种硬编码的方式肯定是非常不合适的。

  @Autowireprivate UserMapper userMapper;@Autowireprivate StringCommand stringCommand;//查询用户public User getUserById(Long userId) {String cacheKey = "userId_" + userId;User user=stringCommand.get(cacheKey);if(user != null) {return user;}user = userMapper.getUserById(userId);if(user != null) {stringCommand.set(cacheKey,user);return user;}//修改用户public void updateUser(User user){userMapper.updateUser(user);String cacheKey = "userId_" + userId.getId();stringCommand.set(cacheKey , user);}//删除用户public void deleteUserById(Long userId){userMapper.deleteUserById(userId);String cacheKey = "userId_" + userId.getId();stringCommand.del(cacheKey);}}

有没有啥更抽象、更优雅的方式来实现呢?

有!那就是使用Spring Cache,它是一个对缓存的抽象,即使使用的缓存不是Redis也可以。
在这里插入图片描述
我们看到这里最重要的是这个CacheManager,是他给我们提供了一个抽象,让我们不用关心底层缓存技术(如 Redis、Ehcache、Caffeine)

那如何使用呢?
当然是通过Spring中最常见的方式——注释了 !!!这也是CacheManager提供给我们的功能
在这里插入图片描述
在pom文件下引入对应包(spring-boot-starter-data-redis、spring-boot-starter-cache)后,在启动类上加@EnableCaching注释,就可以使用Spring Cache的功能了。

这里再解释一下注释里的value和key分别是啥:

  • 首先value指定的是缓存的名称,对应底层 Redis 的 key 前缀或 hash 名,也就是你缓存数据时存在哪个“区域”。比如下面这个示例,缓存内容都是存入名为 userCache 的缓存区。
  • key则是指定缓存项在缓存区中的唯一标识。如果不指定,Spring 会默认根据方法所有参数自动生成一个 key。
// 先查缓存,有则返回缓存内容;如果没有,执行方法,并把返回值放进缓存。
@Cacheable(value = "userCache", key = "#id")
public User getUserById(Long id) {// 方法体只会在缓存未命中时执行return userService.getUserFromDB(id);
}// 还有一种写法,假设查询对应id用户为空时,这样可以让查询结果不缓存
// unless表示条件成立时,不缓存,也就是说:如果方法返回结果是 null,则不缓存
@Cacheable(value = "userCache", key = "#id", unless = "#result == null")
public User getUserById(Long id) {// 方法体只会在缓存未命中时执行return userService.getUserFromDB(id);
}// 不查缓存,始终执行方法,然后将方法返回值更新到缓存中。
@CachePut(value = "userCache", key = "#user.id")
public User updateUser(User user) {// 更新数据库return userRepository.save(user);
}// 删除缓存中的数据,可以指定 key,也可以一次清空整个缓存。
@CacheEvict(value = "userCache", key = "#id")
// @CacheEvict(value = "userCache", allEntries = true) 这个是全部清空
public void deleteUser(Long id) {// 删除数据库中的数据userRepository.deleteById(id);
}

还需要强调的一点,可能你会知道RedisTemplate,在我另一篇文章也讲了,这是一种给你手动操作Redis数据的方式,你可以调用.opsForXXX()来获取数据,是一种更加灵活、精细操作Redis的方式,例如在实现分布式锁等场景可以采用。但我们本文介绍的CacheManager是通过注释的方式自动操作缓存的,是一种方法级的自动缓存,简洁优雅,推荐用于 Controller/Service 层。

来个更加易懂的方式来解释,RedisTemplate像是你手动操作数据库的 JDBC 接口,而CacheManager则像是用 ORM 框架(比如 MyBatis)配置好后,通过注解自动执行数据库操作。

@Configuration
@EnableCaching // 开启Spring Cache注解支持,这样的话就可以直接使用@@Cacheable、@CachePut、@CacheEvict等注释来用了,当然如果你已经在主程序上标了,这里就不用写了,@EnableCaching全局写一次就行
public class RedisConfig {@Beanpublic RedisCacheManager redisCacheManager(RedisConnectionFactory factory, CacheTtlProperties ttlProps) {// 创建默认缓存配置:设置序列化方式、key前缀、是否缓存null值、默认过期时间等RedisCacheConfiguration defaultConfig = RedisCacheConfiguration.defaultCacheConfig().serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // key 使用字符串序列化.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); // value 使用 JSON 序列化// 创建一个 map 存放不同缓存区域(cacheName)对应的 TTL(过期时间)配置Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();// 从application.yml配置中读取每个缓存区域自定义的 TTL,并生成对应的配置项for (Map.Entry<String, Long> entry : ttlProps.getTtl().entrySet()) {cacheConfigurations.put(entry.getKey(),defaultConfig.entryTtl(Duration.ofMillis(entry.getValue()))); // 将该 cacheName 设置为自定义 TTL}// 构建 RedisCacheManager:指定默认配置及每个缓存区域的个性化配置return RedisCacheManager.builder(factory).cacheDefaults(defaultConfig) // 设置默认缓存行为.withInitialCacheConfigurations(cacheConfigurations) // 设置个性化缓存行为.build(); // 构建缓存管理器}
}

然后记得在application.yml配置对应参数,例如过期时间等:

spring:redis:host: localhost # Redis 服务地址port: 6379       # Redis 端口号cache:type: redis      # 使用 Redis 作为缓存实现redis:time-to-live: 1800000 # 全局默认缓存过期时间(单位:毫秒,1800000ms = 30分钟)cache-null-values: false # 是否缓存 null,false 表示不缓存 null 值,假设想在每个地方自行判断要不要缓存null可以不写这行use-key-prefix: true     # 是否启用 key 前缀key-prefix: cache::      # 缓存 key 的统一前缀,也就是key都变成了cache::xxx
// 上面配置的是全局缓存过期时间,你如果还想单独指定redis缓存空间例如userCache、orderCache的过期时间可以写在下面,其余的空间仍然是30分钟
custom:cache:ttl:userCache: 600000     # userCache 缓存区域的 TTL(单位:毫秒,600000ms = 10分钟)orderCache: 3600000   # orderCache 缓存区域的 TTL(单位:毫秒,3600000ms = 1小时)
http://www.dtcms.com/a/397438.html

相关文章:

  • 企业网站的模块功能做电影网站选服务器
  • 网站在建设中是什么意思多少工资
  • 昆山做百度网站dedecms 网站
  • 网站发送邮件连接怎么做深圳网站建设方维
  • 义乌营销型网站建设响应式网站建设有哪些好处
  • 网站如何做中英文双语言版本做电路设计的兼职网站
  • 成都网站备案如何利用互联网营销
  • 安庆做网站哪个公司好手机百度下载免费
  • ps和dw怎么做网站店面设计ppt
  • 净化网络环境网站该怎么做html5特效网站
  • 中企动力双语网站高端医疗网站建设
  • 常州做网站哪家快网站架构设计图怎么做
  • 企业做网站的意义思勤传媒网站建设公司
  • 科凡全屋定制深圳网站排名优化公司
  • 广州站infinity wordpress
  • 国外教育网站模板软件工程学科评估排名
  • 权重查询爱站网西红门模板网站建设
  • 网站广告素材珲春网站建设
  • 网站备案org群晖做自己的电影网站
  • 任丘市建设局网站开发区经济建设网站
  • 伍佰亿网站系统苏州网站建设培训
  • 湖州长兴建设局网站网站排名掉了怎么办
  • 国外用python做的网站内江手机网站建设
  • 网站建设时图片和文字市场营销策略有哪几种
  • 视频网站设计模板wordpress文章页怎么调用网站图片
  • 山东省个人网站备案企业网站页面
  • 如何做网站授权网址文山做女主播的在哪个网站
  • 惠州的企业网站建设项目推广方案怎么写
  • 大气蓝色律师网站phpcms模板wordpress 防注入广告
  • 个人做影视网站版权问题网站建设所要花费的资金