Skip to content

Latest commit

 

History

History
206 lines (176 loc) · 5.95 KB

3. 트랜잭션 제어 & 사용자 관리.md

File metadata and controls

206 lines (176 loc) · 5.95 KB

3. 트랜잭션 제어 & 사용자 관리


3.1 Isolation & Lock

  • Redis는 Commit, Rollback 명령어와 같은 트랜젝션 제어가 불가능
  • Redis는 읽기 일관성과 데이터 공유를 위해 Data Sets(Key/Value) Lock을 제공
  • 트랜잭션 제어를 위해 Read UncommittedRead Committed 타입, 2가지 유형을 제공

*Read Committed: commit된 데이터만 보이는 수준의 isolation을 보장

***Read Uncommitted**: 기본적으로 Read Committed transaction과 동일하지만, SELECT 쿼리를 실행할 때 아직 commit되지 않은 데이터를 읽어올 수 있다


3.2 CAS(Check and Set)

  • 동시 처리가 발생할 때, 먼저 작업을 요구한 사용자에게 우선권을 보장하고 나중에 작업을 요구한 사용자의 세션에서는 해당 트랜잭션에 충돌이 발생했음을 인지할 수 있도록 하는 것
  • Redis는 WATCH 명령어에 의해 트랜잭션을 취소할 수 있다
> WATCH a       ← 다중 트랜잭션 발생 여부 모니터링 시작 
OK
> MULTI         ← 트랜잭션 시작
OK
> set 1 hi
QUEUED          ← 임시 저장
> set 2 hello
QUEUED          ← 임시 저장
> EXEC
(error) EXECABORT Transactin discarded because of previous errors   
← 이미 다른 세션에서 변경한 데이터를 다시 변경하려고 할 경우 에러 발생

3.3 commit & rollback

  • EXEC: 변경한 데이터 최종 저장 (COMMIT)
  • DISCARD: 데이터 변경 취소 (ROLLBACK)
> MULTI         ← 트랜잭션 시작
OK
> set 1 hi
QUEUED          ← 임시 저장
> set 2 hello
QUEUED          ← 임시 저장
> EXEC          ← 트랜잭션 종료 (COMMIT)
1) OK
2) OK    
> keys *
1) "2"
2) "1"
> FLUSHALL
OK
> MULTI         ← 트랜잭션 시작
OK
> set 3 hi
QUEUED          ← 임시 저장
> set 4 hello
QUEUED          ← 임시 저장
> DISCARD          ← 트랜잭션 종료 (ROLLBACK)
OK
> keys *
(empty array)

3.4 Index 유형 및 생성

  • Primary Key Index: 빠른 검색을 위해 Key에 기본적으로 생성되는 인덱스
  • Secondary Index: 사용자의 필요에 따라 추가적으로 생성하는 인덱스
  • Exact Match By a Secondary Index: 인덱스 키를 통해 유일한 값을 검색하는 경우
  • Range By a Secondary Index: 일정 범위의 값을 검색 조건으로 부여하는 경우

1) Sorted Sets 타입 인덱스

> ZADD order.ship_date.index 2 '201809124:20180926'  ← order 테이블, ship_date 필드에 인덱스 생성
(integer) 1
> ZADD order.ship_date.index 1 '201809123:20180925'
(integer) 1
> ZRANGE order.ship_date.index 0 -1
1) "201809123:20180925"
2) "201809124:20180926"
> ZSCAN order.ship_date.index 0  ← key를 스캔해서 조회
1) "0"  ← 모두 조회했을 경우 next cursor가 0
2) 1) "201809123:20180925"
   2) "1"
   3) "201809124:20180926"
   4) "2"
> ZSCAN order.ship_date.index 0 match 201809124*
1) "0"
2) 1) "201809124:20180926"
   2) "2"
> ZADD order.no.index 1 201809123  ← order 테이블, no 필드에 인덱스 생성
(integer) 1
> ZADD order.no.index 2 201809124
(integer) 1
> ZRANGE order.no.index 0 -1
1) "201809123"
2) "201809124"

2) LexicoGraphical Index

> ZADD product.name.index 0 "Sky Pole"
(integer) 1
> ZADD product.name.index 0 "Bunny Boots"
(integer) 1
> ZADD product.name.index 0 "Ski Pants"
(integer) 1
> ZADD product.name.index 0 "Mountain Pants"
(integer) 1
> ZRANGEBYLEX product.name.index [S +
1) "Ski Pants"
2) "Sky Pole"
> ZRANGEBYLEX product.name.index [B [S
1) "Bunny Boots"
2) "Mountain Pants"
> ZRANGEBYLEX product.name.index [B [T
1) "Bunny Boots"
2) "Mountain Pants"
3) "Ski Pants"
4) "Sky Pole"
> ZRANGEBYLEX product.name.index [B (S
1) "Bunny Boots"
2) "Mountain Pants"
> ZRANGEBYLEX product.name.index [B (N
1) "Bunny Boots"
2) "Mountain Pants"

3) Hash 타입 인덱스

> hmset order_index no:201809123 customer_name:"Wonman & Sports" emp_name:"Magee" total:601100 payment_type:"Credit" order_filled:"Y"
OK
> hmset order_index no:201809124 customer_name:"PIT co." emp_name:"YS ROH" total:5000 payment_type:"Credit" order_filled:"Y"
OK
> hscan order_index 0
1) "0"
2)  1) "no:201809123"
    2) "customer_name:Wonman & Sports"
    3) "emp_name:Magee"
    4) "total:601100"
    5) "payment_type:Credit"
    6) "order_filled:Y"
    7) "no:201809124"
    8) "customer_name:PIT co."
    9) "emp_name:YS ROH"
   10) "total:5000"

3.5 사용자 생성 및 인증/보안/Roles

  • 인가된 사용자만이 안전하게 데이터를 관리할 수 있도록 다양한 엑세스 권한과 인증 방법들 제공

1) 엑세스 컨트롤 권한 (Access Control Privilege)

  • 미리 DB 내에 사용자 계정과 암호를 생성해 두고 Redis 서버에 접속하려는 사용자는 해당 계정과 암호를 입력하여 허가 받는 방법
  • 여러 대의 서버를 분산 및 복제 시스템으로 구축할 때는 추가로 Master, Slave, Sentinel, Partition, Replication 서버 간에 네트워크 엑세스 컨트롤 권한이 필요 → CONF 파일 내 requirepass, master auth 파라미터를 통해 환경 설정

2) 인증 방법 (Authorization Method)

  1. 운영체계(Operating System) 인증 방법
    • CONF 파일에 접속할 클라이언트의 IP-Address 미리 지정
  2. 내부(Internal) 인증 방법
    • Redis 서버에 접속한 다음 auth 명령어로 미리 생성해둔 사용자 계정과 암호를 입력하여 권한을 부여 받는다
$ redis-cli -p 6379
127.0.0.1:6379>
127.0.0.1:6379> shutdown
Not-connected> exit
$ vim redis.conf
requirepass redis123
$ redis-server C:\redis\redis.conf
$ redis-cli -p 6379
127.0.0.1:6379> info
NOAUTH Authentication required.
127.0.0.1:6379> auth redis123
OK
127.0.0.1:6379> info
# Server
redis_version:6.0.9
redis_git_sha1:00000000
redis_git_dirty:0
(생략)
127.0.0.1:6379> exit
$ redis-cli -p 6379 -a redis123
127.0.0.1:6379> info
# Server
redis_version:6.0.9
redis_git_sha1:00000000
redis_git_dirty:0
(생략)
127.0.0.1:6379> shutdown
Not-connected> exit