Spring Data如何与Redis一起使用

在NoSql解决方案领域,Redis(远程字典服务器)应该被视为老人。这篇文章是关于Spring Data如何使用它的。之所以写这篇文章是因为Redis与通常的数据库不太相似,它支持不方便用于存储对象(缓存不计数)和搜索某些字段的数据类型。在这里,通过示例,我将尝试通过熟悉的CrudRepository和QueryDSL来描述Spring Data如何使用它。这不是HowTo的示例,它有很多。谁对内部感兴趣的人走得更远。

这些示例将基于一个简单的项目Redis出现在docker容器中,该容器是一个弹簧启动应用程序,也可以在容器中与其通信。该应用程序包含一个简单的模型,存储库,服务和控制器。您可以通过在localhost:8080上大摇大摆来触摸所有这些内容。

除了服务执行到数据库的命令之外,我还将提供一个小的伪代码,可以更清楚地描述正在发生的事情。



我们将与学生实体合作

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

在这里,有必要澄清一下,注释@RedisHash("Student")说明所有实体都将在该密钥下聚合。

让我们保持第一个学生:

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

执行了3条命令:

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



缺点是要搜索的字段@Indexed从一开始就必须带有注释否则,将仅为添加此注释后保留的要素创建“索引”是的,我知道Redis并不是满足此类需求的最佳解决方案,但是如果由于某种情况而有必要使用它,那么SpringData将能够很好地做到这一点。




All Articles