当前位置: 首页 > news >正文

springboot使用redisTemplate的方法,详细说明

1. 添加依赖

pom.xml中添加Spring Data Redis依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  • 说明:该依赖集成了Redis客户端(默认使用Lettuce)和RedisTemplate工具类。

2. 配置Redis连接信息

application.yml中配置Redis服务器信息:

spring:redis:host: localhost        # Redis服务器地址port: 6379             # Redis服务器端口password: yourpassword # Redis密码(如果有)database: 0            # 使用的数据库索引(0-15)timeout: 3000ms        # 连接超时时间lettuce:               # 使用Lettuce客户端(默认)pool:max-active: 8      # 最大连接数max-wait: -1ms     # 最大等待时间max-idle: 8        # 最大空闲连接min-idle: 0        # 最小空闲连接

3. 配置RedisTemplate

Spring Boot默认提供了StringRedisTemplate(键值对为字符串),但通常需要自定义RedisTemplate以支持对象序列化。

3.1 自定义RedisTemplate配置
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);// 设置Key的序列化方式template.setKeySerializer(new StringRedisSerializer());// 设置Value的序列化方式(JSON格式)template.setValueSerializer(new GenericJackson2JsonRedisSerializer());// 设置HashKey的序列化方式template.setHashKeySerializer(new StringRedisSerializer());// 设置HashValue的序列化方式template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());template.afterPropertiesSet();return template;}
}
  • 序列化说明
    • StringRedisSerializer:将键值序列化为字符串。
    • GenericJackson2JsonRedisSerializer:将对象序列化为JSON格式,支持泛型和复杂对象。

4. RedisTemplate常用操作

RedisTemplate提供了多种操作接口,对应Redis的不同数据结构。

4.1 操作字符串(String)
@Autowired
private RedisTemplate<String, Object> redisTemplate;public void operateString() {// 存储值(永久有效)redisTemplate.opsForValue().set("name", "张三");// 存储值(带过期时间)redisTemplate.opsForValue().set("age", 20, 10, TimeUnit.SECONDS);// 获取值String name = (String) redisTemplate.opsForValue().get("name");Integer age = (Integer) redisTemplate.opsForValue().get("age");// 递增/递减(适用于数值类型)redisTemplate.opsForValue().increment("counter", 1);
}
4.2 操作哈希(Hash)
public void operateHash() {HashOperations<String, String, Object> hashOps = redisTemplate.opsForHash();// 存储HashhashOps.put("user:1", "name", "李四");hashOps.put("user:1", "age", 25);// 获取单个字段String username = (String) hashOps.get("user:1", "name");// 获取整个HashMap<String, Object> user = hashOps.entries("user:1");// 获取所有字段名和值Set<String> keys = hashOps.keys("user:1");List<Object> values = hashOps.values("user:1");
}
4.3 操作列表(List)
public void operateList() {ListOperations<String, Object> listOps = redisTemplate.opsForList();// 左插入(栈结构)listOps.leftPush("tasks", "task1");listOps.leftPushAll("tasks", "task2", "task3");// 右插入(队列结构)listOps.rightPush("tasks", "task4");// 获取列表范围List<Object> tasks = listOps.range("tasks", 0, -1);// 弹出元素Object task = listOps.leftPop("tasks");
}
4.4 操作集合(Set)
public void operateSet() {SetOperations<String, Object> setOps = redisTemplate.opsForSet();// 添加元素setOps.add("fruits", "apple", "banana", "cherry");// 获取所有元素Set<Object> fruits = setOps.members("fruits");// 判断元素是否存在boolean exists = setOps.isMember("fruits", "apple");// 移除元素setOps.remove("fruits", "banana");
}
4.5 操作有序集合(ZSet)
public void operateZSet() {ZSetOperations<String, Object> zSetOps = redisTemplate.opsForZSet();// 添加元素(带分数,用于排序)zSetOps.add("ranking", "player1", 100);zSetOps.add("ranking", "player2", 200);zSetOps.add("ranking", "player3", 150);// 获取排名(从小到大)Set<Object> ranking = zSetOps.range("ranking", 0, -1);// 获取分数Double score = zSetOps.score("ranking", "player2");// 增加分数zSetOps.incrementScore("ranking", "player1", 50);
}

5. 高级功能

5.1 事务操作
public void transactionExample() {redisTemplate.execute(new SessionCallback<Object>() {@Overridepublic <K, V> Object execute(RedisOperations<K, V> operations) throws DataAccessException {operations.multi(); // 开启事务operations.opsForValue().set((K) "tx-key1", (V) "value1");operations.opsForValue().set((K) "tx-key2", (V) "value2");return operations.exec(); // 执行事务}});
}
5.2 管道操作(批量执行)
public void pipelineExample() {List<Object> results = redisTemplate.executePipelined(new RedisCallback<Object>() {@Overridepublic Object doInRedis(RedisConnection connection) throws DataAccessException {StringRedisConnection stringConn = (StringRedisConnection) connection;for (int i = 0; i < 1000; i++) {stringConn.set("key:" + i, "value:" + i);}return null;}});
}
5.3 发布订阅
// 发布消息
public void publishMessage(String channel, String message) {redisTemplate.convertAndSend(channel, message);
}// 订阅消息(需配置Listener)
@Component
public class RedisMessageListener implements MessageListener {@Overridepublic void onMessage(Message message, byte[] pattern) {String channel = new String(message.getChannel());String content = new String(message.getBody());System.out.println("收到消息: " + content + " from channel: " + channel);}
}
5.4 分布式锁
public void distributedLockExample() {String lockKey = "resource-lock";Boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, "locked", 30, TimeUnit.SECONDS); // 原子操作if (locked) {try {// 执行需要加锁的业务逻辑} finally {redisTemplate.delete(lockKey); // 释放锁}}
}

6. 对象序列化与反序列化

存储自定义对象时,确保对象实现Serializable接口,并使用JSON序列化:

6.1 实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {private static final long serialVersionUID = 1L;private String id;private String name;private Integer age;
}
6.2 存储和读取对象
public void saveAndGetUser() {User user = new User("1", "王五", 30);// 存储对象redisTemplate.opsForValue().set("user:1", user);// 读取对象User result = (User) redisTemplate.opsForValue().get("user:1");
}

7. 常见问题与优化

7.1 序列化性能问题
  • JSON序列化比JDK原生序列化更高效,但需注意循环引用问题。
  • 对性能敏感的场景,可使用ProtostuffKryo替代JSON序列化。
7.2 连接池配置
spring:redis:lettuce:pool:max-active: 100  # 最大连接数max-wait: 1000ms # 获取连接的最大等待时间max-idle: 20     # 最大空闲连接min-idle: 5      # 最小空闲连接
7.3 异常处理
try {// Redis操作
} catch (RedisConnectionFailureException e) {// 处理连接失败log.error("Redis连接失败", e);
} catch (RedisSystemException e) {// 处理系统异常log.error("Redis系统异常", e);
}

8. 与缓存注解结合(@Cacheable)

Spring Cache抽象提供了@Cacheable@CacheEvict等注解,可与Redis集成:

@Service
public class UserService {@Cacheable(value = "users", key = "#id")public User getUser(String id) {// 从数据库查询return userRepository.findById(id);}@CacheEvict(value = "users", key = "#id")public void deleteUser(String id) {// 删除用户userRepository.deleteById(id);}
}
http://www.dtcms.com/a/264445.html

相关文章:

  • 以智能楼宇自动化控制系统为基石,构筑绿色建筑节能增效新标杆
  • cmake笔记
  • 【分明集合】特征函数、关系与运算
  • 【格与代数系统】格与哈斯图
  • 笨方法学python-习题12
  • Sql注入中万能密码order by联合查询利用
  • 应急响应类题练习——玄机第四章 windows实战-emlog
  • Foundation 5 安装使用教程
  • SQL SELECT 语句
  • 在线租房平台源码+springboot+vue3(前后端分离)
  • 应急响应类题练习——玄机第五章 Windows 实战-evtx 文件分析
  • 6.Docker部署ES+kibana
  • Vite 7.0 与 Vue 3.5:前端开发的性能革命与功能升级
  • 【环境配置】Neo4j Community Windows 安装教程
  • HDMI 2.1 FRL协议的流控机制:切片传输(Slicing)和GAP插入
  • LL面试题11
  • 10授权
  • Vue 3 中的 `h` 函数详解
  • Rust征服字节跳动:高并发服务器实战
  • 飞算智造JavaAI:智能编程革命——AI重构Java开发新范式
  • Windows10/11 轻度优化 纯净版,12个版本!
  • 深度学习常见的激活函数
  • 【Python基础】11 Python深度学习生态系统全景解析:从基础框架到专业应用的技术深度剖析(超长版,附多个代码及结果)
  • 【深度学习1】ModernBert学习
  • RNN和LSTM
  • [面试] 手写题-防抖,节流
  • Python应用指南:利用高德地图API获取公交+地铁可达圈(三)
  • 菜谱大全——字符串处理艺术:从文本解析到高效搜索 [特殊字符][特殊字符]
  • 锂离子电池均衡拓扑综述
  • 阶段二JavaSE进阶阶段之多态、关键字、抽象类 2.3