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

东莞松山湖网站建设二十一冶建设有限公司网站

东莞松山湖网站建设,二十一冶建设有限公司网站,那家公司做网站,网站 单页我们在进行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/wzjs/567351.html

相关文章:

  • 珠海网站建设优化推广网页设计策划案怎么写
  • 玉泉路网站建设做私活网站
  • 网站需要哪些备案济南网站建设sdjy6
  • 企业型网站有哪些特点用来做调查问卷的网站
  • wordpress字不能显示图片网络推广seo怎么弄
  • 英文seo网站建设签约网站做PPT
  • 驻马店网站建设熊掌号外贸做平台好还是自己建网站好
  • 自贡网站设计怎么做网页模板展示网站
  • 什么企业做网站比较好宁夏银川做网站的公司有哪些
  • 凡科网站建站教程网站建设页面大小
  • 河南企业网站推广微信优惠券网站怎么做的
  • 广东电子商务网站建设价格旅游网站建站目的
  • 网站建设工作稳定吗济南市商务局官方网站
  • 自己做游戏资讯网站艺术设计
  • 惠州市住房和城乡建设厅网站做自己的网站流量怎么
  • 做国外进口衣服的网站好众筹网站建设
  • wordpress用户等级免费刷seo
  • 南宁做网站方案聊城seo整站优化报价
  • 做网站平台的公司厦门免费推广平台
  • 镇江建设集团网站官方网站建设案例
  • 西安企业做网站多少钱wordpress调用最新评论
  • 优化网站的软件下载建立皇朝争霸完结小说
  • 什么网站可以做海报赚钱免费企业自助建站信息发布网
  • 网站服务器出错是什么意思怎么在各个网站免费推广信息
  • 购物网站名字百度会员登录入口
  • 临沂做商城网站设计安卓手机做网站服务器
  • 服务器建设网站社区团购系统开发
  • 代理企业网站备案网站空间申请
  • 网站排名要怎么做网站怎么做动态图片
  • 公司网站建设外包流程图高端品牌衣服排行榜前十名