Redis中使用RedisTemplate.set设置值后到客户端取不到值

本文探讨了使用RedisTemplate在Redis中设置值后,客户端无法获取的问题。问题根源在于RedisTemplate在set操作时,通过序列化器将键值对转化为字节数组存储。客户端需使用相同序列化方式才能正确获取。文章通过代码示例解释了这一现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题出现原因

     1、出现问题代码:

     

package com.hubena.redis.redistemplate;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.SessionCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {RedisConfiguration.class})
public class RedisTemplateTest {
	private static final Logger logger = LoggerFactory.getLogger(RedisTemplateTest.class);
	@Autowired
    RedisTemplate redisTemplate;
	
	
<think>我们使用Spring Data RedisRedisTemplate时,`redisTemplate.opsForValue().set(key, value)`方法将键对存储到Redis服务器中。 具体来说,RedisTemplate是Spring提供的一个用于操作Redis的工具类,它封装了与Redis服务器交互的细节。`opsForValue()`方法返回一个ValueOperations对象,该对象用于操作Redis的字符串(String)类型数据(尽管Redis的字符串类型可以包含多种类型的数据,但这里我们指的是最简单的键对存储)。 执行`set(key, value)`方法后,数据会被存储到Redis服务器中,具体存储的位置决于Redis服务器的配置(例如,内存中,并可能根据持久化策略保存到磁盘)。 关键点说明: 1. **存储位置**:数据存储在Redis服务器的内存中(默认情况下),Redis是一个内存数据库。 2. **持久化**:根据Redis的持久化配置(RDB快照或AOF日志),数据可能会被持久化到磁盘,以防止重启后数据丢失。 3. **序列化**:RedisTemplate在存储前会将key和value序列化成字节数组。默认情况下,RedisTemplate使用JdkSerializationRedisSerializer,这要求存储的对象实现Serializable接口。但通常我们会更改序列化方式,例如使用StringRedisTemplate(针对字符串)或配置为JSON序列化。 示例代码: ```java // 假设已经配置了RedisTemplate @Autowired private RedisTemplate<String, Object> redisTemplate; public void setKeyValue(String key, Object value) { redisTemplate.opsForValue().set(key, value); } ``` 注意事项: - 确保Redis服务器已启动且连接配置正确(如host、port、password等)。 - 序列化方式需要匹配,否则可能出现读错误。 因此,这个操作将数据存储到了配置的Redis服务器中。 §§相关问题§§ 1. 如何配置RedisTemplate使用JSON序列化而不是默认的JDK序列化? 2.使用RedisTemplate存储数据时,如何设置键的过期时间? 3. RedisTemplate和StringRedisTemplate有什么区别? 4. 如果Redis服务器连接失败,执行set方法会抛出什么异常? 5. 如何确保Redis中存储的数据在服务器重启后不丢失?</think>在使用Spring Data Redis的`RedisTemplate`时,执行`redisTemplate.opsForValue().set(key, value)`会将数据存储到**Redis服务器**中。具体说明如下: --- ### 存储位置详解: 1. **Redis内存数据库** - 数据直接存储在Redis服务器的内存中(默认存储位置)。 - Redis是内存数据库,所有操作优先在内存中完成,因此读写速度极快(微秒级响应)。 2. **持久化位置(可选)** - 若配置了Redis持久化(如RDB快照或AOF日志): - **RDB模式**:定期将内存数据快照保存到磁盘文件(如`dump.rdb`)。 - **AOF模式**:实时记录操作命令到磁盘文件(如`appendonly.aof`)。 - 持久化配置由Redis服务器决定,与`set()`方法无关。 3. **数据分区(集群模式)** - 若使用Redis Cluster,数据根据键的哈希分配到不同节点(分片存储)。 --- ### 关键机制: - **序列化** `RedisTemplate`默认使用JDK序列化(需对象实现`Serializable`接口)。 例如存储`value`时: ```java redisTemplate.opsForValue().set("user:1001", new User("Alice", 25)); // User对象被序列化为字节 ``` 可通过配置更换序列化器(如JSON序列化): ```java redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(User.class)); ``` - **连接管理** 数据通过TCP连接发送到Redis服务器,连接池由`Lettuce`或`Jedis`客户端管理。 --- ### 验证数据存储: 1. **命令行查看** 在Redis CLI中执行: ```bash KEYS * # 查看所有键 GET <key> # 获字符串 ``` 2. **Spring代码验证** ```java Object value = redisTemplate.opsForValue().get("myKey"); System.out.println(value); // 输出存储的 ``` --- ### 注意事项: 1. **内存管理** Redis数据量受服务器内存限制,需监控内存使用(通过`INFO memory`命令)。 2. **网络延迟** 数据需从应用服务器传输到Redis服务器,网络质量影响性能。 3. **键的设计** 推荐使用命名空间(如`user:1001:profile`)避免键冲突。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值