学习笔记——后端项目中的相关技术 【随时更新】

news/2024/9/18 23:21:55/ 标签: 笔记, 后端, java, mysql

文章目录

  • 1. Session 共享
    • 1.0 cookie和session的工作流
    • 1.1 Cookie范围
    • 1.2 为什么要共享?
    • 1.3 如何共享存储
    • 1.4 session共享实现
  • 2. 缓存的实现
    • 2.1 缓存分类
    • 2. 2 Redis 缓存实现
      • 2.1.1 Redis 的数据结构(高频考点)
      • 2.1.2 redisTemplate 自定义序列化
      • 2.1.3 Java操作 Redis
        • ① Spring data redis(推荐使用)
        • ② Jedis
        • ③ Lettuce
        • ④ Redisson
        • ⑤ Jetcache
        • 几种实现的对比【技术选型】
      • 2.1.4 设计缓存的key
      • 2.1.5 缓存预热
        • ① 如何实现缓存预热:定时任务
      • 2.1.6 定时任务实现缓存预热
    • 2.7 小知识点

1. Session 共享

1.0 cookie和session的工作流

在 Web 开发中,Cookie 和 Session 是非常常见的,尤其是在处理用户身份验证、会话管理等方面。

  • 用户提交登录请求:
    用户通过登录页面提交用户名和密码。

  • 服务器验证用户信息:
    服务器接收到登录请求后,验证用户提供的用户名和密码是否正确。

  • 创建 Session:
    如果验证通过,服务器生成一个唯一的 Session ID,并在服务器端创建一个 Session 来存储用户的相关信息(如用户 ID、用户名、权限等)。

    服务器将这个 Session ID 存储在 Session 对象中,并设置一个过期时间。

  • 发送 Session ID 到客户端:
    服务器通过响应头,在响应头中设置 Set-Cookie,Set-cookie中包含了 Session ID。

  • 浏览器发送请求:
    客户端收到响应后,如果服务器给了Set-cookie,当用户在登录后访问其他页面时,浏览器会自动将包含 Session ID 的 Cookie 附加到每个 HTTP 请求中。

  • 服务器验证 Session:
    服务器接收到请求后,会检查请求中的 Cookie,提取出 Session ID。
    服务器使用这个 Session ID 查找对应的 Session,以确定该用户的身份,并获取相关的用户数据。

1.1 Cookie范围

  • Cookie存储在客户端且不可跨域。

  • 种session的时候注意范围,可以在配置的cookie.domain进行设置
    如果要共享cookie,可以种一个更高层的公共域名。

  • 比如,前端localhost:3000访问,分配cookie;后4000访问,又重新分配cookie。设置成更高的公共域名localhost之后,4000、5000等再访问的时候,不用重新给分配cookie了。

server:port: 8080servlet:context-path: /apisession:cookie:domain: localhost

1.2 为什么要共享?

  • 为什么服务器A登陆后,请求发到服务器B,B不认识该用户?

    原因:请求发到服务器A上,session(用户登录信息)存在A的内存中。
    此时B的内存没有该用户的sessionID,因此不认识该用户。
    在这里插入图片描述

    解决方案:共享存储,把session存储到A和B都能读取到的中间件中,可以使用redis、mysql、文件服务器ceph等;而不是把数据放到单台服务器的内存中。
    在这里插入图片描述

1.3 如何共享存储

核心思想:把数据放到同一个地方集中管理。

  1. Redis。用户信息读取 / 是否登录的判断及其频繁,Redis是基于内存的键值存储系统,读写性能很高,简单的数据单机qps能达到5w-10w。
  2. MySQL
  3. 文件服务器,如ceph

1.4 session共享实现

redis的云上装载参考:Java相关工具/插件的安装教程汇总

  1. 引入redis → 能够操作redis。
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.6.4</version>
</dependency>

redis管理工具:quick redis,能看到存进来的session信息等。

  1. 引入spring-session 和 redis 的整合,使得自动将session存储到redis中。
<!-- https://mvnrepository.com/artifact/org.springframework.session/spring-session-data-redis -->
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId><version>2.6.3</version>
</dependency>
  1. 修改spring-session存储配置,改application.yml的配置。
    原来session只设置了timeout过期时间,现在要加一个store-type。
    spring.session.store-type默认是none,表示存储在服务器
    设置成:store-type:redis 表示从 redis 读写 session
Spring:session:timeout: 86400store-type: redis

2. 缓存的实现

2.1 缓存分类

分布式缓存:
缓存只存在于单服务器上,会导致数据不一致。可以把缓存存在一台共享的服务器上,即为分布式缓存。

  • redis(分布式缓存)
  • memcached(分布式)
  • Etcd(云原生架构的一个分布式存储,适合存储配置)建议学习,亮点之一

单机缓存:

  • ehcache(单机,每个服务器只能读取自己的)
  • 本地缓存(java 内存 存到 Map)
  • caffeine(java 内存缓存,高性能)
  • Google guava

2. 2 Redis 缓存实现

NoSQL 数据库
key - value 存储系统 (区别于关系型数据库,redis存储的是键值对)

2.1.1 Redis 的数据结构(高频考点)

基本数据类型:

  • String 字符串类型:name: cat
  • List 列表:names: [“cat”,“dog”,“dog”]
  • Set 集合:names:[“cat”,“dog”](值不能重复)
  • Hash 哈希:nameAge:{“dog":1,“cat”:2,“mouse”:3}
  • Zset 集合:names:{dog - 3, cat - 5} 为值指定一个分数,适合做排行榜

高级类型:

  • bloomfilter(布隆过滤器,主要从大量数据中快速过滤纸,如邮件黑名单拦截)
  • geo(计算地理位置)
  • hyperloglog(pv / uv)
  • pub / sub(发布订阅,类似消息队列)
  • BitMap(存储大量可以压缩的信息)

2.1.2 redisTemplate 自定义序列化

为了防止写入 Redis 的数据乱码、浪费空间等,可以自定义序列化器。

  • redisTemplate是什么?

  • redisTemplate如何自定义序列化?

java">import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;@Configuration
public class RedisTemplateConfig {// https://space.bilibili.com/12890453/@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(connectionFactory);redisTemplate.setKeySerializer(RedisSerializer.string());return redisTemplate;}
}

2.1.3 Java操作 Redis

① Spring data redis(推荐使用)
  • Spring data 是一个通用的数据访问框架,定义了一组增删改查的接口。它能操作mysql、redis、jpa等。
  1. 引入
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.6.4</version>
</dependency>
  1. 配置 reids 地址
Spring:# redis配置redis:port: 6379host: localhost / IP地址password: 实际密码database: 0
server:
② Jedis
  • 独立于Spring 操作 Redis 的 Java 客户端
  • Jedis 默认是线程不安全的,要配合 Jedis pool (连接池)使用
③ Lettuce

高阶的操作 Redis 的 Java 客户端

  • springboot data redis 整合了 lettuce 的,看 springboot data redis 的依赖,引了 lettuce 的依赖
  • 支持异步、连接池
  • 连接池:复用连接
④ Redisson

分布式操作 Redis 的 Java 客户端,让你像在使用本地的集合一样操作 Redis (分布式 Redis 数据网格)

⑤ Jetcache
几种实现的对比【技术选型】
  • 如果用的是 Spring,并且没有过多的定制化要求,可以用 Spring data redis 最方便。
  • 如果用的不是 Spring,并且追求简单,没有过高的性能要求,可以用 Jedis + Jedis Pool
  • 如果项目不是 Spring,并追求高性能、高定制化且自认为编程水平较高(hhhhh),可以用 Lettuce,支持异步、连接池

  • 如果项目是分布式的,需要用到一些分布式的特性,比如分布式锁、分布式集合,推荐用 Redisson(可以简历写,亮点)

2.1.4 设计缓存的key

  • 不同用户看到的数据不同,,不要和别的项目的key冲突,故设计一个带项目、模块的key
    systemId:moduleId:func
    例如”xuwu:user:recommed:userId
  • 重要: redis内存不能无限增加,一定要设置过期时间!!

2.1.5 缓存预热

问题引入:第一个用户访问(暂时还没有缓存的情况下)还是很慢,也能一定程度保护数据库。

分析优缺点:打开思路,从整个项目从0 - 1的链路上去分析

  • 缓存预热的优点
    1. 解决问题引入中的问题,可以让用户始终访问很快
  • 缓存预热的缺点
    1. 增加开发成本(要额外开发和设计)
    2. 预热的时机和时间如果错了,有可能缓存的数据不对或者是太老的数据。
    3. 需要占用额外空间
① 如何实现缓存预热:定时任务
  1. 定时任务:每隔一段时间执行一次
  2. 模拟触发(手动触发)
  • 定时任务的方法
    1. Spring Scheduler(spring boot默认整合了) @Scheduler
    2. Quartz(独立于 Spring 存在的定时任务框架)
    3. XXL-Job 之类的分布式任务调度平台(界面 + sdk)【建议学习】

2.1.6 定时任务实现缓存预热

用定时任务,每天刷新所有用户的推荐列表

  • 注意点:
  1. 缓存预热的意义:新增少,总用户多
  2. 缓存的空间不能太大,要预留其他缓存空间
  3. 缓存数据的周期(yupao项目每天一次)
  • 实现定时任务
  1. 主类开启 @EnableScheduling
  2. 给要定时执行的方法添加 @Scheduled注解,指定 cron 表达式或执行频率。cron表达式有计算网站,不用自己去记。

2.7 小知识点

  • 操作系统知识:取数据速度,硬盘最慢,从内存取会相对更快。Mysql是从硬盘读取数据,redis缓存是从内存读取数据。从内存的缓存中读数据,能解决更快查询的问题。

  • 引入一个库时,先写测试类进行测试。


http://www.ppmy.cn/news/1519204.html

相关文章

【Linux】CodeServer:离线插件配置

下载 VS Code 插件 要为 code-server 添加离线插件&#xff0c;首先需要从 Visual Studio Code 插件市场下载所需的插件&#xff1a; 打开浏览器&#xff0c;访问 Visual Studio Code 插件市场。 在搜索栏中输入您需要的插件名称&#xff0c;找到插件后&#xff0c;点击插件页…

“线程池中线程异常后:销毁还是复用?”

目录 一、验证execute提交线程池中 测试 结论 二、验证submit提交线程池中 测试 结论 三、源码解析 查看submit方法的执行逻辑 查看execute方法的执行逻辑 为什么submit方法&#xff0c;没有创建新的线程&#xff0c;而是继续复用原线程&#xff1f; 四、总结 需要说…

经典大语言模型解读(2):生成式预训练的先锋GPT-1

论文地址&#xff1a;Improving Language Understanding by Generative Pre-Training 概述 现实世界中包含了大量的文本语料数据&#xff0c;然而&#xff0c;绝大多数语料都是无标签的。 为了充分利用这些无标签语料库&#xff0c;GPT1.0提出直接利用这些未标记的语料来进行…

VMware Workstation安装及配置CentOS7 Linux操作系统

VMware workstation安装 百度网盘&#xff0c;VMware-workstation-full-17.5.2.exe 安装包&#xff1a; 链接:https://pan.baidu.com/s/1xgbWUlo-hFUbb11MRxIVsw?pwd87bq 提取码: 87bq 检查网络适配器是否正常配置 在VMware Workstation中安装CentOS7 Linux操作系统 下载…

探秘Python字典:解锁数据管理的艺术

引言 字典&#xff08;Dictionary&#xff09;是一种可变容器模型&#xff0c;它可以存储任意类型对象。Python字典使用键-值对&#xff08;key-value pair&#xff09;存储数据&#xff0c;其中键必须是不可变的数据类型如数字、字符串等&#xff0c;而值可以是任何数据类型。…

花店鲜花管理与推荐系统+Python+Django网页界面+管理系统+计算机课设

一、介绍 花店鲜花管理与推荐系统。本系统使用Python作为主要开发语言开发的一个花店鲜花管理与推荐的网站平台。 网站前端界面采用HTML、CSS、BootStrap等技术搭建界面。后端采用Django框架处理用户的逻辑请求&#xff0c;并将用户的相关行为数据保存在数据库中。通过Ajax技…

泰山派的小手机后续(2)

之前 触摸板一直报错的解决&#xff1a; 1 我的触摸板 画错了。 从新画了一个 触摸的转接板&#xff0c;调整过来了。 关于触摸的 线序。 这块屏幕正常 就是横着放的。 关于泰山派接口的线序&#xff1a; 所以我的转接板的画法 是&#xff1a; 开发板与转接板 使用的是 反排线…

AWS 无服务计算服务 Lambda

无服务计算服务 Lambda 引言什么是 AWS Lambda关键特点使用场景 SQS 驱动 Lambda示例场景描述&#xff1a;订单处理系统解决方案&#xff1a;使用 SQS 和 Lambda示例代码&#xff1a;Python Lambda 处理 SQS 消息总结 Lambda ApplicationLambda Application 的主要组成部分创建…

“北京地铁系统中人脸识别技术的安全与效率问题研究”

关于“北京地铁系统中人脸识别技术的安全与效率问题研究”&#xff0c;可以从以下几个方面进行详细分析&#xff1a; 一、人脸识别技术在北京地铁系统中的应用 1. 安检系统 应用背景&#xff1a;为了提升地铁进站安检速度&#xff0c;减少乘客等候时间&#xff0c;北京地铁系…

深度学习速通系列:线性回归vs逻辑回归

线性回归和逻辑回归是两种常用的统计学方法&#xff0c;它们在数据分析和机器学习中扮演着重要的角色。下面是对这两种回归方法的基本介绍&#xff1a; 线性回归&#xff08;Linear Regression&#xff09;&#xff1a; 线性回归是一种预测分析方法&#xff0c;用于建模和分析…

基于单片机的无线空气质量检测系统设计

本设计以STC89C52单片机为核心&#xff0c;其中包含了温湿度检测模块、光照检测模块、PM2.5检测模块、报警电路、LCD显示屏显示电路、按键输入模块和无线传输模块来完成工作。首先&#xff0c;系统可以通过按键输入模块设置当前的时间和报警值&#xff1b;使用检测模块检测当前…

Java中的事件驱动架构(EDA)

引言 在现代软件开发中&#xff0c;事件驱动架构&#xff08;Event-Driven Architecture, EDA&#xff09;越来越受到青睐。EDA是一种软件架构范式&#xff0c;它通过生成、捕获和反应事件来驱动系统行为。在大型分布式系统中&#xff0c;EDA能够帮助我们提高系统的可扩展性、…

Golang 教程6——数组

Golang 教程6——数组 注意&#xff0c;该文档只适合有编程基础的同学&#xff0c;这里的go教程只给出有区别的知识点 1、赋值 1.1 main文件 func main() {//赋值方式1var arr [5] intarr[0] 1arr[1] 2arr[2] 3arr[3] 4arr[4] 5fmt.Println(arr)//赋值方式2var arr2 …

spring security 记住我在web和前后端分离如何使用

一、传统web开发准备工作 如果不懂原理的话&#xff0c;去看上一篇文章&#xff1a;CSDNhttps://mp.csdn.net/mp_blog/creation/editor/141716695 导入需要的依赖包&#xff0c;在传统web页面开发比较简单&#xff0c;我们设置只需要在页面请求参数加上一个remember-me 即可&a…

VS实用的调试技巧

目录 前言 一、是什么bug&#xff1f; 二、什么是调试(Debug) 三、Debug和Release 四、VS调试快捷键 4.1 环境准备 4.2 调试快捷键 五、监视和内存观察 5.1 监视 5.2 内存 六、举例 6.1 例一 6.2 例二 七、数组传参小技巧 八、编程常见错误归类 1. 编译型错误 …

【设计模式-职责链】

定义 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它避免请求的发送者与接收者耦合在一起&#xff0c;让多个对象都有机会处理这个请求。将这些对象连成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有对象…

嵌入式Linux:信号分类

目录 1、不可靠信号与可靠信号 1.1、不可靠信号 1.2、可靠信号 2、实时信号和非实时信号 2.1、非实时信号 2.2、实时信号 在Linux系统中&#xff0c;信号可以从两个不同的角度进行分类&#xff1a;一是从可靠性方面&#xff0c;将信号分为可靠信号与不可靠信号&#xff1…

【drools】Rulesengine构建及intelj配置

7.57.0.FinalRulesengineApplication 使用maven构建 intelj 打开文件资源管理器实在是太慢了所以直接把pom 扔到其主页识别为maven项目,自动下载maven包管理器 然后解析依赖: 给maven加一个代理 -DproxyHost=127.0.0.1 -DproxyPort=7890 还是卡主

Python DBUtils介绍

在Python的数据库编程中&#xff0c;高效、安全地管理数据库连接是至关重要的一环。DBUtils是一个Python模块&#xff0c;它提供了一套工具&#xff0c;旨在简化数据库连接的获取、重用和释放过程&#xff0c;从而提高应用程序的性能和可维护性。本文将详细介绍DBUtils的功能、…

深入解析浏览器与Web服务器的通信机制:从URL输入到页面渲染的全过程

浏览器与Web服务器的通信原理 1. 基本交互模式 浏览器向Web服务器发送请求&#xff0c;Web服务器向浏览器返回响应。这种应用程序之间的通信类似于人与人之间的对话,能够彼此响应。 2. 网络通信的基础 网络由多种通信设备组成通信前需确定双方位置进行请求和响应的交互 3.…