Skip to content

Latest commit

ย 

History

History
205 lines (143 loc) ยท 8.55 KB

File metadata and controls

205 lines (143 loc) ยท 8.55 KB

Key-Value Item

Key-value item์€ ํ•˜๋‚˜์˜ key์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ value๋งŒ์„ ์ €์žฅํ•˜๋Š” item์ด๋‹ค.

์ œ์•ฝ์กฐ๊ฑด

  • Key์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋Š” 4000 character์ด๋‹ค.
  • Cache item์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋Š” 1MB์ด๋‹ค.

Key-value item์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Key-Value Item ์ €์žฅ

key-value item์„ ์ €์žฅํ•˜๋Š” API๋กœ set, add, replace๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

OperationFuture<Boolean> set(String key, int exp, Object obj)
OperationFuture<Boolean> add(String key, int exp, Object obj)
OperationFuture<Boolean> replace(String key, int exp, Object obj)
  • <key, obj>์˜ key-value item์„ ์ €์žฅํ•œ๋‹ค.
  • Cache์— ํ•ด๋‹น key์˜ ์กด์žฌ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๊ฐ API ๋™์ž‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    • set์€ <key, obj> item์„ ๋ฌด์กฐ๊ฑด ์ €์žฅํ•œ๋‹ค. ํ•ด๋‹น key๊ฐ€ ์กด์žฌํ•˜๋ฉด ๊ต์ฒดํ•˜์—ฌ ์ €์žฅํ•˜๋‹ค.
    • add๋Š” ํ•ด๋‹น key๊ฐ€ ์—†์„ ๊ฒฝ์šฐ๋งŒ, <key, obj> item์„ ์ €์žฅํ•œ๋‹ค.
    • replace๋Š” ํ•ด๋‹น key๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ๋งŒ, <key, obj> item์„ ๊ต์ฒดํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค.
  • ์ €์žฅ๋œ key-value item์€ exp ์ดˆ ์ดํ›„์— ์‚ญ์ œ๋œ๋‹ค.

์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋Š” future ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์–ป๋Š”๋‹ค.

future.getStatus().getStatusCode() ์„ค๋ช…
StatusCode.SUCCESS ์ €์žฅ ์„ฑ๊ณต
StatusCode.ERR_NOT_STORED ์ €์žฅ ์‹คํŒจ (add : ์ด๋ฏธ ์กด์žฌํ•˜๋Š” key, replace : ์ฃผ์–ด์ง„ key์— ํ•ด๋‹นํ•˜๋Š” item์ด ์—†์Œ)

key-vlaue item์— ์ฃผ์–ด์ง„ value๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” API๋กœ prepend, append๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

OperationFuture<Boolean> prepend(long cas, String key, Object val)
OperationFuture<Boolean> append(long cas, String key, Object val)
  • key-value item์—์„œ value ์ถ”๊ฐ€ ์œ„์น˜๋Š” API์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.
    • prepend๋Š” item์˜ value ๋ถ€๋ถ„์—์„œ ๊ฐ€์žฅ ์•ž์ชฝ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
    • append๋Š” item์˜ value ๋ถ€๋ถ„์—์„œ ๊ฐ€์žฅ ๋’ค์ชฝ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ์ฒซ์งธ ์ธ์ž์ธ cas๋Š” ํ˜„์žฌ ์ด์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ž„์˜์˜ ๊ฐ’์„ ์ฃผ๋ฉด ๋œ๋‹ค. ์ดˆ๊ธฐ์— CAS(compare-and-set) ์—ฐ์‚ฐ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ํ•„์š”ํ–ˆ๋˜ ์ธ์ž์ด๋‹ค.

์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋Š” future ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์–ป๋Š”๋‹ค.

future.getStatus().getStatusCode() ์„ค๋ช…
StatusCode.SUCCESS ์ €์žฅ ์„ฑ๊ณต
StatusCode.ERR_NOT_STORED ์ €์žฅ ์‹คํŒจ (์ฃผ์–ด์ง„ key์— ํ•ด๋‹นํ•˜๋Š” item์ด ์—†์Œ)

ํ•œ๋ฒˆ์˜ API ํ˜ธ์ถœ๋กœ ๋‹ค์ˆ˜์˜ key-value items์„ setํ•˜๋Š” bulk API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

Future<Map<String, OperationStatus>> asyncStoreBulk(StoreType type, List<String> key, int exp, Object obj)
Future<Map<String, OperationStatus>> asyncStoreBulk(StoreType type, Map<String, Object> map, int exp)
  • ๋‹ค์ˆ˜์˜ key-value item์„ ํ•œ๋ฒˆ์— ์ €์žฅํ•œ๋‹ค.
    • ์ „์ž API๋Š” key list์˜ ๋ชจ๋“  key์— ๋Œ€ํ•ด ๋™์ผํ•œ obj๋กœ ์ €์žฅ ์—ฐ์‚ฐ์„ ํ•œ๋ฒˆ์— ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • ํ›„์ž API๋Š” map์— ์žˆ๋Š” ๋ชจ๋“  <key, obj>์— ๋Œ€ํ•ด ์ €์žฅ ์—ฐ์‚ฐ์„ ํ•œ๋ฒˆ์— ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ์ €์žฅ๋œ key-value item๋“ค์€ ๋ชจ๋‘ exp ์ดˆ ์ดํ›„์— ์‚ญ์ œ๋œ๋‹ค.
  • StoreType์€ ์—ฐ์‚ฐ์˜ ์ €์žฅ ์œ ํ˜•์„ ์ง€์ •ํ•œ๋‹ค. ์•„๋ž˜์˜ ์œ ํ˜•์ด ์žˆ๋‹ค.
    • StoreType.set
    • StoreType.add
    • StoreType.replace

expiration์€ key๊ฐ€ ํ˜„์žฌ ์‹œ๊ฐ„๋ถ€ํ„ฐ expire ๋  ๋•Œ๊นŒ์ง€์˜ ์‹œ๊ฐ„(์ดˆ ๋‹จ์œ„)์„ ์ž…๋ ฅํ•œ๋‹ค. ์‹œ๊ฐ„์ด 30์ผ์„ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ expire ๋  unix time์„ ์ž…๋ ฅํ•œ๋‹ค. ๊ทธ ์™ธ์— expire ๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • 0: key๊ฐ€ expire ๋˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ARCUS cache server์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ LRU์— ์˜ํ•ด ์–ธ์ œ๋“ ์ง€ ์‚ญ์ œ๋  ์ˆ˜ ์žˆ๋‹ค.
  • -1: key๋ฅผ sticky item์œผ๋กœ ๋งŒ๋“ ๋‹ค. Sticky item์€ expire ๋˜์ง€ ์•Š์œผ๋ฉฐ LRU์— ์˜ํ•ด ์‚ญ์ œ๋˜์ง€๋„ ์•Š๋Š”๋‹ค.

์ €์žฅ์— ์‹คํŒจํ•œ ํ‚ค์™€ ์‹คํŒจ ์›์ธ์€ future ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด Map ํ˜•ํƒœ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

future.get(key).getStatusCode() ์„ค๋ช…
StatusCode.ERR_NOT_FOUND Key miss (์ฃผ์–ด์ง„ key์— ํ•ด๋‹นํ•˜๋Š” item์ด ์—†์Œ)
StatusCode.ERR_EXISTS ๋™์ผ key๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•จ

Key-Value Item ์กฐํšŒ

ํ•˜๋‚˜์˜ key๋ฅผ ๊ฐ€์ง„ cache item์— ์ €์žฅ๋œ value๋ฅผ ์กฐํšŒํ•˜๋Š” API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

GetFuture<Object> asyncGet(String key)
  • ์ฃผ์–ด์ง„ key์— ์ €์žฅ๋œ value๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋Š” future ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์–ป๋Š”๋‹ค.

future.get(key).getStatusCode() ์„ค๋ช…
StatusCode.SUCCESS ์กฐํšŒ ์„ฑ๊ณต(key์— ํ•ด๋‹นํ•˜๋Š” item ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ ์„ฑ๊ณต)

์—ฌ๋Ÿฌ key๋“ค์˜ value๋ฅผ ํ•œ๋ฒˆ์— ์กฐํšŒํ•˜๋Š” bulk API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

BulkFuture<Map<String, Object>> asyncGetBulk(Collection<String> keys)
BulkFuture<Map<String, Object>> asyncGetBulk(String... keys)
  • ๋‹ค์ˆ˜ key๋“ค์— ์ €์žฅ๋œ value๋ฅผ Map<String, Object> ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋‹ค์ˆ˜ key๋“ค์€ String ์œ ํ˜•์˜ Collection์ด๊ฑฐ๋‚˜ String ์œ ํ˜•์˜ ๋‚˜์—ด๋œ key ๋ชฉ๋ก์ผ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜๋‚˜์˜ key๋ฅผ ๊ฐ€์ง„ cache item์— ์ €์žฅ๋œ CASValue๋ฅผ ์กฐํšŒํ•˜๋Š” API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

GetFuture<CASValue<Object>> asyncGets(String key)
  • ์ฃผ์–ด์ง„ key์— ์ €์žฅ๋œ CASValue(cas, value)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋Š” future ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์–ป๋Š”๋‹ค.

future.get(key).getStatusCode() ์„ค๋ช…
StatusCode.SUCCESS ์กฐํšŒ ์„ฑ๊ณต(key์— ํ•ด๋‹นํ•˜๋Š” item ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ ์„ฑ๊ณต)

์—ฌ๋Ÿฌ key๋“ค์˜ CASValue๋ฅผ ํ•œ๋ฒˆ์— ์กฐํšŒํ•˜๋Š” bulk API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

BulkFuture<Map<String, CASValue<Object>>> asyncGetsBulk(Collection<String> keys)
BulkFuture<Map<String, CASValue<Object>>> asyncGetsBulk(String... keys)
  • ๋‹ค์ˆ˜ key๋“ค์— ์ €์žฅ๋œ CASValue๋ฅผ Map<String, CASValue> ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋‹ค์ˆ˜ key๋“ค์€ String ์œ ํ˜•์˜ Collection์ด๊ฑฐ๋‚˜ String ์œ ํ˜•์˜ ๋‚˜์—ด๋œ key ๋ชฉ๋ก์ผ ์ˆ˜ ์žˆ๋‹ค.
  • Key-Value Item ๊ฐ’์˜ ์ฆ๊ฐ

    key-value item์—์„œ value ๋ถ€๋ถ„์˜ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๊ฑฐ๋‚˜ ๊ฐ์†Œ์‹œํ‚ค๋Š” ์—ฐ์‚ฐ์ด๋‹ค. ([์ฃผ์˜] ์ฆ๊ฐ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ๋ฐ˜๋“œ์‹œ value ๊ฐ’์ด String ์œ ํ˜•์˜ ์ˆซ์ž ๊ฐ’์ด์–ด์•ผ ํ•œ๋‹ค.)

    OperationFuture<Long> asyncIncr(String key, int by)
    OperationFuture<Long> asyncDecr(String key, int by)
    • key์— ์ €์žฅ๋œ ์ •์ˆ˜ํ˜• ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์„ by ๋งŒํผ ์ฆ๊ฐ€/๊ฐ์†Œ์‹œํ‚จ๋‹ค. key๊ฐ€ cache์— ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ฆ๊ฐ์—ฐ์‚ฐ์€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์€ ์ฆ๊ฐ ํ›„์˜ ๊ฐ’์ด๋‹ค.
    OperationFuture<Long> asyncIncr(String key, int by, long def, int exp)
    OperationFuture<Long> asyncDecr(String key, int by, long def, int exp)
    • key์— ์ €์žฅ๋œ ์ •์ˆ˜ํ˜• ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์„ by ๋งŒํผ ์ฆ๊ฐ€/๊ฐ์†Œ์‹œํ‚จ๋‹ค. key๊ฐ€ cache์— ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด <key, def> item์„ ์ถ”๊ฐ€ํ•˜๋ฉฐ, exp ์ดˆ ์ดํ›„์— ์‚ญ์ œ๋œ๋‹ค.
    • ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์€ ์ฆ๊ฐ ํ›„์˜ ๊ฐ’์ด๋‹ค.

    ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋Š” future ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์–ป๋Š”๋‹ค.

    future.getStatus().getStatusCode() ์„ค๋ช…
    StatusCode.SUCCESS ์ฆ๊ฐ ์„ฑ๊ณต
    StatusCode.ERR_NOT_FOUND ์ฆ๊ฐ ์‹คํŒจ (Key miss, ์ฃผ์–ด์ง„ key์— ํ•ด๋‹นํ•˜๋Š” item์ด ์—†์Œ)

    Key-Value Item ์‚ญ์ œ

    ํ•˜๋‚˜์˜ key์— ๋Œ€ํ•œ item์„ ์‚ญ์ œํ•˜๋Š” API์™€ ์—ฌ๋Ÿฌ key๋“ค์˜ item๋“ค์„ ํ•œ๋ฒˆ์— ์‚ญ์ œํ•˜๋Š” bulk API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

    OperationFuture<Boolean> delete(String key)
    • ์ฃผ์–ด์ง„ key๋ฅผ ๊ฐ€์ง„ item์„ cache์—์„œ ์‚ญ์ œํ•œ๋‹ค.

    ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋Š” future ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์–ป๋Š”๋‹ค.

    future.getStatus().getStatusCode() ์„ค๋ช…
    StatusCode.SUCCESS ์‚ญ์ œ ์„ฑ๊ณต
    StatusCode.ERR_NOT_FOUND ์‚ญ์ œ ์‹คํŒจ (Key miss, ์ฃผ์–ด์ง„ key์— ํ•ด๋‹นํ•˜๋Š” item์ด ์—†์Œ)
    Future<Map<String, OperationStatus>> asyncDeleteBulk(List<String> key)
    Future<Map<String, OperationStatus>> asyncDeleteBulk(String... key)
    • ๋‹ค์ˆ˜์˜ key-value item์„ ํ•œ๋ฒˆ์— deleteํ•œ๋‹ค.
    • ๋‹ค์ˆ˜ key๋“ค์€ String ์œ ํ˜•์˜ List์ด๊ฑฐ๋‚˜ String ์œ ํ˜•์˜ ๋‚˜์—ด๋œ key ๋ชฉ๋ก์ผ ์ˆ˜ ์žˆ๋‹ค.

    delete ์‹คํŒจํ•œ ํ‚ค์™€ ์‹คํŒจ ์›์ธ์€ future ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด Map ํ˜•ํƒœ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

    future.get().get(key).getStatusCode() ์„ค๋ช…
    StatusCode.ERR_NOT_FOUND ์‚ญ์ œ ์‹คํŒจ (Key miss, ์ฃผ์–ด์ง„ key์— ํ•ด๋‹นํ•˜๋Š” item์ด ์—†์Œ)