StringRedisTemplate

์ด๋ฏธ์—ฐยท2024๋…„ 8์›” 12์ผ

[spring]

๋ชฉ๋ก ๋ณด๊ธฐ
5/7

๐Ÿ”Ž StringRedisTemplate ์ด๋ž€?

StringRedisTemplate์€ Spring Data Redis์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋กœ, Redis์™€ ์‰ฝ๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” Java์˜ String ํƒ€์ž…์„ key์™€ value๋กœ ์‚ฌ์šฉํ•˜์—ฌ Redis ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿท๏ธ ์ฃผ์š” ํŠน์ง•:

๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ์— ์ตœ์ ํ™”
์ž๋™์œผ๋กœ Spring Bean์œผ๋กœ ์ƒ์„ฑ๋จ
๋‹ค์–‘ํ•œ Redis ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ง€์› (String, List, Set ๋“ฑ)

๐Ÿ”Ž StringRedisTemplate ์‹œ์ž‘ํ•˜๊ธฐ

๋จผ์ €, Spring Boot ํ”„๋กœ์ ํŠธ์— Redis ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ, ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด StringRedisTemplate์„ ์ฃผ์ž…๋ฐ›์Šต๋‹ˆ๋‹ค.

@SpringBootTest
public class RedisTemplateTests {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    
    // ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋“ค์ด ์—ฌ๊ธฐ์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
}

๐Ÿท๏ธ Redis String

Redis์˜ String ํƒ€์ž…์œผ๋กœ ์ž‘์—…ํ•˜๋ ค๋ฉด ValueOperations ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@Test
public void stringValueOpsTest() {
    ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
    
    // ๋ฐ์ดํ„ฐ ์ €์žฅ
    ops.set("username", "ํ™๊ธธ๋™");
    
    // ๋ฐ์ดํ„ฐ ์กฐํšŒ
    String username = ops.get("username");
    System.out.println("์‚ฌ์šฉ์ž ์ด๋ฆ„: " + username);
    
    // ๋ฐ์ดํ„ฐ ์ˆ˜์ •
    ops.set("username", "๊น€์ฒ ์ˆ˜");
    System.out.println("๋ณ€๊ฒฝ๋œ ์ด๋ฆ„: " + ops.get("username"));
}

๐Ÿท๏ธ Redis Set

Redis์˜ Set ํƒ€์ž…์œผ๋กœ ์ž‘์—…ํ•˜๋ ค๋ฉด SetOperations ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@Test
public void stringSetOpsTest() {
    SetOperations<String, String> setOps = stringRedisTemplate.opsForSet();
    
    // Set์— ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
    setOps.add("fruits", "์‚ฌ๊ณผ", "๋ฐ”๋‚˜๋‚˜", "์˜ค๋ Œ์ง€");
    setOps.add("fruits", "์‚ฌ๊ณผ");  // ์ค‘๋ณต ์ถ”๊ฐ€ (๋ฌด์‹œ๋จ)
    
    // Set ํฌ๊ธฐ ํ™•์ธ
    Long size = setOps.size("fruits");
    System.out.println("๊ณผ์ผ ์ข…๋ฅ˜ ์ˆ˜: " + size);
    
    // Set์˜ ๋ชจ๋“  ๋ฉค๋ฒ„ ์กฐํšŒ
    Set<String> fruits = setOps.members("fruits");
    System.out.println("๊ณผ์ผ ๋ชฉ๋ก: " + fruits);
    
    // ํŠน์ • ๊ฐ’์ด Set์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ
    boolean hasBanana = setOps.isMember("fruits", "๋ฐ”๋‚˜๋‚˜");
    System.out.println("๋ฐ”๋‚˜๋‚˜๊ฐ€ ์žˆ๋‚˜์š”? " + hasBanana);
}

๐Ÿท๏ธ ๊ณตํ†ต Redis ์ž‘์—…

StringRedisTemplate์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์„ค์ •์ด๋‚˜ ํ‚ค ์‚ญ์ œ ๊ฐ™์€ ๊ณตํ†ต ์ž‘์—…๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

@Test
public void redisCommonOpsTest() {
    ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
    
    // ๋ฐ์ดํ„ฐ ์ €์žฅ
    ops.set("sessionId", "abc123");
    
    // ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์„ค์ • (5์ดˆ)
    stringRedisTemplate.expire("sessionId", 5, TimeUnit.SECONDS);
    
    // ๋‚จ์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ํ™•์ธ
    Long ttl = stringRedisTemplate.getExpire("sessionId");
    System.out.println("sessionId์˜ ๋‚จ์€ ์‹œ๊ฐ„: " + ttl + "์ดˆ");
    
    // 5์ดˆ ๋Œ€๊ธฐ
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    
    // ๋งŒ๋ฃŒ๋œ ํ‚ค ์กฐํšŒ
    String expiredValue = ops.get("sessionId");
    System.out.println("๋งŒ๋ฃŒ ํ›„ sessionId ๊ฐ’: " + expiredValue);
    
    // ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์ €์žฅ
    ops.set("tempKey", "์ž„์‹œ ๋ฐ์ดํ„ฐ");
    
    // ํ‚ค ์‚ญ์ œ
    Boolean deleted = stringRedisTemplate.delete("tempKey");
    System.out.println("tempKey ์‚ญ์ œ ์„ฑ๊ณต? " + deleted);
}

0๊ฐœ์˜ ๋Œ“๊ธ€