Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to get result from the Redis using Crud Repository in Spring Boot?

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)

enter image description here

like image 797
Jeff Cook Avatar asked Nov 02 '18 15:11

Jeff Cook


People also ask

How Redis works in spring boot?

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.

Is RedisTemplate thread safe?

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.

What is the use of @RedisHash?

@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.


1 Answers

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"
like image 78
Jeff Cook Avatar answered Oct 07 '22 19:10

Jeff Cook