防止重复提交,接口幂等性 文章介绍了接口幂等性的概念及其重要性,即用户对同一操作发起的一次或多次请求结果一致,不会因多次点击产生副作用。文章列举了需要防止非幂等性的情况,如用户多次点击按钮、页面回退再次提交等,并以SQL为例说明了哪些操作是天然幂等的。对于如何保证幂等性,提出了多种解决方案:使用token机制(需注意先删除还是后删除token的问题及原子性)、数据库悲观锁与乐观锁、业务层分布式锁、数据库唯一约束、Redis set防重以及防重表和全局请求唯一ID等方法。这些方案各有优缺点,适用于不同的场景。 2021-07-26 3268 0 java 总结 锁 分布式
SpringSession整合redis,解决分布式session问题 Spring Session是一个专注于解决session管理问题的项目,能够简单快速地集成到应用中,替代传统的HttpSession。其核心原理基于装饰者模式,通过`@EnableRedisHttpSession`注解导入配置类,实现对请求的拦截与处理。在每个请求经过`SessionRepositoryFilter`时,原生的HttpServletRequest和HttpServletResponse会被包装,并重写相关方法以调用自定义的session存储逻辑。使用Spring Session需要引入相应的依赖并配置Redis作为后端存储,同时可以通过自定义序列化器和CookieSerializer来扩展session的作用域及序列化方式。此外,通过简单的HTTP请求处理示例展示了如何在实际应用中保存和获取session信息。 2021-07-16 2321 0 java 总结 redis 分布式 微服务
分布式session 本文介绍了session的工作原理及其在分布式环境下的解决方案。session数据存储于服务端,通过客户端的jsessionId进行访问,但默认情况下session不可跨域。为了实现session在不同服务或集群间的共享,提出了几种方案:直接将信息存入cookie中(存在安全风险和大小限制)、session复制(效率低且不推荐)、基于哈希一致性算法分配特定机器处理请求(远程调用问题难以解决)以及使用Redis作为统一存储介质(目前较为流行的解决方案)。每种方法都有其优缺点,在实际应用时需根据具体需求选择合适的策略。 2021-07-16 1299 0 java 总结 redis 分布式
SpringCache Spring从3.1版本开始引入了`Cache`和`CacheManager`接口来统一不同缓存技术,并支持JCache(JSR-107)注解以简化开发。`Cache`接口的实现包括`RedisCache`、`EhCacheCache`等。每次调用需要缓存的方法时,Spring会检查该方法是否已执行过,若存在结果则直接返回缓存中的数据;否则执行方法并将结果缓存后返回。 使用步骤如下: 1. 添加依赖:`spring-boot-starter-cache`。 2. 在配置文件中指定缓存类型(如Redis)及过期时间。 3. 编写配置类设置缓存序列化方式及其他属性。 4. 通过`@EnableCaching`启用缓存功能。 Spring Cache提供了多个注解如`@Cacheable`用于定义缓存、`@CachePut`更新缓存、`@CacheEvict`清除缓存等。此外,`@Caching`可以组合多种缓存操作。对于缓存问题,如穿透、击穿和雪崩,Spring提供了相应解决方案,例如缓存空值、加锁以及随机过期时间策略。针对读多写少且一致性要求不高的场景,Spring Cache是一个很好的选择。 2021-07-03 1891 0 java 总结 锁 springboot 分布式 微服务
分布式锁Redisson Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, B 2021-07-02 1956 0 java 总结 锁 redis 分布式 微服务
本地缓存与分布式缓存 缓存在服务端编程当中,缓存主要是指将数据库的数据加载到内存中,之后对该数据的访问都在内存中完成,从而减少了对数据库的访问,解决了高并发场景中数据库容易成为性能瓶颈的问题;以及基于内存的访问速度高于磁盘的访问速度的原理(数据库读取数据一般需要从磁盘读取),提高了数据的访问速度和程序性能。本地缓存本地缓 2021-07-01 1193 0 java 总结 redis 分布式 微服务
lettuce堆外内存溢出bug 在进行压力测试时,可能会遇到堆外内存溢出(OutOfDirectMemoryError)的问题。这主要是由于Spring Boot 2.0之后默认使用的Redis客户端lettuce存在bug,导致Netty在处理网络通信时出现堆外内存溢出。Netty如果没有明确指定堆外内存大小,默认会使用Xms的值,可以通过设置-Dio.netty.maxDirectMemory来调整,但这不是根本解决办法。为了解决这一问题,建议升级Spring Boot版本或切换到使用Jedis作为Redis客户端。如果选择后者,需要在项目的依赖中排除lettuce-core,并添加jedis依赖。 2021-06-30 2134 0 java 问题 redis 分布式
Spring Cloud Gateway Spring Cloud Gateway是基于Spring 5.0、Spring Boot 2.0和Project Reactor等技术开发的微服务网关,旨在提供统一的API路由管理方式。它替代了Zuul,支持异步IO,具有更高的效率,并且与Spring Cloud紧密集成。Spring Cloud Gateway内置了多种Router和Filter,支持通过配置或编码使用。其三大核心概念包括Route(定义路由规则)、Predicate(匹配请求条件)和Filter(处理请求和响应)。通过简单的配置,可以实现基于时间、Cookie、Header、Host、请求方式、路径、参数及IP地址等多种条件的路由匹配。此外,还可以组合多个Predicates以实现复杂的路由逻辑。配置文件中添加相关依赖和服务发现后,即可快速搭建并测试网关功能。 2021-05-28 1848 0 总结 spring cloud gateway 分布式 微服务