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

文章目录

  • 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 Spring data redis(推荐使用)
      • 2.1.2 Redis 的数据结构(高频考点)
      • 2.1.3 redisTemplate 自定义序列化
      • 2.1.4 设计缓存的key
      • 缓存预热
    • 2.2 Jedis
    • 2.3 Lettuce
    • 2.4 Redisson
    • 2.5 Jetcache
    • 2.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 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:

2.1.2 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.3 redisTemplate 自定义序列化

  • redisTemplate是什么?

  • redisTemplate如何自定义序列化?

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.4 设计缓存的key

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

缓存预热

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

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

  • 缓存预热的优点

    1. 解决问题引入中的问题,可以让用户始终访问很快
  • 缓存预热的缺点

    1. 增加开发成本(要额外开发和设计)
    2. 预热的时机和时间如果错了,有可能缓存的数据不对或者是太老的数据。
    3. 需要占用额外空间
  • 如何实现缓存预热

    1. 定时任务:每隔一段时间执行一次
    2. 模拟触发(手动触发)
  • 定时任务的方法

    1. Spring Scheduler(spring boot默认整合了) @Scheduler
    2. Quartz(独立于 Spring 存在的定时任务框架)
    3. XXL-Job 之类的分布式任务调度平台(界面 + sdk)【建议学习】
  • 用定时任务实现缓存预热
    用定时任务,每天刷新所有用户的推荐列表
    注意点:

    1. 缓存预热的意义:新增少,总用户多
    2. 缓存的空间不能太大,要预留其他缓存空间
    3. 缓存数据的周期(yupao项目每天一次)
  • 实现定时任务

    1. 主类开启 @EnableScheduling
    2. 给要定时执行的方法添加 @Scheduled注解,指定 cron 表达式或执行频率。cron表达式有计算网站,不用自己去记。

2.2 Jedis

  • 独立于Spring 操作 Redis 的 Java 客户端
  • Jedis 默认是线程不安全的,要配合 Jedis pool (连接池)使用

2.3 Lettuce

高阶的操作 Redis 的 Java 客户端

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

2.4 Redisson

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

2.5 Jetcache

2.6 几种实现的对比【技术选型】

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

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

2.7 小知识点

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/412054.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++----简单了解vector

大家好&#xff0c;今天我们来讲讲与string相似的向量类型。之所以说他们是相似的原因是他们其中的数据类型有些效果都是一样的。当然大家不能说&#xff0c;既然是差不多的干嘛还有一个这个啊。不如直接用string就可以了。当然世界名言存在即合理。既然我们都能想到的东西&…

金融知识普及月答题活动

金融知识普及月答题活动 关键词&#xff1a;金融安全、风险防范、金融常识、反诈宣传 推荐功能&#xff1a;答题、倡议书 宣传角度&#xff1a; 1. 普及金融知识&#xff1a;讲解货币、信用、利率、汇率等基本金融概念&#xff0c;以及储蓄、贷款、信用卡、保险等常见金融产…

Unity 图表插件Xcharts的一些坑

XY轴、图例文字不清晰。 2种方法解决 1&#xff1a;老套路&#xff0c;先放大再缩小&#xff0c;像素点多了就清晰了。 2&#xff1a;设置一个单独渲染的UI相机&#xff0c;把canvs所在的UI层级使用深度相机单独渲染,另一个选剔除UI的纯色或天空盒。同时&#xff0c;把改Canva…

基于Spring Boot的文字识别系统

前端使用htmlcssjs&#xff0c;后端使用Spring Boot&#xff0c;数据库使用mysql&#xff0c;识别算法有两个&#xff0c;一个是使用百度OCR接口&#xff0c;一个是自己写一个python&#xff0c;用flask包装。 其中百度OCR接口可以去免费申请&#xff0c;然后把appid、apikey、…

Java Web_00001

目录 Web项目介绍网页的组成部分 HTMLHTML简介HTML示例HTML文件的书写规范HTML标签标签介绍标签的语法&#xff1a;常用标签font特殊字符标题标签超链接列表标签img标签表格标签跨行跨列表格iframe框架标签(内嵌窗口)表单标签表单的显示表单格式化表单提交细节 其他标签 CSSCSS…

OpenHarmony轻松玩转GIF数据渲染

OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;提供了Image组件支持GIF动图的播放&#xff0c;但是缺乏扩展能力&#xff0c;不支持播放控制等。今天介绍一款三方库——ohos-gif-drawable三方组件&#xff0c;带大家一起玩转GIF的数据渲染&#xff0c;搞…

CI/CD实践(五)Jenkins Docker 自动化构建部署Node服务

微服务CI/CD实践系列&#xff1a; 微服务CI/CD实践&#xff08;一&#xff09;环境准备及虚拟机创建 微服务CI/CD实践&#xff08;二&#xff09;服务器先决准备 微服务CI/CD实践&#xff08;三&#xff09;gitlab部署及nexus3部署 微服务CI/CD实践&#xff08;四&#xff09…

GraphPad Prism下载安装教程怎样中文汉化

GraphPad Prism下载安装教程怎样中文汉化&#xff1a; GraphPad Prism 是一款集生物统计、曲线拟合和科技绘图于一体的软件&#xff0c;主要用于医学和生物科学领域的数据分析和绘图&#xff0c;具有高效、简便、多功能和高质量的特点&#xff0c;被广泛应用于科研、教育和业界…

湖南的智榜样网络安全公司开的培训学校参加学习成为网络安全工程师

学习网络安全可以通过以下步骤进行&#xff1a; 获取基础知识&#xff1a;开始学习网络安全之前&#xff0c;建议先获取一些计算机基础知识&#xff0c;包括计算机网络、操作系统、编程语言等方面的知识。这些基础知识将为你理解和学习网络安全提供必要的背景。 学习网络安全基…

安卓13去掉权限动态申请,默认授权,不用动态申请权限

总纲 android13 rom 开发总纲说明 1、前言 2、问题分析 3.代码处理 4.代码修改 5.编译 6.彩蛋 1、前言

day44——C++对C的扩充

八、C对函数的扩充 8.1 函数重载&#xff08;overload&#xff09; 1> 概念 函数重载就是能够实现"一名多用"&#xff0c;是实现泛型编程的一种 泛型编程&#xff1a;试图以不变的代码&#xff0c;来实现可变的功能 2> 引入背景 程序员在写函数时&#x…

C++语法基础(二)

C复合类型 结构体 1. C的结构&#xff0c;定义结构体类型的变量时&#xff0c;可以省略struct关键字 2. 可以定义成员函数&#xff0c;在结构体中的成员函数内部可以直接访问本结构体的成员&#xff0c;无需通过“.”或“->” 联合 1. C的联合,定义联合体类型的变…

Linux系统ubuntu20.04 无人机PX4 开发环境搭建(失败率很低)

PX4固件下载 PX4的源码处于GitHub&#xff0c;因为众所周知的原因git clone经常失败&#xff0c;此处从Gitee获取PX4源码和依赖模块。 git clone https://gitee.com/voima/PX4-Autopilot.git 正克隆到 ‘PX4-Autopilot’… remote: Enumerating objects: 454209, done. remot…

Apache CloudStack Official Document 翻译节选(十二)

快速部署一朵 Apache CloudStack 云 &#xff08;一&#xff09; 部署前的准备工作 Apache CloudStack快速部署指南 我们究竟在构建什么&#xff1f; 构建IAAS云是一件很复杂的事项&#xff0c;根据相关定义&#xff0c;构建IAAS云的可选项有很多。这些纷繁复杂的概念通常给…

WLAN原理实验简述——AP上线

一、需求&#xff1a; AP通过AC上线。 AC通过控制VLAN管理AP,创建VLAN100和放行。 AP同AC建立CAPWAP关系。 二、实验拓扑图&#xff1a; 三、实验步骤&#xff1a; LSW1: sys Enter system view, return user view with CtrlZ. [Huawei]Sysname lsw1 [lsw1]undo info enable I…

扩散模型(Diffusion Model)

扩散模型&#xff08;diffusion model&#xff09;是一种运用了物理热力学扩散思想的生成模型。扩散模型有很多不同的变形&#xff0c;本文主要介绍最知名的去噪扩散概率模型&#xff08;Denoising Diffusion Probabilistic Model&#xff0c;DDPM&#xff09;。如今比较成功的…

Notepad++回车不自动补全

问题 使用Notepad时&#xff0c;按回车经常自动补全&#xff0c;但我们希望回车进行换行&#xff0c;而不是自动补全&#xff0c;而且自动补全使用Tab进行补全足够了。下文介绍设置方法。 设置方法 打开Notepad&#xff0c;进入设置 - 首选项 - 自动完成&#xff0c;在插入选…

Windows上MSYS2的安装和使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、下载二、安装三、使用1.打开命令行2.搜索软件3.安装软件4.卸载软件5.更新环境6.其他四、MSYS2和Cygwin的差别总结前言 MSYS2这个工具我是越用越喜欢,很多东西放在Linux上如鱼得水但是放在…

禁止文件外发 | 如何禁止员工外发文件?严守企业机密,禁止员工外发敏感文件!

近期&#xff0c;我们注意到一些敏感项目资料有外泄的风险&#xff0c;这对公司的核心竞争力构成了严重威胁&#xff01; 我们必须立即采取行动&#xff0c;严守企业机密&#xff0c;确保每一份文件都安全无虞。 从今天起&#xff0c;我们要全面升级信息安全措施&#xff0c;…

2024世界机器人大会盛大开幕,卓翼飞思携无人智能领域产品集中亮相 !

开放创新 聚享未来&#xff01;万众瞩目的2024世界机器人大会暨博览会于8月21日在北京亦创国际会展中心盛大开幕。大会聚焦机器人技术与产业前沿趋势&#xff0c;展示机器人创新应用赋能千行百业的多元场景&#xff0c;全球顶尖的机器人科学家、行业领袖、创新精英汇聚一堂&…