官方地址: https://docs.spring.io/spring-data/redis/docs/2.3.4.RELEASE/reference/html/#reference
RedisConfig
@Configuration public class RedisConfig { @Bean public JedisConnectionFactory redisConnectionFactory() { JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(); jedisConnectionFactory.setHostName("172.16.2.134"); jedisConnectionFactory.setPort(6379); jedisConnectionFactory.setPassword("123456"); jedisConnectionFactory.setDatabase(1); return jedisConnectionFactory; } @Bean public RedisTemplate redisTemplate(JedisConnectionFactory jedisConnectionFactory){ RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(jedisConnectionFactory); return redisTemplate; } }数据在进行redis内存存储之前程序自动调用了java的序列化机制,因此在软件中显示的可能就是序列化后的数据,不利于阅读,因此为了可读性,需要指定序列化机制, 对于除了hash之外的数据设置: redisTemplate.setKeySerializer(new StringRedisSerializer())和redisTemplate.setValueSerializer(new StringRedisSerializer()) 对于Hash类型数据可以设置: redisTemplate.setKeySerializer(new StringRedisSerializer()) redisTemplate.setHashKeySerializer(new StringRedisSerializer())和redisTemplate.setValueSerializer(new StringRedisSerializer()) 对于不是String类型的数据需要使用Jackson序列化进行 redisTemplate1.setValueSerializer(new Jackson2JsonRedisSerializer(Integer.class));
显示结果是: value显示没问题,但key值显示有问题,原因是String类型进行了java的序列化操作 解决方法: 在进行操作前设置redisTemplate.setKeySerializer(new StringRedisSerializer());或者在开发配置类中设置
显示结果:
解决方法: redisTemplate.setKeySerializer(new StringRedisSerializer());解决key的问题 redisTemplate.setValueSerializer(new StringRedisSerializer());解决value的问题
@SpringBootApplication public class DemoApplication { @Autowired private RedisTemplate redisTemplate; public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } //在程序启动后自动运行这段程序 @Bean CommandLineRunner commandLineRunner(){ //java8Stream新特性 return (args ->{ redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new StringRedisSerializer()); ListOperations listOperations = redisTemplate.opsForList(); listOperations.leftPushAll("aaa","1","2","3","4"); } ); } }序列化设置
redisTemplate.setKeySerializer(new StringRedisSerializer()); //设置的是key redisTemplate.setHashKeySerializer(new StringRedisSerializer()); //设置的是hash中字段 redisTemplate.setHashValueSerializer(new StringRedisSerializer()); //设置的是hash中的value操作类
@SpringBootApplication public class DemoApplication { @Autowired private RedisTemplate redisTemplate; public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } //在程序启动后自动运行这段程序 @Bean CommandLineRunner commandLineRunner(){ //java8Stream新特性 return (args ->{ redisTemplate.setKeySerializer(new StringRedisSerializer()); //设置的是key redisTemplate.setHashKeySerializer(new StringRedisSerializer()); //设置的是hash中字段 redisTemplate.setHashValueSerializer(new StringRedisSerializer()); //设置的是hash中的value HashOperations hashOperations = redisTemplate.opsForHash(); hashOperations.put("Hash","h1","value1"); } ); } }同样设置key和value的序列化
@SpringBootApplication public class DemoApplication { @Autowired private RedisTemplate redisTemplate; public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } //在程序启动后自动运行这段程序 @Bean CommandLineRunner commandLineRunner(){ //java8Stream新特性 return (args ->{ redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new StringRedisSerializer()); SetOperations setOperations = redisTemplate.opsForSet(); setOperations.add("set1","1","2","2","3"); } ); } }当存入的数据不是String 类型时需要使用Jackson序列化机制
@SpringBootApplication public class DemoApplication { @Autowired private RedisTemplate redisTemplate; @Autowired private RedisTemplate redisTemplate1; public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } //在程序启动后自动运行这段程序 @Bean CommandLineRunner commandLineRunner(){ //java8Stream新特性 return (args ->{ redisTemplate.setKeySerializer(new StringRedisSerializer()); ZSetOperations zSetOperations = redisTemplate.opsForZSet(); //使用Jackson序列化,并指定类型 redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Integer.class)); zSetOperations.add("zset1",30,100); } ); } }没使用 Jackson的现象
设置后
当使用上面的方式在新增时才进行key和value的序列化操作,在进行删除时会返回空值, 原因是存储时使用了自定义序列化的redisTemplate对象,但在删除时默认使用的是jdk的序列化对象,并且这个时候再自定义序列化对象时是不起作用的。 解决方法是:在自定义的配置类中就进行序列化指定,后续使用的都是同一个对象。
@Configuration public class RedisConfig { @Bean public JedisConnectionFactory redisConnectionFactory() { JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(); jedisConnectionFactory.setHostName("172.16.2.134"); jedisConnectionFactory.setPort(6379); jedisConnectionFactory.setPassword("123456"); jedisConnectionFactory.setDatabase(1); return jedisConnectionFactory; } @Bean public RedisTemplate redisTemplate (JedisConnectionFactory jedisConnectionFactory){ RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(jedisConnectionFactory); redisTemplate.setKeySerializer(new StringRedisSerializer()); //设置的是key redisTemplate.setHashKeySerializer(new StringRedisSerializer()); //设置的是hash中字段 redisTemplate.setHashValueSerializer(new StringRedisSerializer()); //设置的是hash中的value return redisTemplate; } }定义一个实体类,需要实现Serializable 接口,可序列化
@Data @AllArgsConstructor public class Student implements Serializable { private String name; private Integer age; }测试
@SpringBootApplication public class DemoApplication { @Autowired private RedisTemplate redisTemplate; @Autowired private RedisTemplate redisTemplate1; public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } //在程序启动后自动运行这段程序 @Bean CommandLineRunner commandLineRunner(){ //java8Stream新特性 return (args ->{ redisTemplate.setKeySerializer(new StringRedisSerializer()); ListOperations listOperations = redisTemplate.opsForList(); redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class)); listOperations.leftPush("student.1",new Student("张三",30)); } ); } }没有redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));时显示:
有redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));时显示: