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);
    }
}
复制代码

结果:

 

通常来说使用的是第二种序列化和反序列化方法。

posted @   无火祭祀场  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示