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

一元抢宝网站开发搜索引擎是软件还是网站

一元抢宝网站开发,搜索引擎是软件还是网站,wordpress.com禁止访问,做生意的网站文章目录 引言一、SpringBoot缓存抽象概述二、Cacheable注解详解2.1 Cacheable的关键属性 三、缓存管理器配置四、自定义键生成策略五、缓存同步与失效策略六、SpringBoot缓存最佳实践总结 引言 缓存是提升应用性能的关键技术,SpringBoot提供了强大的缓存抽象层&am…

在这里插入图片描述

文章目录

    • 引言
    • 一、SpringBoot缓存抽象概述
    • 二、@Cacheable注解详解
      • 2.1 @Cacheable的关键属性
    • 三、缓存管理器配置
    • 四、自定义键生成策略
    • 五、缓存同步与失效策略
    • 六、SpringBoot缓存最佳实践
    • 总结

引言

缓存是提升应用性能的关键技术,SpringBoot提供了强大的缓存抽象层,使开发者能够以一致的方式操作不同的缓存实现。本文深入探讨SpringBoot的缓存机制,重点阐述@Cacheable注解的使用技巧及缓存管理器的配置方法,帮助开发者构建高效的缓存策略,优化应用性能。

一、SpringBoot缓存抽象概述

SpringBoot的缓存抽象建立在Spring Framework的缓存支持之上,提供了一套统一的缓存操作接口。这种抽象允许开发者在不修改业务代码的情况下,轻松切换底层缓存实现,如从本地缓存迁移到分布式缓存。缓存抽象的核心是CacheManager接口,它管理应用中的缓存,而@Cacheable等注解则提供了声明式缓存的能力。

/*** SpringBoot缓存示例项目启动类*/
@SpringBootApplication
@EnableCaching  // 启用SpringBoot的缓存支持
public class CacheDemoApplication {public static void main(String[] args) {SpringApplication.run(CacheDemoApplication.class, args);}/*** 配置日志以显示缓存操作*/@Beanpublic LoggingCacheErrorHandler cacheErrorHandler() {return new LoggingCacheErrorHandler();}
}

二、@Cacheable注解详解

@Cacheable是SpringBoot缓存抽象中最常用的注解,用于标记方法的返回值应被缓存。当标记了@Cacheable的方法被调用时,SpringBoot会检查指定的缓存是否已包含对应键的值,如存在则直接返回缓存值,不执行方法;如不存在,则执行方法并将返回值放入缓存。这种机制显著减少了重复计算,提升了应用响应速度。

/*** 用户服务实现类,演示@Cacheable注解的基本用法*/
@Service
public class UserServiceImpl implements UserService {private final UserRepository userRepository;public UserServiceImpl(UserRepository userRepository) {this.userRepository = userRepository;}@Override@Cacheable(value = "users", key = "#id")public User getUserById(Long id) {// 模拟数据库查询的耗时操作try {Thread.sleep(2000);  // 模拟2秒的查询延迟} catch (InterruptedException e) {Thread.currentThread().interrupt();}return userRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));}
}

2.1 @Cacheable的关键属性

@Cacheable注解具有多个属性,可精细控制缓存行为。value或cacheNames指定缓存名称;key定义缓存键生成规则,支持SpEL表达式;condition指定缓存条件;unless定义不缓存的条件;cacheManager指定使用的缓存管理器。合理设置这些属性可以实现精确的缓存控制,满足复杂业务场景的需求。

/*** 产品服务,展示@Cacheable的高级属性用法*/
@Service
public class ProductService {private final ProductRepository productRepository;public ProductService(ProductRepository productRepository) {this.productRepository = productRepository;}@Cacheable(cacheNames = "products",  // 缓存名称key = "#category.concat('-').concat(#price)",  // 组合键condition = "#price > 100",  // 仅缓存价格大于100的产品unless = "#result == null",  // 不缓存null结果cacheManager = "productCacheManager"  // 指定缓存管理器)public List<Product> findProductsByCategoryAndPrice(String category, double price) {// 模拟复杂查询return productRepository.findByCategoryAndPriceGreaterThan(category, price);}
}

三、缓存管理器配置

缓存管理器是SpringBoot缓存抽象的核心组件,负责创建、获取和管理缓存实例。SpringBoot默认使用ConcurrentMapCacheManager作为缓存管理器,它基于ConcurrentHashMap实现,适用于开发环境或小型应用。对于生产环境,通常需要配置更高性能的缓存管理器,如Caffeine、Redis或EhCache等。

/*** 缓存配置类,演示多种缓存管理器的配置*/
@Configuration
public class CacheConfig {/*** 配置基于Caffeine的本地缓存管理器*/@Bean@Primarypublic CacheManager caffeineCacheManager() {CaffeineCacheManager cacheManager = new CaffeineCacheManager();// 全局缓存配置cacheManager.setCaffeine(Caffeine.newBuilder().expireAfterWrite(30, TimeUnit.MINUTES)  // 写入后30分钟过期.maximumSize(1000)  // 最大缓存条目数.recordStats());  // 记录缓存统计信息// 预设缓存名称cacheManager.setCacheNames(Arrays.asList("users", "products", "orders"));return cacheManager;}/*** 配置Redis缓存管理器,用于分布式缓存*/@Beanpublic CacheManager redisCacheManager(RedisConnectionFactory connectionFactory) {// Redis缓存配置RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(60))  // 设置TTL为60分钟.disableCachingNullValues()  // 禁止缓存null值.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));// 为不同的缓存设置不同的配置Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();cacheConfigurations.put("users", cacheConfiguration.entryTtl(Duration.ofMinutes(10)));cacheConfigurations.put("products", cacheConfiguration.entryTtl(Duration.ofHours(1)));return RedisCacheManager.builder(connectionFactory).cacheDefaults(cacheConfiguration).withInitialCacheConfigurations(cacheConfigurations).build();}
}

四、自定义键生成策略

缓存键的设计直接影响缓存命中率和性能。SpringBoot默认使用方法参数的哈希值作为缓存键,但在复杂场景下,可能需要自定义键生成策略。通过实现KeyGenerator接口,开发者可以控制缓存键的生成逻辑,例如基于参数特定字段或组合多个参数生成键,从而提高缓存的精确性和有效性。

/*** 自定义缓存键生成器*/
@Component("customKeyGenerator")
public class CustomKeyGenerator implements KeyGenerator {@Overridepublic Object generate(Object target, Method method, Object... params) {StringBuilder key = new StringBuilder();// 添加类名key.append(target.getClass().getSimpleName()).append(":");// 添加方法名key.append(method.getName()).append(":");// 处理参数for (Object param : params) {if (param instanceof User) {// 对于User类型参数,使用其id作为键的一部分key.append(((User) param).getId());} else if (param != null) {// 对于其他参数,使用其toString()方法key.append(param.toString());} else {key.append("null");}key.append(":");}// 移除末尾的冒号if (key.charAt(key.length() - 1) == ':') {key.deleteCharAt(key.length() - 1);}return key.toString();}
}/*** 使用自定义键生成器的服务方法*/
@Service
public class OrderService {@Cacheable(cacheNames = "orders", keyGenerator = "customKeyGenerator")public Order getOrderDetails(Long orderId, String customerCode) {// 业务逻辑...return new Order(orderId, customerCode, /* 其他订单信息 */);}
}

五、缓存同步与失效策略

缓存数据与源数据的同步是缓存系统设计中的关键挑战。SpringBoot提供了@CachePut和@CacheEvict注解分别用于更新缓存和移除缓存项。@CachePut在不影响方法执行的情况下更新缓存,而@CacheEvict则负责清除缓存中的数据。通过合理使用这些注解,可以构建出高效的缓存同步机制,确保缓存数据的一致性。

/*** 演示缓存同步与失效的服务类*/
@Service
public class ProductInventoryService {private final ProductRepository productRepository;public ProductInventoryService(ProductRepository productRepository) {this.productRepository = productRepository;}@Cacheable(cacheNames = "inventory", key = "#productId")public int getProductInventory(Long productId) {// 从数据库查询库存return productRepository.findInventoryByProductId(productId);}@CachePut(cacheNames = "inventory", key = "#productId")public int updateProductInventory(Long productId, int newInventory) {// 更新数据库库存productRepository.updateInventory(productId, newInventory);return newInventory;  // 返回值将被缓存}@CacheEvict(cacheNames = "inventory", key = "#productId")public void invalidateInventoryCache(Long productId) {// 仅清除缓存,不执行实际业务逻辑// 方法体可以为空,注解会处理缓存清除}// 批量清除缓存@CacheEvict(cacheNames = "inventory", allEntries = true)public void clearAllInventoryCache() {// 清除inventory缓存中的所有条目// 例如在库存批量更新后调用}
}

六、SpringBoot缓存最佳实践

在实际应用中,缓存的使用需要遵循一些最佳实践。避免过度缓存,只缓存热点数据和计算密集型操作结果;设置合理的过期时间,避免缓存数据长时间不一致;为缓存配置适当的大小限制,防止内存溢出;实现缓存监控和统计,及时发现缓存问题。遵循这些实践可以充分发挥缓存的性能优势,同时避免常见的缓存陷阱。

/*** 缓存监控配置*/
@Configuration
@EnableCaching
public class CacheMonitoringConfig extends CachingConfigurerSupport {private static final Logger logger = LoggerFactory.getLogger(CacheMonitoringConfig.class);/*** 自定义缓存解析器,添加日志记录*/@Overridepublic CacheResolver cacheResolver() {return new LoggingCacheResolver(caffeineCacheManager());}/*** 自定义缓存错误处理器*/@Overridepublic CacheErrorHandler errorHandler() {return new CacheErrorHandler() {@Overridepublic void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {logger.error("Cache get error for cache: {} and key: {}", cache.getName(), key, exception);}@Overridepublic void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) {logger.error("Cache put error for cache: {} and key: {}", cache.getName(), key, exception);}@Overridepublic void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) {logger.error("Cache evict error for cache: {} and key: {}", cache.getName(), key, exception);}@Overridepublic void handleCacheClearError(RuntimeException exception, Cache cache) {logger.error("Cache clear error for cache: {}", cache.getName(), exception);}};}/*** 缓存统计信息收集任务*/@Scheduled(fixedRate = 60000)  // 每分钟执行一次public void reportCacheStatistics() {CaffeineCacheManager cacheManager = (CaffeineCacheManager) caffeineCacheManager();cacheManager.getCacheNames().forEach(cacheName -> {com.github.benmanes.caffeine.cache.Cache<Object, Object> nativeCache = (com.github.benmanes.caffeine.cache.Cache<Object, Object>) ((CaffeineCache) cacheManager.getCache(cacheName)).getNativeCache();CacheStats stats = nativeCache.stats();logger.info("Cache: {} stats - Hit rate: {}, Eviction count: {}, Load time: {}ms",cacheName,String.format("%.2f", stats.hitRate() * 100) + "%",stats.evictionCount(),stats.totalLoadTime() / 1_000_000);});}
}

总结

SpringBoot的缓存抽象为Java应用提供了强大而灵活的缓存支持。通过@Cacheable注解和多样化的缓存管理器配置,开发者可以轻松实现高效的缓存策略。本文详细阐述了缓存抽象的核心概念、@Cacheable注解的使用技巧、缓存管理器的配置方法、自定义键生成策略以及缓存同步与失效机制。在实际应用中,开发者应根据业务需求选择合适的缓存实现,并遵循缓存最佳实践,如合理设置缓存大小和过期时间、实施缓存监控与统计等。恰当地使用SpringBoot缓存不仅能显著提升应用性能,还能减轻数据库负担,提高系统整体响应能力和用户体验。

http://www.dtcms.com/wzjs/435033.html

相关文章:

  • 比较好的网站开发沈阳优化推广哪家好
  • 极速彩票网站建设现在百度推广有用吗
  • 把自己做的网站进行app封包自己建个网站要多少钱
  • 1920的网站做字体大小广告联盟有哪些
  • 鞍山网站制作一般多少钱友情链接是免费的吗
  • php做网站步骤品牌推广策略分析
  • vue做响应式网站网站是怎么优化推广的
  • 企业网站留言板爱站seo
  • 深圳市南山区住房和建设局网站网页搜索
  • 龙湖什么网站做宣传无限制搜索引擎排名
  • 长沙专门做网站建设的公司重庆网站seo建设哪家好
  • 怎么在华为防火墙做网站映射软文自助发稿平台oem
  • 电商网站排行市场营销策略包括哪些策略
  • 南宁企业网站制作免费查权重工具
  • 网页小游戏入口公众号关键词排名优化
  • 做动态网站用什么语言长春seo优化企业网络跃升
  • 湄潭建设局官方网站网站关键词推广工具
  • 建设交友网站新闻发稿渠道
  • wordpress主题英文改中文宁波seo免费优化软件
  • phpstorm网站开发seo文章
  • 江西南昌疫情防控最新政策广东seo推广费用
  • 网站竞争对手的选定一般参考什么标准的seo外包 杭州
  • 东莞沙田网站建设b站视频推广网站
  • 电商网站建设论文参考文献seo网络推广是什么意思
  • 深圳网站设计+建设首选谷歌浏览器 安卓下载2023版
  • 毕节市生态文明建设网站百度搜索软件
  • 政府网站建设战略百度入口
  • wordpress启用插件出错河南整站百度快照优化
  • 北京b2c网站制作沈阳seo排名外包
  • 重心型网站网站seo优化效果