Redis详解
Redis配置yml
spring: redis: host: 82.157.248.243 #host地址 port: 6379 #地址端口号 password: #密码 database: #redis数据库索引(默认为0) timeout: #redis连接超时时间(单位毫秒) lettuce: pool: #redis连接池配置 max-wait: 1000ms #从连接池中获取最大等待时间(默认为-1,单位为毫秒,负数表无限) max-active: 8 #最大可用连接数(默认为8,负数表无限) min-idle: 0 #最小空闲连接数(默认为0,负数表无限) max-idle: 8 #最大空闲连接数(默认为8,负数表无限)
RedisTemplate 使用方式一:
RedisConfig配置类
@Configuration public class RedisConfig { @Bean public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){ //创建RedisTemplate对象 RedisTemplate<String,Object> template = new RedisTemplate<>(); //设置连接工厂 template.setConnectionFactory(connectionFactory); //创建JSON序列化工具 GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); //设置key的序列化 template.setKeySerializer(RedisSerializer.string()); template.setHashValueSerializer(RedisSerializer.string()); //设置value的序列化 template.setValueSerializer(jsonRedisSerializer); template.setHashValueSerializer(jsonRedisSerializer); //返回 return template; } }
测试使用
@SpringBootTest class Demo5ApplicationTests { @Autowired private RedisTemplate<String,Object> redisTemplate; @Test void contextLoads() { //写入一条String数据 redisTemplate.opsForValue().set("name","虎哥"); //获取String数据 System.out.println(redisTemplate.opsForValue().get("name")); } @Test void testSaveUser(){ // 写入数据 redisTemplate.opsForValue().set("user:100",new User("刀哥",23)); System.out.println(redisTemplate.opsForValue().get("user:100")); } }
测试结果
尽管JSON的序列化可以满足我们的需求,但依然存在一些问题即,为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型(也就是上图中的“@class属性”)写入json结果中,存入Redis,会带来额外的内存开销。
StringRedisTemplate 常用方式
为了节省内存空间,并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储java对象时,手动完成对象的序列化和反序列化。
Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认方式就是String方式。省去了我们自定义RedisTemolate的过程:
@SpringBootTest class RedisStringTest { @Autowired private StringRedisTemplate stringRedisTemplate; @Test void contextLoads() { //写入一条String数据 stringRedisTemplate.opsForValue().set("name2","虎哥"); //获取String数据 System.out.println(stringRedisTemplate.opsForValue().get("name")); } private static final ObjectMapper mapper = new ObjectMapper(); @Test void testSaveUser() throws JsonProcessingException { // 创建对象 User user = new User("虎哥", 21); //手动序列化 String json= mapper.writeValueAsString(user); // 写入数据 stringRedisTemplate.opsForValue().set("user:101",json); String s = stringRedisTemplate.opsForValue().get("user:101"); //手动反序列化 User user1 = mapper.readValue(s, User.class); System.out.println(user1); } }
结果:
通常来说使用的是第二种序列化和反序列化方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App