Wie Spring Data mit Redis funktioniert

Redis (Remote Dictionary Server) gilt zu Recht als alter Mann in der Welt der NoSql-Lösungen. In diesem Beitrag geht es darum, wie Spring Data damit arbeitet. Die Idee, diesen Beitrag zu schreiben, entstand, weil Redis nicht ganz wie eine vertraute Datenbank ist, sondern Datentypen unterstützt, die nicht zum Speichern von Objekten (Cache zählt nicht) und zum Suchen nach bestimmten Feldern geeignet sind. Hier werde ich anhand von Beispielen versuchen zu beschreiben, wie Spring Data mit dem bekannten CrudRepository und QueryDSL damit arbeitet. Dies ist kein Beispiel für HowTo, von dem es viele gibt. Wer sich für das Innere interessiert, geht weiter.

Die Beispiele basieren auf einem einfachen Projekt . Redis steigt in einem Docker-Container auf, einer Spring-Boot-Anwendung, die auch im Container mit ihm kommuniziert. Die Anwendung enthält ein einfaches Modell, ein Repository, einen Service und einen Controller. Sie können dies alles durch Prahlerei auf localhost: 8080 berühren.

Zusätzlich zu den Befehlen, die der Dienst für die Datenbank ausführt, werde ich auch einen kleinen Pseudocode bereitstellen , der klarer beschreibt, was passiert.



Wir werden mit der Studenteneinheit zusammenarbeiten:

@Data
@AllArgsConstructor
@NoArgsConstructor
@RedisHash("Student")
public class Student {
    @Id
    private String id;
    private String name;
    private int age;
}

Hier muss klargestellt werden, dass in der Anmerkung angegeben ist @RedisHash("Student"), unter welchem ​​Schlüssel alle Entitäten aggregiert werden.

Versuchen wir, den ersten Schüler zu behalten:

curl -X POST "http://localhost:8080/save" -H  "accept: */*" -H  "Content-Type: application/json" -d "{\"id\":\"1\",\"name\":\"Stephen\",\"age\":12}"

3 Befehle wurden ausgeführt:

"DEL" "Student:1"
"HMSET" "Student:1" "_class" "com.odis.redisserviceweb.model.Student" "id" "1" "name" "Stephen" "age" "12"
"SADD" "Student" "1"

, - "DEL" "Student:1", "Student:1". @RedisHash + @Id.

"HMSET" "Student:1" "_class" "com.odis.redisserviceweb.model.Student" "id" "1" "name" "Stephen" "age" "12". "Student:1". -

Map "Student:1";
"Student:1".put("_class", "com.odis.redisserviceweb.model.Student");
"Student:1".put("id", "1");
"Student:1".put("name", "Stephen");
"Student:1".put("age", "12");

- "SADD" "Student" "1" - "Student" "1".

? Redis. - "Student:1", - "Student".

keys * - ( ) :

127.0.0.1:6379> keys *
1) "Student"
2) "Student:1"

, :

127.0.0.1:6379> type "Student"
set
127.0.0.1:6379> type "Student:1"
hash

- ? .

@Id :

curl -X GET "http://localhost:8080/get/1" -H  "accept: */*"

"Student:1" , :

"HGETALL" "Student:1"
1) "_class"
2) "com.odis.redisserviceweb.model.Student"
3) "id"
4) "1"
5) "name"
6) "Stephen"
7) "age"
8) "12"

, , :

curl -X POST "http://localhost:8080/save" -H  "accept: */*" -H  "Content-Type: application/json" -d "{\"id\":\"2\",\"name\":\"Macaulay\",\"age\":40}"
curl -X GET "http://localhost:8080/get" -H  "accept: */*"

3 :

"SMEMBERS" "Student"
1) "1"
2) "2"

"HGETALL" "Student:1"
1) "_class"
2) "com.odis.redisserviceweb.model.Student"
3) "id"
4) "1"
5) "name"
6) "Stephen"
7) "age"
8) "12"
127.0.0.1

"HGETALL" "Student:2"
1) "_class"
2) "com.odis.redisserviceweb.model.Student"
3) "id"
4) "2"
5) "name"
6) "Macaulay"
7) "age"
8) "40"

. - "Student" - , "Student:@Id". , O (N) N - .

:

curl -X DELETE "http://localhost:8080/delete/1" -H  "accept: */*"

:

"HGETALL" "Student:1"
1) "_class"
2) "com.odis.redisserviceweb.model.Student"
3) "id"
4) "1"
5) "name"
6) "Stephen"
7) "age"
8) "12"

"DEL" "Student:1"
(integer) 1

"SREM" "Student" "1"
(integer) 1

"SMEMBERS" "Student:1:idx"
(empty array)

"DEL" "Student:1:idx"
(integer) 0

, Id . "Student" "1".

Student:1:idx. . , . :

List<Student> findAllByName(String name);

:

curl -X POST "http://localhost:8080/save" -H  "accept: */*" -H  "Content-Type: application/json" -d "{\"id\":\"1\",\"name\":\"Stephen\",\"age\":12}"
curl -X GET "http://localhost:8080/get/filter/Stephen" -H  "accept: */*"

, Redis :

"SINTER" "Student:name:Stephen"
(empty array)

"SINTER" - , , - "Student:name:Stephen" .



, , @Id, @Indexed Spring Data , . . Redis . name :

@Data
@AllArgsConstructor
@NoArgsConstructor
@RedisHash("Student")
public class Student {
    @Id
    private String id;
    @Indexed
    private String name;
    private int age;
}

:

curl -X POST "http://localhost:8080/save" -H  "accept: */*" -H  "Content-Type: application/json" -d "{\"id\":\"1\",\"name\":\"Stephen\",\"age\":12}"

:

"DEL" "Student:1"
"HMSET" "Student:1" "_class" "com.odis.redisserviceweb.model.Student" "id" "1" "name" "Stephen" "age" "12"
"SADD" "Student" "1"
"SADD" "Student:name:Stephen" "1"
"SADD" "Student:1:idx" "Student:name:Stephen"

, : "Student:name:Stephen" , , @Indexed . Id . Id Stephen Id . , . - :

Map "Student:1";
"Student:1".put("_class", "com.odis.redisserviceweb.model.Student");
"Student:1".put("id", "1");
"Student:1".put("name", "Stephen");
"Student:1".put("age", "12");

Set "Student";
"Student".add("1");

Set "Student:name:Stephen";
"Student:name:Stephen".add("1");

Set "Student:1:idx";
"Student:1:idx".add("Student:name:Stephen");

, , Redis :

"SINTER" "Student:name:Stephen"
"HGETALL" "Student:1"

Id , . .

SINTER . id .

.

, Spring Data Redis. Spring.



Der Nachteil ist, dass die Felder, in denen die Suche durchgeführt wird, @Indexedvon Anfang an mit einer Anmerkung versehen werden müssen . Andernfalls werden "Indizes" nur für Features erstellt, die nach dem Hinzufügen dieser Anmerkung beibehalten werden. Und ja, ich verstehe, dass Redis nicht die beste Lösung für solche Anforderungen ist, aber wenn es aufgrund einer bestimmten Situation erforderlich ist, es zu verwenden, kann SpringData dies recht gut.




All Articles