Java学习第七十三部分——Redis

目录

一、前言提要

二、核心特性 

三、数据结构  

四、应用场景

五、架构模式 

六、性能优势  

七、客户端库

八、注意事项

九、选择建议

十、使用示例——基于Jedis 和 Lettuce

十一、生态集成——基于Spring Boot

十二、企业级能力  

十三、持久化机制

十四、高级使用工具

十五、性能与连接管理

十六、适用情况 vs 不适用情况 

十七、总结归纳概述


一、前言提要

       Redis(“Re”mote “Di”ctionary “S”erver)是一个开源的内存数据结构存储系统,由Salvatore Sanfilippo于2009年创建。它既可用作高性能的键值数据库缓存消息中间件,也支持数据持久化,是NoSQL数据库的代表之一。  

二、核心特性 

特性说明
内存存储数据主要存储在内存中,提供 微秒级读写性能(10万+ QPS)
数据结构丰富支持字符串、哈希、列表、集合、有序集合、位图等 8 种数据结构
持久化支持 RDB(快照)和 AOF(日志追加)两种方式,确保数据安全
高可用通过 Redis Sentinel 实现故障转移,Redis Cluster 支持分布式集群
多功能支持事务、发布订阅、Lua 脚本、流处理、地理空间索引等

三、数据结构  

类型存储结构典型场景
String文本/二进制数据缓存、计数器(INCR
Hash字段-值映射表存储对象(如用户属性)
List双向链表消息队列、最新动态列表
Set无序唯一集合标签系统、共同好友
Sorted Set带分数的有序集合排行榜、延迟队列
Stream消息流(类似 Kafka)实时日志收集
HyperLogLog概率型数据结构大规模去重统计(如 UV)
Bitmap位数组用户在线状态、行为标记

四、应用场景

1. 缓存 
   - 减轻数据库压力,加速热点数据访问(如商品详情页)。  
2. 会话存储  
   - 分布式系统中的用户 Session 共享(替代 Cookie)。  
3. 排行榜/计数器  
   - 利用 `ZSET` 实现实时排行榜,`INCR` 实现秒杀计数器。  
4. 消息队列  
   - 通过 `List`(阻塞操作)或 `Stream` 实现异步任务队列。  
5. 实时数据处理  
   - 实时分析用户行为(如点击流)、地理位置计算(`GEO` 命令)。  

五、架构模式 

模式特点
单机模式简单部署,适合开发测试,但存在单点故障风险
主从复制主节点写,从节点读,实现读写分离
Sentinel监控主节点故障并自动切换从节点为主节点(高可用)
Cluster数据分片(16384 个槽),支持横向扩展,官方分布式方案

六、性能优势  

1. 单线程模型
   - 避免上下文切换和锁竞争(6.0+ 支持 I/O 多线程提升网络性能)。  
2. 纯内存操作  
   - 数据访问无需磁盘 I/O。  
3. 高效数据结构  
   - 如跳表(`ZSET`)、压缩列表(小数据优化)等。  
4. I/O 多路复用  
   - 基于 epoll/kqueue 处理高并发连接。  

七、客户端库

库名特点
Jedis简单轻量、同步阻塞、适合基础操作
Lettuce官方推荐(Spring Boot 默认)、支持异步/响应式、线程安全、高性能
Redisson分布式特性和数据结构(锁、队列等)
Spring Data Redis基于 Spring 的抽象层,简化操作

八、注意事项

1. 安全:启用 Redis 密码认证,避免暴露在公网
2. 高可用:使用 Redis Sentinel 或 Cluster 模式
3. 监控:通过 `redis-cli monitor` 或 Prometheus + Grafana
4. 内存管理:设置 `maxmemory-policy`(如 `allkeys-lru`)

九、选择建议

> - 简单项目 → Jedis
> - Spring Boot / 高性能需求 → Lettuce
> - 分布式系统 → Redisson
> - 快速开发 → Spring Data Redis

十、使用示例——基于Jedis 和 Lettuce

(1) Jedis 基础操作

import redis.clients.jedis.Jedis;public class JedisDemo {public static void main(String[] args) {// 1. 连接Redis (默认端口6379)try (Jedis jedis = new Jedis("localhost", 6379)) {// 2. 认证(如果设置了密码)// jedis.auth("your-password");// 3. 写入数据jedis.set("app:user:1001", "Alice");// 4. 读取数据String value = jedis.get("app:user:1001");System.out.println(value); // 输出: Alice// 5. 设置过期时间 (10秒)jedis.expire("app:user:1001", 10);} // try-with-resources 自动关闭连接}
}

(2) Lettuce 异步操作

import io.lettuce.core.RedisClient;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.async.RedisAsyncCommands;public class LettuceDemo {public static void main(String[] args) {// 1. 创建客户端 (格式: redis://密码@地址:端口)RedisClient client = RedisClient.create("redis://localhost:6379");try (StatefulRedisConnection<String, String> connection = client.connect()) {// 2. 获取异步命令接口RedisAsyncCommands<String, String> commands = connection.async();// 3. 异步写入commands.set("app:config:timeout", "30s").thenAccept(response -> {System.out.println("设置成功: " + response);});// 4. 异步读取commands.get("app:config:timeout").thenAccept(value -> {System.out.println("获取结果: " + value);});// 防止主线程退出(实际生产用CountDownLatch等)Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();} finally {client.shutdown(); // 关闭客户端}}
}

十一、生态集成——基于Spring Boot

(1) 添加依赖 (`pom.xml`)

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> <!-- 默认使用Lettuce -->
</dependency>

(2) 配置文件 (`application.yml`)

spring:redis:host: localhostport: 6379password: your-password-if-setdatabase: 0 # 默认DB索引

(3) 使用 `RedisTemplate`

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public void saveUserToken(String userId, String token) {// 写入Hash结构redisTemplate.opsForHash().put("user:tokens", userId, token);// 设置过期时间redisTemplate.expire("user:tokens", Duration.ofHours(1));}public String getToken(String userId) {return (String) redisTemplate.opsForHash().get("user:tokens", userId);}
}

十二、企业级能力  

- 安全控制:支持密码认证、ACL 权限管理(Redis 6.0+)。  
- 扩展模块:通过 Redis Modules 支持全文搜索(RediSearch)、图计算(RedisGraph)等。  
- 监控工具:内置 `INFO` 命令,集成 Prometheus/Grafana 可视化监控。  

十三、持久化机制

方式原理优点缺点
RDB定时生成内存快照(二进制文件)恢复速度快,文件紧凑可能丢失最后一次快照后的数据
AOF记录所有写操作命令(追加日志)数据安全更高(可配置每秒同步)文件较大,恢复较慢
混合RDB + AOF(Redis 4.0+)结合两者优势,推荐生产使用配置较复杂

十四、高级使用工具

- 分布式锁:用 `Redisson` 或 `RedisTemplate.execute` + Lua 脚本
- 发布订阅:

  redisTemplate.convertAndSend("news-channel", "新消息内容");

- 事务:

redisTemplate.execute(new SessionCallback<>() {public Object execute(RedisOperations operations) {operations.multi(); // 开启事务operations.opsForValue().set("key1", "value1");operations.opsForValue().increment("counter");return operations.exec(); // 提交事务}});

十五、性能与连接管理

- 连接池配置——Lettuce 默认使用 Netty 非阻塞连接,无需连接池

spring:redis:lettuce:pool:max-active: 20   # 最大连接数max-idle: 10    # 最大空闲连接min-idle: 3      # 最小空闲连接

- 序列化优化——避免 Java 原生序列化(性能差),推荐 JSON 或 Kryo

@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new GenericJackson2JsonRedisSerializer());return template;}

十六、适用情况 vs 不适用情况 

适用场景不适用场景
高频读写的热点数据海量冷数据存储
实时计算与分析复杂关系查询(如 JOIN)
临时数据存储(如会话)大规模二进制文件
分布式锁/协调替代关系型数据库

十七、总结归纳概述

       Redis 凭借性能极致数据结构灵活功能丰富的特点,已成为现代架构的核心组件。从缓存到实时系统,从微服务到 AI 基础设施,Redis 在互联网、金融、游戏等领域广泛应用,是开发者解决高性能存储问题的首选利器。

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

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

相关文章

(LeetCode 每日一题) 3487. 删除后的最大子数组元素和 (哈希表)

题目&#xff1a;3487. 删除后的最大子数组元素和 思路&#xff1a;哈希表&#xff0c;时间复杂度0(n)。 维护数组nums的最大值mx&#xff0c;同时用哈希表mp维护数组中非负数出现的情况&#xff0c;记录非负数的和sum。如果哈希表mp的大小为0&#xff0c;那么数组nums都是负数…

C 语言输入输出 (I/O)

C 语言输出在C语言编程中&#xff0c;printf()是主要的输出函数之一。该函数将格式化的输出发送到屏幕。例如&#xff0c;示例1&#xff1a;C 语言输出#include <stdio.h>int main (int argc, char* argv) {printf("Hello world\n");return 0; }输出结果C Prog…

分布式系统中的缓存设计与应用

引言 缓存是分布式系统中的重要组件&#xff0c;主要解决高并发&#xff0c;大数据场景下&#xff0c;热点数据访问的性能问题。提供高性能的数据快速访问。 本文是缓存在分布式应用第一篇文章&#xff0c;介绍缓存的原理&#xff0c;缓存的分类&#xff0c;缓存的设计&#xf…

智能机器人的技术革命:从感知到决策的全栈架构解析

——基于多模态大模型的下一代机器人系统设计引言&#xff1a;机器人技术的范式迁移当波士顿动力的Atlas完成后空翻时&#xff0c;全球见证了机器人运动控制的巅峰&#xff1b;但当Figure 01通过大模型理解人类模糊指令并自主执行任务时&#xff0c;我们正见证机器人认知智能的…

day20 双向链表

双向链表的函数功能注意事项 1.双向链表还需要关注到前指针的指向2.函数都需要判断逻辑3.函数的增删都要关注到len的变化4.函数的改查功能都需要遍历结束的标志NULL5.注意p->next->prio时&#xff0c;p->next是否指向NULL创建双向链表头节点Node_ptr list_create()函数…

[Rust 基础课程]猜数字游戏-获取用户输入并打印

创建项目 按照之前的章节讲的创建一个 Cargo 项目的方法&#xff0c;自己创建一个名为 guessing_game 的 cargo 项目并执行&#xff0c;确保能成功打印出 Hello World。 编写代码 使用 RustRover 打开项目&#xff0c;打开 src/main.rs 文件&#xff0c;我们将在这个文件中编写…

重读《人件》Peopleware -(22)Ⅲ 适当人选 Ⅵ 乐在其中(上)

本章以一个小测验开始&#xff1a;问题1&#xff1a;在过去几年里&#xff0c;你们组织的年员工流失率是多少&#xff1f; 问题2&#xff1a;替换一个离职员工平均需要多少成本&#xff1f;评分标准如下&#xff1a;如果你对这两个问题有任何答案&#xff0c;则通过&#xff1b…

Go、Node.js、Python、PHP、Java五种语言的直播推流RTMP协议技术实施方案和思路-优雅草卓伊凡

Go、Node.js、Python、PHP、Java五种语言的直播推流RTMP协议技术实施方案和思路-优雅草卓伊凡既然我们甲方要做直播私有化&#xff0c;既然我们做了这么多年系统&#xff0c;我们对直播的理解很深&#xff0c;那么我们2025年就应该用更先进的技术栈&#xff0c;不然怎么让我们的…

SpringBoot 集成Mybatis Plus

一、为什么SpringBoot不推荐使用MybatisSpring Boot 不推荐使用 MyBatis&#xff0c;主要源于二者在设计理念、生态融合和开发风格上的差异。Spring Boot 强调“约定优于配置”&#xff0c;追求高效的开发体验和统一的框架风格。它通过自动配置和依赖注入&#xff0c;将复杂的基…

PI 思维升级 PI设计的典范转移:从阻抗思维到谐振控制

们先来回想一件事&#xff0c;根据欧姆定律&#xff0c;阻抗是不是越低越好&#xff1f; 代表即使有很大的瞬时电流&#xff0c;瞬间的电压降也不会超过某个极限&#xff01;理论上是&#xff01; 可是这其实忽略了两个关键的要素&#xff1a;PDN阻抗有谐振&#xff1a;谐振代表…

如何制定企业级服务器安全策略(Security Policy)

制定一套**企业级服务器安全策略&#xff08;Security Policy&#xff09;**对于保护服务器资源、数据安全和业务连续性至关重要。以下是制定安全策略的详细指南&#xff0c;包括安全策略的核心要素、实施步骤和具体措施&#xff0c;帮助企业构建全面的服务器安全防护体系。1. …

n1 armbian docker compose 部署aipan mysql

apt update apt install docker-compose-plugin -y #安装docker compose docker compose version Docker Compose version v2.38.2 sudo mkdir -p /sda1/data/mysql/conf.d sudo chown -R 999:999 /sda1/data/mysql # MySQL 用户 UID 通常为 999 cat docker-compose.yml vers…

RAG情境化分段向量模型voyage-context-3,聚焦分段细节,融入全局文档上下文

最近看到一个有意思的工作&#xff0c;原文来自&#xff1a; https://blog.voyageai.com/2025/07/23/voyage-context-3/?utm_sourceTWITTER&utm_mediumORGANIC_SOCIAL voyage-context-3&#xff1a;聚焦分段细节&#xff0c;融入全局文档上下文 概要&#xff1a; Voyage A…

计算机体系结构中的中断服务程序ISR是什么?

计算机体系结构中的中断服务程序ISR是什么&#xff1f; 在计算机体系结构中&#xff0c;中断服务程序&#xff08;Interrupt Service Routine, ISR&#xff09; 是操作系统或硬件直接调用的关键代码模块&#xff0c;用于响应来自硬件设备、软件异常或系统事件的中断信号。其核心…

开源项目XBuilder前端框架

spx-gui/ 配置文件package.json 项目依赖和脚本配置vite.config.ts Vite构建工具配置tsconfig.json TS项目配置主文件tsconfig.app.json 应用程序的TS配置tsconfig.node.json Node.js环境的TS配置index.html 应用入口HTML文件src/ 源码目录main.ts 应用入口文件&#xff0c;初始…

0723 单项链表

Part 1.完成单向链表&#xff0c;并完成下面功能1.单链表节点创建链表是物理空间上不连续的一个结构&#xff0c;需要创建一个next作为指向下一个节点的指针&#xff0c;所以需要建立一个结构体包含数据域&#xff0c;next指针域&#xff0c;记录长度的数据域。因为长度只有头节…

基于 ASP.NET Web 应用程序(.NET Framework)的花店系统

1.1功能模块实现1.1.1整体结构界面由两部分组成&#xff1a;左侧导航栏、右侧内容展示区。使用了 Bootstrap 5 的样式库&#xff0c;并结合了 ASP.NET MVC 的 Html.ActionLink 和 Razor 条件判断语句来动态生成菜单项。1.1.2导航栏功能模块导航栏基础结构导航栏基础结构使用 Bo…

C++ Qt6 CMake qml文件启动方式说明

在Qt6之后,Qt程序默认使用CMake进行构建,当然也可以使用qmake, 本篇博客介绍Qt6.8之前和Qt6.8版本中QtQuick程序的启动方式。 在QtQuick程序main.cpp里qml的文件启动分为两种:(1)直接加载qml文件,(2)加载qml模块,下面分别介绍这两种启动方式。 方式1:直接启动qml文…

字符串 “asdasjkfkasgfgshaahsfaf” 经过哈夫曼编码之后存储比特数是多少?

要计算字符串 “asdasjkfkasgfgshaahsfaf” 经过哈夫曼编码后的存储比特数&#xff0c;需按以下步骤进行&#xff1a;步骤 1&#xff1a;统计字符出现频率先统计字符串中每个字符的出现次数&#xff1a;a&#xff1a;出现 6 次s&#xff1a;出现 6 次d&#xff1a;出现 1 次j&a…