一、Redis 基础概念
Redis(Remote Dictionary Server)是开源的内存键值对数据库,以高性能著称。它支持多种数据结构(String、Hash、List、Set、ZSet),并提供持久化机制(RDB、AOF)。
核心特点:
内存存储,读写速度极快(单线程处理命令,QPS 可达 10w+)
支持数据持久化,避免重启数据丢失
提供丰富的数据结构操作
支持主从复制、哨兵模式和集群部署
单线程模型,避免上下文切换开销


典型应用场景:
缓存(减轻数据库压力)
计数器 / 限速器(如点赞数、限流)
消息队列(基于 List 或 Pub/Sub)
会话存储(分布式系统共享 Session)
排行榜(ZSet 有序集合)


二、Spring Data Redis 入门
Spring Data Redis 是 Spring 家族的一部分,提供了简化 Redis 操作的抽象层。
核心组件:
RedisTemplate:操作 Redis 的核心类
StringRedisTemplate:RedisTemplate 的子类,专门处理字符串
RedisConnectionFactory:连接工厂,管理 Redis 连接
RedisSerializer:序列化器,处理数据的序列化与反序列化
快速上手步骤:
添加依赖(Maven)
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置连接信息(application.properties)
properties
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=yourpassword
使用 RedisTemplate 操作数据
java
@Service
public class RedisExampleService {
private final RedisTemplate<String, Object> redisTemplate;

    public RedisExampleService(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}

    // 存储字符串
public void setString(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}

    // 获取字符串
public String getString(String key) {
return (String) redisTemplate.opsForValue().get(key);
}

    // 存储 Hash
public void setHash(String key, String field, Object value) {
redisTemplate.opsForHash().put(key, field, value);
}

    // 获取 Hash
public Object getHash(String key, String field) {
return redisTemplate.opsForHash().get(key, field);
}
}
三、序列化机制详解
RedisTemplate 默认使用 JDK 序列化器,会导致存储的键值带有类信息前缀(如 \xAC\xED\x00\x05t\x00\x03key),可读性差且占用空间。
推荐配置 JSON 序列化:
java
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);

        // 使用 Jackson 2 序列化器处理值
Jackson2JsonRedisSerializer<Object> jsonSerializer = 
new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(
om.getPolymorphicTypeValidator(), 
ObjectMapper.DefaultTyping.NON_FINAL
);
jsonSerializer.setObjectMapper(om);

        // 使用 String 序列化器处理键
StringRedisSerializer stringSerializer = new StringRedisSerializer();
template.setKeySerializer(stringSerializer);
template.setHashKeySerializer(stringSerializer);
template.setValueSerializer(jsonSerializer);
template.setHashValueSerializer(jsonSerializer);

        template.afterPropertiesSet();
return template;
}
}
四、缓存注解实战
Spring Data Redis 提供了基于注解的缓存抽象,简化缓存操作。
核心注解:
@Cacheable:查询时先查缓存,没有则执行方法并缓存结果
@CachePut:强制更新缓存(无论是否存在)
@CacheEvict:清除缓存
@Caching:组合多个缓存注解
@CacheConfig:类级别的缓存配置
示例代码:
java
@Service
@CacheConfig(cacheNames = "users") // 默认缓存名称
public class UserService {

    @Cacheable(key = "#id") // 缓存键为方法参数 id
public User getUserById(Long id) {
System.out.println("查询数据库: " + id);
return userRepository.findById(id).orElse(null);
}

    @CachePut(key = "#user.id") // 更新缓存
public User updateUser(User user) {
return userRepository.save(user);
}

    @CacheEvict(key = "#id") // 清除缓存
public void deleteUser(Long id) {
userRepository.deleteById(id);
}

    @Caching(
evict = {
@CacheEvict(key = "#id"),
@CacheEvict(cacheNames = "userList", allEntries = true)
}
)
public void deleteAndFlush(Long id) {
userRepository.deleteById(id);
}
}
五、高级特性与最佳实践
Redis 事务
java
public void transactionExample() {
redisTemplate.execute(new SessionCallback<List<Object>>() {
@Override
public List<Object> execute(RedisOperations operations) throws DataAccessException {
operations.multi(); // 开启事务
operations.opsForValue().set("key1", "value1");
operations.opsForValue().increment("counter");
return operations.exec(); // 执行事务
}
});
}
分布式锁实现
java
public Boolean acquireLock(String lockKey, String requestId, long expireTime) {
return redisTemplate.execute((RedisCallback<Boolean>) connection -> {
JedisCommands commands = (JedisCommands) connection.getNativeConnection();
return "OK".equals(commands.set(lockKey, requestId, "NX", "PX", expireTime));
});
}

public Boolean releaseLock(String lockKey, String requestId) {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
return redisTemplate.execute((RedisCallback<Boolean>) connection -> {
JedisCommands commands = (JedisCommands) connection.getNativeConnection();
return commands.eval(script, Collections.singletonList(lockKey), 
Collections.singletonList(requestId))
.equals(1L);
});
}
消息发布与订阅
java
// 发布者
public void publishMessage(String channel, String message) {
redisTemplate.convertAndSend(channel, message);
}

// 订阅者配置
@Configuration
public class RedisMessageConfig {
@Bean
RedisMessageListenerContainer container(
RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {

RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(listenerAdapter, new PatternTopic("chat"));
return container;
}

    @Bean
MessageListenerAdapter listenerAdapter(Receiver receiver) {
return new MessageListenerAdapter(receiver, "receiveMessage");
}
}

// 消息接收者
@Component
public class Receiver {
public void receiveMessage(String message) {
System.out.println("收到消息: " + message);
}
}


六、性能优化与监控
连接池配置
properties
spring.redis.lettuce.pool.max-active=8   # 最大连接数
spring.redis.lettuce.pool.max-wait=-1ms  # 获取连接的最大等待时间
spring.redis.lettuce.pool.max-idle=8     # 最大空闲连接数
spring.redis.lettuce.pool.min-idle=0     # 最小空闲连接数
慢查询日志
properties
# redis.conf 配置
slowlog-log-slower-than 10000  # 记录超过 10ms 的命令
slowlog-max-len 128            # 最多保留 128 条日志
内存优化
合理设置过期时间
使用 Hash 结构减少键数量
避免大 Value(建议不超过 10KB)
七、集群与高可用
哨兵模式配置
properties
spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=192.168.1.1:26379,192.168.1.2:26379
spring.redis.password=yourpassword
集群模式配置
properties
spring.redis.cluster.nodes=192.168.1.1:7000,192.168.1.2:7001,192.168.1.3:7002
spring.redis.cluster.max-redirects=3  # 最大重定向次数
八、常见问题与解决方案
缓存穿透
空值缓存:查询不存在时也缓存空结果
布隆过滤器:预先过滤不可能存在的 key
缓存雪崩
过期时间打散:为缓存设置随机过期时间
多级缓存:本地缓存 + Redis 结合
缓存击穿
互斥锁:查询数据库时加锁,保证单线程访问
永不过期:热点数据不过期,异步更新
序列化异常
统一序列化方式
确保实体类实现 Serializable 接口
九、总结
Spring Data Redis 提供了强大而灵活的 Redis 操作能力,通过模板类和注解简化了开发流程。合理使用 Redis 可以显著提升应用性能,但需要注意分布式环境下的一致性、并发控制等问题。
建议实践:
优先使用 JSON 序列化
为缓存设置合理的过期时间
对热点数据进行预加载
监控 Redis 性能指标(内存、QPS、命中率)
生产环境采用集群部署确保高可用

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

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

相关文章

免费版酒店押金原路退回系统——仙盟创梦IDE

项目介绍​东方仙盟开源酒店押金管理系统是一款面向中小型酒店、民宿、客栈的轻量级前台管理工具&#xff0c;专注于简化房态管理、订单处理和押金跟踪流程。作为完全开源的解决方案&#xff0c;它无需依赖任何第三方服务&#xff0c;所有数据存储在本地浏览器中&#xff0c;确…

10. isaacsim4.2教程-RTX Lidar 传感器

1. 前言RTX Lidar 传感器Isaac Sim的RTX或光线追踪Lidar支持通过JSON配置文件设置固态和旋转Lidar配置。每个RTX传感器必须附加到自己的视口或渲染产品&#xff0c;以确保正确模拟。重要提示&#xff1a; 在运行RTX Lidar仿真时&#xff0c;如果你在Isaac Sim UI中停靠窗口&…

QT6 源,七章对话框与多窗体(14)栈式窗体 QStackedWidget:本类里代码很少。举例,以及源代码带注释。

&#xff08;1&#xff09;这不是本章节要用到的窗体组件&#xff0c;只是跟着标签窗体 QTabWidget 一起学了。这也是 QT 的 UI 界面里的最后几个容器了。而且本类也很简单。就了解一下它。 本类的继承关系如下 &#xff1a; UI 设计界面 &#xff1a;运行效果 &#xff1a;&…

魔百和M401H_国科GK6323V100C_安卓9_不分地区免拆卡刷固件包

魔百和M401H_国科GK6323V100C_安卓9_不分地区免拆卡刷固件包刷机说明&#xff1a;1&#xff0c;进机顶盒设置&#xff08;密码10086&#xff09;&#xff0c;在其他里&#xff0c;一直按左键约32下&#xff0c;打开调试模式2&#xff0c;进网络设置&#xff0c;查看IP地址。3&a…

MySQL基础02

一. 函数在 MySQL 中&#xff0c;函数是用于对数据进行特定处理或计算的工具&#xff0c;根据作用范围和返回结果的不同&#xff0c;主要分为单行函数和聚合函数&#xff08;又称分组函数&#xff09;。以下是详细介绍&#xff1a;1.单行函数单行函数对每一行数据单独处理&…

LabVIEW 视觉检测SIM卡槽

针对SIM 卡槽生产中人工检测效率低、漏检误检率高的问题&#xff0c;设计了基于 LabVIEW 机器视觉的缺陷检测系统。该系统通过光学采集与图像处理算法&#xff0c;实现对卡槽引脚折弯、变形、漏铜等缺陷的自动检测&#xff0c;误报率为 0&#xff0c;平均检测时间小于 750ms&am…

RocketMQ5.3.1的安装

1、下载安装 RocketMQ 的安装包分为两种&#xff0c;二进制包和源码包。1 下载 Apache RocketMQ 5.3.1的源码包后上传到linux https://dist.apache.org/repos/dist/release/rocketmq/5.3.1/rocketmq-all-5.3.1-source-release.zip2 解压编译 $ unzip rocketmq-all-5.3.1-source…

FunASR实时多人对话语音识别、分析、端点检测

核心功能&#xff1a;FunASR是一个基础语音识别工具包&#xff0c;提供多种功能&#xff0c;包括语音识别&#xff08;ASR&#xff09;、语音端点检测&#xff08;VAD&#xff09;、标点恢复、语言模型、说话人验证、说话人分离和多人对话语音识别等。FunASR提供了便捷的脚本和…

opencv--day01--opencv基础知识及基础操作

文章目录前言一、opencv基础知识1.opencv相关概念1.1背景1.2特点1.3主要功能与应用1.4.opencv-python2.计算机中的图像概念2.1图像表示2.2图像存储彩色图像二、opencv基础操作1.图像的读取2.图像的显示3.保存图像4.创建黑白图及随机像素彩图5. 图像切片&#xff08;图片剪裁&am…

如何撤销Git提交误操作

要撤销在主分支上的 git add . 和 git commit 操作&#xff0c;可以按照以下步骤安全回退&#xff1a; 完整回退步骤&#xff1a; # 1. 查看提交历史&#xff0c;确认要回退的commit git log --oneline# 示例输出&#xff1a; # d3f4g7h (HEAD -> main) 误操作提交 # a1b2c3…

React+Three.js实现3D场景压力/温度/密度分布可视化

本文介绍了一个基于React和Three.js的3D压力可视化解决方案&#xff0c;该方案能够&#xff1a; 加载并渲染3D压力模型数据 提供动态颜色映射功能&#xff0c;支持多种颜色方案&#xff1a;彩虹-rainbow,冷暖-cooltowarm,黑体-blackbody,灰度-grayscale 实现固定位置的颜色图…

Go 官方 Elasticsearch 客户端 v9 快速上手与进阶实践*

1、为什么选择 go-elasticsearch&#xff1f; 版本同步&#xff1a;与 Elasticsearch 主版本保持一一映射&#xff0c;当前稳定分支为 v9&#xff0c;对应 ES 9.x 系列。(GitHub)完全覆盖 REST API&#xff1a;所有 HTTP 端点都有等价方法&#xff0c;避免手写 JSON/HTTP。可插…

`/etc/samba/smb.conf`笔记250720

/etc/samba/smb.conf笔记250720 /etc/samba/smb.conf 是 Samba 服务的核心配置文件&#xff0c;用于实现 Linux/Unix 与 Windows 系统间的文件和打印机共享。以下详解其结构和常用参数&#xff1a; 配置文件结构 1. 全局设置段 [global] 控制 Samba 服务器的整体行为。 …

Java从入门到精通!第十六天,重点!(多线程和线程池)

一、多线程1&#xff0e;基本概念&#xff08;1&#xff09;程序&#xff08;Program&#xff09;&#xff1a;为了完成特定的任务&#xff0c;用某种计算机语言编写的一组指令的集合&#xff0c;即指一段静态的代码&#xff08;源代码经编译之后形成的二进制格式的文件&#x…

轨道交通为什么要有信号系统?

轨道交通为什么要有信号系统&#xff1f;轨道交通信号系统与公路信号系统有什么不同&#xff1f; 在轨道交通中信号系统是必不可少的&#xff0c;其根本原因在于&#xff1a;在轨道交通中已经没有办法纯靠人力去保证行车安全。 在公路交通中&#xff0c;信号其实是起辅助作用的…

docker 挂载卷

以下是针对您遇到的问题分步解答和解决方案&#xff1a;一、核心结论 ✅ 可以采用目录方式&#xff1a;您的命令中的 -v /root/nginx05-vol/:/usr/share/nginx/html/ 是正确的目录挂载语法。 ❌ 看不到新文件的可能原因主要集中在 权限问题、缓存机制 或 操作顺序错误 上。二、…

uniapp 报错 Not found ... at view.umd.min.js:1的问题

问题描述&#xff1a; uniapp的app中&#xff0c;当页面中使用多个v-if后会出现这个报错解决方案&#xff1a; 1、在v-if的地方加上key属性&#xff08;key属性要保证唯一&#xff09; 2、用v-show替换v-if&#xff08;不建议&#xff0c;可能会影响业务&#xff09;

水电站自动化升级:Modbus TCP与DeviceNet的跨协议协同应用

水电站的自动化系统就像一个精密的“神经中枢”&#xff0c;既要应对水流变化带来的动态负载&#xff0c;又得保证闸门启闭、水轮机调节等关键动作的精准性。我们去年参与的某水电站改造项目里&#xff0c;就遇到了一个典型问题&#xff1a;中控室的施耐德PLC采用Modbus TCP协议…

基于Matlab图像处理的火灾检测系统设计与实现

随着计算机视觉技术的快速发展&#xff0c;基于图像处理的火灾检测系统在安全监控领域的应用得到了广泛关注。本文提出了一种基于图像处理的火灾检测系统&#xff0c;该系统通过对图像进行预处理、颜色空间转换、阈值化处理和形态学分析&#xff0c;自动检测火灾疑似区域。首先…

信息学奥赛一本通 1593:【例 2】牧场的安排 | 洛谷 P1879 [USACO06NOV] Corn Fields G

【题目链接】 ybt 1593&#xff1a;【例 2】牧场的安排 洛谷 P1879 [USACO06NOV] Corn Fields G 【题目考点】 1. 状压动规 【解题思路】 集合状态&#xff1a;n个元素中&#xff0c;选择x个元素构成的集合&#xff0c;可以由一个n位二进制数表示。第i位为1表示选择第i个元…