SpringDataRedis原生使用

it2023-08-07  81

SpringDataRedis原生使用

官方地址: https://docs.spring.io/spring-data/redis/docs/2.3.4.RELEASE/reference/html/#reference

1.依赖导入

<!--依赖--> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--SpringData-redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--jedis--> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.3.0</version> </dependency>

2.开发配置类

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; } }

3.主配置类中进行操作

数据在进行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));

3.1操作String类型

@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 ->{ ValueOperations valueOperations = redisTemplate.opsForValue(); valueOperations.append("k3","value3"); } ); } }

显示结果是: value显示没问题,但key值显示有问题,原因是String类型进行了java的序列化操作 解决方法: 在进行操作前设置redisTemplate.setKeySerializer(new StringRedisSerializer());或者在开发配置类中设置

3.2操作List类型

@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 ->{ ListOperations listOperations = redisTemplate.opsForList(); listOperations.leftPushAll("aaa","1","2","3","4"); } ); } }

显示结果:

解决方法: 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"); } ); } }

3.3操作Hash类型

序列化设置

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"); } ); } }

3.4操作Set类型

同样设置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"); } ); } }

3.5操作Zset类型

当存入的数据不是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的现象

设置后

4.删除异常

当使用上面的方式在新增时才进行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; } }

5.实体存放

定义一个实体类,需要实现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));时显示:

最新回复(0)