I am developing Spring Boot + Redis example. I've taken a reference from link : https://www.baeldung.com/spring-data-redis-tutorial. In this example, I developed repository method Student findByNameAndGender(String name, Gender gender);
and even the Student findByName(String name);
, but I am not getting any result back on both cases.?
Any quick help? Redis query -
redis 127.0.0.1:6379> KEYS *
1) "Student"
2) "Student:bb4df14a-7f42-4fc3-b608-fc4b7d45109e"
3) "Student:69affaa4-e56c-49e3-9ef4-1cd7509d299b"
redis 127.0.0.1:6379>
Student.java
@Data
@AllArgsConstructor
@Builder
@NoArgsConstructor
@RedisHash("Student")
public class Student {
public enum Gender {
MALE, FEMALE
}
private String id;
private String name;
private Gender gender;
private int grade;
}
StudentRepository.java
@Repository
public interface StudentRepository extends CrudRepository<Student, String>{
Student findByNameAndGender(String name, Gender gender);
}
RedisConfig.java
@Configuration
@EnableRedisRepositories
public class RedisConfig {
@Bean
JedisConnectionFactory jedisConnectionFactory() {
return new JedisConnectionFactory();
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
final RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(jedisConnectionFactory());
template.setValueSerializer(new GenericToStringSerializer<Object>(Object.class));
return template;
}
}
SpringDataRedisEugenpApplication.java
@SpringBootApplication
public class SpringDataRedisEugenpApplication implements CommandLineRunner{
@Autowired
private StudentRepository repository;
public static void main(String[] args) {
SpringApplication.run(SpringDataRedisEugenpApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
repository.save(Student.builder().name("John").gender(Student.Gender.MALE).grade(1).build());
repository.save(Student.builder().name("Michael").gender(Student.Gender.MALE).grade(2).build());
Iterable<Student> students = repository.findAll();
for (Student student : students) {
System.out.println("=============================");
System.out.println("Details ? "+student.toString());
}
Student s = repository.findByNameAndGender("John", Student.Gender.MALE);
System.out.println("Student ="+s.toString()); //line-34
}
}
Error -
java.lang.IllegalStateException: Failed to execute CommandLineRunner
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:795) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:776) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1242) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1230) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at com.baeldung.SpringDataRedisEugenpApplication.main(SpringDataRedisEugenpApplication.java:19) [classes/:na]
Caused by: java.lang.NullPointerException: null
at com.baeldung.SpringDataRedisEugenpApplication.run(SpringDataRedisEugenpApplication.java:34) [classes/:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:792) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
... 5 common frames omitted
Few Queries -
1) How to see actual data stored in the redis?
2) How we can control Id to be started from one ?
edis 127.0.0.1:6379> get Student:1
(error) ERR Operation against a key holding the wrong kind of value
redis 127.0.0.1:6379> get Student:2
(error) ERR Operation against a key holding the wrong kind of value
redis 127.0.0.1:6379>
I am really struggling to see
redis 127.0.0.1:6379> mget Student:1
1) (nil)
redis 127.0.0.1:6379> mget Student:2
1) (nil)
redis 127.0.0.1:6379> mget Student
1) (nil)
Redis supports data structures such as strings, hashes, lists, sets, and sorted sets with range queries. The Spring Data Redis framework makes it easy to write Spring applications that use the Redis Key-Value store by providing an abstraction to the data store.
Once configured, the template is thread-safe and can be reused across multiple instances. RedisTemplate uses a Java-based serializer for most of its operations.
@RedisHash can take as parameters a timeToLive of type Long, and a String value, which will override the default Redis key prefix (by default, the key prefix is the fully qualified name of the class plus a colon). Within the class, most of the usual Spring Data annotations are supported.
I myself able to figure out answers to below questions.
You just need to put the @Index
annotation at the field level. @Index
annotions marks the property as for indexing which uses Redis {@literal SET} to keep track of for objects with matching values.
@Indexed
private String name;
@Ref: https://scalegrid.io/blog/introduction-to-redis-data-structures-hashes/
1) How to see actual data stored in the redis?
redis 127.0.0.1:6379> hgetall Student:1
1) "_class"
2) "com.baeldung.spring.data.redis.model.Student"
3) "id"
4) "1"
5) "name"
6) "John Doe"
7) "gender"
8) "MALE"
9) "grade._class"
10) "java.lang.Integer"
11) "grade"
12) "1"
redis 127.0.0.1:6379> hgetall Student:2
1) "_class"
2) "com.baeldung.spring.data.redis.model.Student"
3) "id"
4) "2"
5) "name"
6) "Michael Harford"
7) "gender"
8) "MALE"
9) "grade._class"
10) "java.lang.Integer"
11) "grade"
12) "2"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With