Redis学习打卡-Day1-SpringDataRedis、有状态无状态

Redis的Java客户端

  1. Jedis
    • 以 Redis 命令作为方法名称,学习成本低,简单实用。
    • Jedis 是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此推荐使用 Jedis 连接池代替Jedis的直连方式。
  2. lettuce
    • Lettuce是基于Netty实现的,支持同步、异步和响应式编程方式,并且是线程安全的。支持Redis的哨兵模式、集群模式和管道模式。
  3. Redisson
    • Redisson是一个基于Redis实现的分布式、可伸缩的Java数据结构集合。包含了诸如Map、Queue、Lock、Semaphore、AtomicLong等强大功能。

SpringDataRedis

  • 定义:SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis。
  • 特点:
    • 提供了对不同 Redis 客户端的整合(Lettuce和 Jedis)。
    • 提供了 RedisTemplate 统一API来操作Redis
    • 支持Redis的发布订阅模型。
    • 支持Redis哨兵和Redis集群。
    • 支持基于Lettuce的响应式编程。
    • 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化。
    • 支持基于Redis的JDKcollection实现。
RedisTemplate
  • SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:
    RedisTemplateAPI
序列化方式
  • RedisTemplate 可以接收任意 Object 作为值写入Redis,只不过写入前会把 Obiect 序列化为字节形式,默认是采用JDK序列化,得到的结果如下,可读性差,内存占用较大。
    序列化方式
  • 可以自己定义序列化方式:
    自定义序列化方式
  • 为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中并存入Redis,会带来额外的内存开销。为了节省内存空间,我们并不会使用JSON序列化器来处理valuje,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储java对象时,手动完成对象的序列化和反序列化。Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是String方式,省去了我们自定义RedisTemplate的过程
    StringRedisTemplate

有状态 & 无状态

  • 有状态(Stateful)和无状态(Stateless)是计算机领域中描述系统或协议是否依赖“状态信息”的核心概念,尤其在 Web 开发和 API 设计中至关重要。以下是通俗易懂的解释和对比:
有状态
  • 定义:服务器端会保存客户端的状态信息(如用户身份、临时数据),每个请求的处理需要依赖之前请求的上下文。
  • 典型场景:用户登录、购物车、多步骤表单等需要跟踪用户行为的场景。
  • 特点:
    • 依赖服务器存储:用户的状态信息(如登录状态、购物车数据)存储在服务器内存、数据库或缓存(如 Redis)中。
    • 请求关联性:客户端每次请求需携带标识(如 Session ID),服务器需通过标识查找对应的状态数据。
  • 优点:
    • 精准控制:服务端可随时修改或销毁状态(如强制用户退出)。
    • 安全性高:敏感数据(如权限)不暴露给客户端。
  • 缺点:
    • 扩展性差:集群部署时需同步状态(如 Redis 共享 Session)。
    • 资源占用:高并发时大量状态存储会增加服务器压力。
无状态
  • 定义:服务器不保存客户端的状态信息,每个请求独立且自包含(无需依赖之前的请求)。
  • 典型场景:RESTful API、微服务通信、跨域接口等分布式场景。
  • 特点:
    • 客户端携带完整信息:每次请求需附带所有必要信息(如 JWT 令牌),服务器直接解析无需查询存储。
    • 请求独立性:服务器处理请求时不依赖历史记录。
  • 优点:
    • 扩展性强:无需共享状态,天然支持分布式和横向扩展。
    • 性能高:省去了服务端查询状态的步骤。
  • 缺点:
    • 令牌管理复杂:无法直接撤销令牌(需黑名单或短有效期)。
    • 数据暴露风险:令牌内容可被解码(需避免存储敏感信息)。
通俗类比:去餐厅消费。
  • 有状态:你告诉服务员手机号(Session ID),服务员根据号码查询会员信息(服务端存储的状态,每次消费需报手机号)。
  • 无状态:你直接给服务员一张会员卡(JWT),卡里已包含身份信息、余额、有效期等信息(自包含状态,服务员无需查系统,直接读卡即可完成交易)。

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

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

相关文章

告别静态配置!Spring Boo动态线程池实战指南:Nacos+Prometheus全链路监控

一、引言 1.1 动态线程池的必要性 传统线程池的参数(如核心线程数、队列容量)通常通过配置文件静态定义,无法根据业务负载动态调整。例如,在电商大促场景中,流量可能瞬间激增,静态线程池容易因配置不合理导…

Flask如何读取配置信息

目录 一、使用 app.config 读取配置 二、设置配置的几种方式 1. 直接设置 2. 从 Python 文件加载 3. 从环境变量加载 4. 从字典加载 5. 从 .env 文件加载(推荐开发环境用) 三、读取配置值 四、最佳实践建议 在 Flask 中读取配置信息有几种常见方…

【React中useCallback钩子详解】

useCallback 是 React 中的一个性能优化 Hook,用于缓存函数引用,避免在组件重新渲染时重复创建相同的函数,从而减少不必要的子组件渲染或副作用执行。以下是其核心要点: 1. 核心作用 函数记忆化:返回一个记忆化的回调函数,仅在依赖项变化时重新创建函数,否则复用之前的函…

【!!!!终极 Java 中间件实战课:从 0 到 1 构建亿级流量电商系统全链路解决方案!!!!保姆级教程---超细】

终极 Java 中间件实战课:电商系统架构实战教程 电商系统架构实战教程1. 系统架构设计1.1 系统模块划分1.2 技术选型2. 环境搭建2.1 开发环境准备2.2 基础设施部署3. 用户服务开发3.1 创建Maven项目3.2 创建用户服务模块3.3 配置文件3.4 实体类与数据库设计3.5 DAO层实现3.6 Se…

C#异步Task,await,async和Unity同步协程

标题 TaskawaitasyncUnity协程 Task Task是声明异步任务的必要关键字&#xff0c;也可以使用Task<>泛型来定义Task的返回值。 await await是用于等待一个Task结束&#xff0c;否则让出该线程控制权&#xff0c;让步给其他线程&#xff0c;直到该Task结束才往下运行。 …

【USRP】在linux下安装python API调用

UHD 源码安装 安装库 sudo apt-get install autoconf automake build-essential ccache cmake cpufrequtils doxygen ethtool \ g git inetutils-tools libboost-all-dev libncurses5 libncurses5-dev libusb-1.0-0 libusb-1.0-0-dev \ libusb-dev python3-dev python3-mako …

什么是 NoSQL 数据库?它与关系型数据库 (RDBMS) 的主要区别是什么?

我们来详细分析一下 NoSQL 数据库与关系型数据库 (RDBMS) 的主要区别。 什么是 NoSQL 数据库&#xff1f; NoSQL (通常指 “Not Only SQL” 而不仅仅是 “No SQL”) 是一类数据库管理系统的总称。它们的设计目标是解决传统关系型数据库 (RDBMS) 在某些场景下的局限性&#xf…

蓝桥杯题库经典题型

1、数列排序&#xff08;数组 排序&#xff09; 问题描述 给定一个长度为n的数列&#xff0c;将这个数列按从小到大的顺序排列。1<n<200 输入格式 第一行为一个整数n。 第二行包含n个整数&#xff0c;为待排序的数&#xff0c;每个整数的绝对值小于10000。 输出格式 输出…

wordpress自学笔记 第三节 独立站产品和类目的三种展示方式

wordpress自学笔记 摘自 超详细WordPress搭建独立站商城教程-第三节 独立站产品和类目的三种展示方式&#xff0c;2025 WordPress搭建独立站教程#WordPress建站教程https://www.bilibili.com/video/BV1rwcteuETZ?spm_id_from333.788.videopod.sections&vd_sourcea0af3b…

智能手表蓝牙 GATT 通讯协议文档

以下是一份适用于智能手表的 蓝牙 GATT 通讯协议文档&#xff0c;适用于 BLE 5.0 及以上标准&#xff0c;兼容 iOS / Android 平台&#xff1a; 智能手表蓝牙 GATT 通讯协议文档 文档版本&#xff1a;V1.0 编写日期&#xff1a;2025年xx月xx日 产品型号&#xff1a;Aurora Wat…

Linux PCI 驱动开发指南

注&#xff1a;本文为 “Linux PCI Drivers” 相关文章合辑。 英文引文&#xff0c;机翻未校。 中文引文&#xff0c;略作重排。 如有内容异常&#xff0c;请看原文。 How To Write Linux PCI Drivers 翻译: 司延腾 Yanteng Si siyantengloongson.cn 1. 如何写 Linux PCI 驱动 …

Python 接入DeepSeek

不知不觉DeepSeek已经火了半年左右&#xff0c;冲浪都赶不上时代了。 今天开始学习。 本文旨在使用Python调用DeepSeek的接口&#xff08; 这里写目录标题 一、环境准备1.1 DeepSeek1.2 Python 二、接入DeepSeek2.1 参数2.2 requests2.3 openai2.4 返回示例 一、环境准备 1.1…

Java 集合与 MyBatis 动态 SQL 实战教程

一、Java 集合的创建与用法 在 Java 中&#xff0c;List、HashSet 和数组是常用的集合类型&#xff0c;以下是它们的创建与基本操作&#xff1a; 1. List 列表 创建方式&#xff1a; List<Integer> list new ArrayList<>(Arrays.asList(1, 2, 3)); // 可变列…

无人机避障——(运动规划部分)深蓝学院动力学kinodynamic A* 3D算法理论解读(附C++代码)

开源代码链接&#xff1a;GitHub - Perishell/motion-planning 效果展示&#xff1a; ROS 节点展示全局规划和轨迹生成部分&#xff1a; Kinodynamic A*代码主体&#xff1a; int KinoAstar::search(Eigen::Vector3d start_pt, Eigen::Vector3d start_vel,Eigen::Vector3d en…

Transformer Decoder-Only 算力FLOPs估计

FLOPs和FLOPS的区别 FLOPs &#xff08;Floating Point Operations&#xff09;是指模型或算法执行过程中总的浮点运算次数&#xff0c;单位是“次”FLOPS &#xff08;Floating Point Operations Per Second&#xff09;是指硬件设备&#xff08;如 GPU 或 CPU&#xff09;每…

掌握MySQL数据库操作:从创建到管理全攻略

1.库的操作 1.1库的查看 show databases; 这句语法形式是查看服务器已经存在的数据库 注意要加分号————&#xff1b; 1.databeses是复数形式 2.大小写都可以 前提&#xff08;数据库已经创建或查看服务器自带的数据库&#xff09; 也可以查看指定的数据库 show cre…

服务器综合实验(实战详解)

实验内容 环境拓扑结构 主机环境描述 主机名主机地址需要提供的服务content.exam.com172.25.250.101提供基于httpd/nginx的YUM仓库服务ntp.exam.com172.25.250.102提供基于Chronyd的NTP服务mysql.exam.com172.25.250.103提供基于MYSQL的数据库服务nfs.exam.com172.25.250.104…

CentOS 7 修改锁屏时间为永不

在 CentOS 7 中&#xff0c;默认情况下&#xff0c;系统会在一定时间不活动后自动锁屏。对于某些用户来说&#xff0c;可能希望禁用自动锁屏功能或者将锁屏时间设置为“永不”。本文将介绍如何通过图形界面和命令行两种方式修改 CentOS 7 的锁屏时间&#xff0c;确保系统永不自…

MySQL 日期计算方法 date_sub()、date_add()、datediff() 详解-文中有示例帮助理解

1、date_sub()、date_add() date_sub() 和date_add() 语法相同&#xff0c;只不过一个加一个减。 从日期中减去指定时间间隔 语法&#xff1a; DATE_SUB(start_date, INTERVAL expr unit) start_date: 起始日期&#xff08;如 now() , 字段名&#xff09;。 INTERVAL expr…

宝塔基于亚马逊云服务器安装mysql5.7失败问题记录

安装日志如下&#xff1a; --2025-05-14 15:25:15-- https://na1-node.bt.cn/install/1/mysql.sh Resolving na1-node.bt.cn (na1-node.bt.cn)... 128.1.164.196 Connecting to na1-node.bt.cn (na1-node.bt.cn)|128.1.164.196|:443... connected. HTTP request sent, awaitin…