SpringSession 基本原理
SpringSession 基本原理
@EnableRedisHttpSession 引入了一个 RedishttpSessionConfiguration 配置
1@Import(RedisHttpSessionConfiguration.class)
在 RedishttpSessionConfiguration 配置中注册了一个 RedisIndexedSessionRepository bean。这是一个 Redis 操作 Session 的bean。
org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration#sessionRepository
RedisHttpSessionConfiguration 继承了 SpringHttpSessionConfiguration 这个配置
在 SpringHttpSessionConfiguration 配置中注册了一个 SessionRepositoryFilter bean。
or ...
分布式下Session共享
分布式下Session共享首先聊聊session和cookie,session对象存储在服务器端节点内存中,cookie存储在客户端浏览器中。一般是客户端请求服务器,服务器端生成session对象,将session对象存储在jvm内存中,并且在响应头中放入sessionId响应给客户端,客户端收到响应后,将sessionid存储在本地。当浏览器第二次请求时会将本地cookie中存储的seesionId通过请求头的方式传递给服务器,这样服务器和客户端就能保持会话信息啦!如下图
那么为什么会出现分布式session问题呢,为了提高服务器端的负载能力,后台一般将服务器节点做集群,通过ngnix通过轮询的方式转发到目标服务器。打个比方,当浏览器首次访问A服务器生成session对象,然后在访问生成的session对象,如果正好被ngnix转发到了A服务器,那么没问题可以获取到session对象,如果不巧请求被转发到B服务器,由于之前生成的session对象在A服务器,B服务器根本没有生成session对象,很自然访问不到session对象。
上文来自知乎https://zhuanlan. ...
Java 四大函数式接口
Java 四大函数式接口
接口名
参数类型
返回类型
用途
Consumer<T>消费型接口
T
void
对类型为T的对象应用操作,包含方法:void accept(T t)
Supplier<T>供给型接口
无
T
返回类型为T的对象,包含方法:T get()
Function<T, R>函数型接口
T
R
对类型为T的对象应用操作,并返回结果。结果是R类型的对象,包含方法:R apply(T t)
Predicate<T>断定型接口
T
boolean
确定类型为T的对象是否满足约束,并返回 boolean 值。包含方法 boolean test(T t)
Java JUC - 学习笔记
JUC什么是 JUC在 JAVA 中,线程部分是一个重点,JUC 是 java.util.concurrent 工具包的简称,他是一个处理线程的工具包(JDK1.5推出)
进程和线程的概念进程和线程进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在当代面向线程设计的计算机结构中,进程是线程的容器,程序是指令、数据以其组织形式的描述,进程是程序的实体。
线程(Thread)是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程可以并行执行不同的任务。
进程:指在系统中正在运行的一个应用程序,程序一旦运行那么它就是一个进程。它是资源分配的最小单位。
线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。它是程序执行的最小单位。轻量级的进程依附于某一个进程上,共享这个进程所攫取到的内存资源
线程的状态新建状态 ==> 准备状态 == ...
java使用replace时中文被URL编码导致无效解决
在使用 "".replace("中文", "") 时,如果 target 中存在中文就会被进行 URL 编码,例如
以上例子是想用 queryString.replace("&attrs=44_以官网信息为准", ""); 将 &attrs=44_以官网信息为准 替换为空字符,但被URL编码了,编码后相当于 queryString.replace("&attrs=44_%E4%.....", ""); ,这时候就匹配不到我们的目标字符串。
可以将中文进行 UTF-8 编码就可以了
123// 对字符串进行UTF-8编码String str = URLEncoder.encode("44_以官网信息为准", "UTF-8");String targetStr = queryString.replace("&attrs=" + str, "&qu ...
SpringCache
Spring Cache官方文档 https://docs.spring.io/spring-framework/docs/current/reference/html/integration.html#cache
Spring 从3.1开始定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术并支持使用 JCache(JSR-107)注解简化我们开发。
Cache 接口为缓存的组件规范定义,包含缓存的各种操作集合。Cache 接口下 Spring 提供了各种 xxxCache 的实现,如 RedisCache,EhCacheCache,ConcurrentMapCache 等。
每次调用需要缓存功能的方法时,Spring 会检查指定参数的指定目标方法是否已经被调用过,如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户,下次调用直接从缓存中获取。
使用 Spring 缓存抽象时我们需要关注以下两点
确定方法需要被缓存以及他们的缓存 ...
缓存数据的一致性
缓存数据的一致性读所有的数据,首先去缓存中获取,缓存中没有就去读数据库,最后在缓存中放一份。如果该数据在数据库中发生改变,那么缓存里面的数据如何和数据库保持一致?解决这个问题,目前有两个用的非常多的场景:
双写模式
失效模式
双写模式修改数据库的数据后再修改缓存中的数据
但又引出了一个问题,那就是当有并发时,线程一将数据库的值改为「一号」然后立刻将这个值保存到缓存,而保存过程中遇到了种种原因,如网络波动,导致了数据延迟抵达缓存服务器,而此时线程二已经将数据库数据改为「二号」然后将数据保存到缓存,线程二网络通畅,很快就抵达缓存服务器先于线程一将数据保存到缓存中,而此时线程一的数据才抵达缓存服务器,将数据「一号」保存到了缓存中(把二号覆盖),这时缓存中保存的就是一个脏数据。
这是临时性的脏数据问题,但是在数据稳定、缓存过期后,又能得到最新的正确数据。
读到的最新数据有延迟,这就导致了数据的最终一致性问题。
失效模式在改完数据库后,将缓存中的数据删除,下一次请求进来从缓存获取数据时发现没有对应数据,他会到数据库中查询并将数据保存在缓存中。
失效模式也有数据最终一致性问题,例如有三台 ...
Redisson 配置附带官方关于锁的文档
Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。
初始化引入 Redisson 原生依赖。该依赖提供了分布式锁、分布式对象 ...
Redis 缓存
缓存为了系统性能的提升,一般会将部分数据加入缓存中,加速访问。而 db 承担数据落盘工作。
哪些数据适合放入缓存?
即时性、数据一致性要求不高的
访问量大而且更新频率不高的数据(读多,写少)
整合Redis在 SpringBoot 工程中引入 Redis 场景
1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>
在配置文件中配置 Redis,Redis 的属性配置都在 org.springframework.boot.autoconfigure.data.redis.RedisProperties
1234spring: # 配置 redis redis: host: 172.16.34.128
使用 StringRedisTemplate 操作 redis
1234567891011 ...
Tomcat 安装
Tomcat到官网下载 tomcat
下载完成解压后,将该文件夹命名为 Tomcat,移动到资源库(/Library)
打开终端转到 Tomcat /bin 路径,给所有 .sh 文件755权限。
sudo chmod 755 *.sh
启动 tomcat,输入 sudo sh ./startup.sh 后回车:
sudo sh ./startup.sh
tomcat 启动后打开浏览器,输入localhost:8080
如果启动失败请检查8080端口是否被占用,如果已经被占用需要将8080杀死。
关闭Tomcat,用终端输入sh ./shutdown.sh