@Indexed๋?
@Indexed๋ Spring Data Redis ๋ชจ๋์ ์ฃผ์ ์ด๋ ธํ ์ด์ ์ค ํ๋์ ๋๋ค. ์ฃผ ๋ชฉ์ ์ผ๋ก๋ Redis์ ๋ณด์กฐ ์ธ๋ฑ์ค(Secondary Index) ์์ฑ์ ์ฌ์ฉ๋๋ฉฐ, @Id๊ฐ ๋ถ์ฌ์ง ๊ฐ์ฒด ์ธ์๋ @Indexed๊ฐ ๋ถ์ฌ์ง ๊ฐ์ฒด๋ก๋ ๊ฐ์ ์กฐํํ ์ ์๊ฒ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์๋์ ์ฝ๋์์๋ id๋ฟ๋ง ์๋๋ผ name์ผ๋ก๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
@RedisHash("Person")
public class Person {
@Id
private String id;
@Indexed
private String name;
private int age;
}
์์
ํ๋ฒ Person("dkswnkk", "JuHyeong", 26)์ ์ ์ฅํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
@Indexed ์์ด ์ ์ฅํ ๊ฒฝ์ฐ
@RedisHash("Person")
public class Person {
@Id
private String id;
private String name;
private int age;
}
Redis ๋ก๊ทธ
"HMSET" "Person:dkswnkk" "_class" "com.example.test.Person" "age" "26" "id" "dkswnkk" "name" "JuHyeong"
@Indexed๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅํ ๊ฒฝ์ฐ
@RedisHash("Person")
public class Person {
@Id
private String id;
@Indexed
private String name;
private int age;
}
Redis ๋ก๊ทธ
"HMSET" "Person:dkswnkk" "_class" "com.example.test.Person" "age" "26" "id" "dkswnkk" "name" "JuHyeong"
"SADD" "Person:name:JuHyeong" "dkswnkk"
"SADD" "Person:dkswnkk:idx" "Person:name:JuHyeong"
๋ก๊ทธ์์ ๋ณผ ์ ์๋ฏ, "Person:name:JuHyeong" "dkswnkk"๋ฅผ ๋ณด๋ฉด ๋ณด์กฐ ์ธ๋ฑ์ค๊ฐ ์ค์ ๋ก ์ ์ฅ๋์์์ ์ ์ ์๊ณ , Redis์์ ๊ฐ์ฒด์ CRUD ์์
์ ์ํํ ๋ ๊ด๋ จ๋ ๋ณด์กฐ ์ธ๋ฑ์ค๋ ํจ๊ป ์
๋ฐ์ดํธํด์ผ ํ๊ธฐ์ ์ถ๊ฐ์ ์ธ Redis ๋ช
๋ น์ด๊ฐ ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ฃผ์์
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ Time to Live(TTL) ์ค์ ์์ ๋๋ค. Redis์์ TTL์ ํน์ ํค์ ๋ํ ๋ง๋ฃ ์๊ฐ์ ์ค์ ํ๋ ๊ธฐ๋ฅ์ผ๋ก ์ค์ ๋ ์๊ฐ์ด ์ง๋๋ฉด ํด๋น ํค์ ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ ์๋์ผ๋ก ์ญ์ ๋ฉ๋๋ค. ํ์ง๋ง @Indexed๋ก ์์ฑ๋ ๋ณด์กฐ ์ธ๋ฑ์ค๋ ํด๋น ๋ฐ์ดํฐ์ TTL์ด ๋ง๋ฃ๋๋๋ผ๋ ์๋์ผ๋ก ์ญ์ ๊ฐ ๋์ง ์์ต๋๋ค.
๋๋ฌธ์ ์ด๋ฅผ ์ธ์งํ์ง ๋ชปํ๊ณ ์ญ์ ํ์ง ์๋๋ค๋ฉด, ๋ถํ์ํ ๋ณด์กฐ ์ธ๋ฑ์ค ๋ฐ์ดํฐ๊ฐ Redis์ ๊ณ์ ๋จ๊ฒ ๋์ด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น์ ์๋ชป๋ ์กฐํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
์ค์ ๋ก ํ ์คํธ๋ฅผ ํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
[Person ๊ฐ์ฒด ์ ์ฅ]
"HMSET" "Person:dkswnkk" "_class" "com.example.test.Person" "age" "26" "id" "dkswnkk" "name" "JuHyeong"
"SADD" "Person:name:JuHyeong" "dkswnkk"
"SADD" "Person:dkswnkk:idx" "Person:name:JuHyeong"
[TTL 10์ด๋ก ์ค์ ]
"EXPIRE" "Person:dkswnkk" "10"
[10์ด ํ ํ์ธ]
"Person:name:JuHyeong"
"Person:dkswnkk:idx"
๋ก๊ทธ๋ฅผ ๋ณด๋ฉด 10์ด ํ, "Person:dkswnkk" ๋ฐ์ดํฐ๋ ์ ์์ ์ผ๋ก ์ญ์ ๋์์ง๋ง, "Person:name:JuHyeong"์ "Person:dkswnkk:idx"์ ๊ด๋ จ๋ ๋ณด์กฐ ์ธ๋ฑ์ค ๊ฐ๋ค์ ์ฌ์ ํ ๋จ์์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์์ธ์ @Indexed ๊ธฐ๋ฅ์ด Redis์์ ์์ฒด์ ์ผ๋ก ์ง์ํ๋ ๊ธฐ๋ฅ์ด ์๋๋ผ, Spring Data Redis์์ ์ ๊ณตํ๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ๋ผ์ Redis์ TTL์ด ๋ง๋ฃ๋ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์ญ์ ํ๋ ๊ธฐ๋ฅ์, Spring Data Redis์ @Indexed๋ก ์์ฑ๋ ๋ณด์กฐ ์ธ๋ฑ์ค๊น์ง ์ญ์ ํ๋ ๊ณผ์ ์ด ํฌํจ๋์ด์์ง ์์ ์ญ์ ๊ฐ ๋์ง ์๋ ๊ฒ์
๋๋ค.
ํด๊ฒฐ๋ฐฉ์
Redis์ Key Space Notifications ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด, TTL์ด ๋ง๋ฃ๋๋ ์์ ์ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ , ๋ณด์กฐ์ธ๋ฑ์ค๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
@Configuration
@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)
public class RedisConfig {
//... Configuration details
}
์์ ๊ฐ์ด @EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)๋ฅผ Redis Config ๋ถ๋ถ์ ๋ช ์ํด ์ฃผ๋ฉด Redis์ Key Space Notifications ๊ธฐ๋ฅ์ด ํ์ฑํ๋ฉ๋๋ค.
Spring Data Redis๋ ์ด Key Space Notifications ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ TTL ๋ง๋ฃ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ , ์ด๋ฅผ ํตํด @Indexed๋ก ์ง์ ๋ ๋ณด์กฐ ์ธ๋ฑ์ค๋ฅผ ํจ๊ป ์ญ์ ํฉ๋๋ค.
๋์ ์๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- enableKeyspaceEvents ์ต์ ์ด ON_STARTUP์ผ๋ก ์ค์ ๋๋ฉด, Spring Data Redis๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ ๋ Redis์ Key Space Notifications ๊ธฐ๋ฅ์ ํ์ฑํ์ํจ๋ค.
- ์ดํ, Redis์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ TTL์ด ๋ง๋ฃ๋๋ฉด, Redis๋ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ณ ์ด์ ๊ดํ ์๋ฆผ์ ๋ฐ์์ํจ๋ค.
- Spring Data Redis๋ ์ด ์๋ฆผ์ ๊ฐ์งํ๊ณ , ํด๋น ๋ฐ์ดํฐ์ ์ฐ๊ฒฐ๋ ๋ณด์กฐ ์ธ๋ฑ์ค(์ฆ, @Indexed๊ฐ ๋ถ์ ๊ฐ์ฒด)๋ฅผ ์๋์ผ๋ก ์ญ์ ํ๋ค.
์ฐธ๊ณ
'BackEnd๐ฑ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
LocalStack์ ํ์ฉํ AWS S3 ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ (2) | 2023.10.22 |
---|---|
TestContainer๋ก ํตํฉ ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ (3) | 2023.10.15 |
๋ถ์ฐ๋ฝ์ผ๋ก ์ ์ฐฉ์ ์ด๋ฒคํธ ๊ตฌํํ๊ธฐ (3) | 2023.08.31 |
WebClient์์ ์๋ฌ ์ฒ๋ฆฌ์ ์ฌ์๋ํ๋ ๋ฐฉ๋ฒ (0) | 2023.08.03 |
Spring Batch๋? ๊ฐ๋จํ ๊ฐ๋ ๊ณผ ์ฝ๋ ์ดํด๋ณด๊ธฐ (0) | 2023.07.29 |
์คํ๋ง์์ @Async๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์์ (4) | 2023.07.24 |
๋๊ธ