- Redis는 Commit, Rollback 명령어와 같은 트랜젝션 제어가 불가능
- Redis는 읽기 일관성과 데이터 공유를 위해
Data Sets(Key/Value) Lock
을 제공 - 트랜잭션 제어를 위해
Read Uncommitted
와Read Committed
타입, 2가지 유형을 제공
*Read Committed
: commit된 데이터만 보이는 수준의 isolation을 보장
***Read Uncommitted**
: 기본적으로 Read Committed
transaction과 동일하지만, SELECT
쿼리를 실행할 때 아직 commit되지 않은 데이터를 읽어올 수 있다
- 동시 처리가 발생할 때, 먼저 작업을 요구한 사용자에게 우선권을 보장하고 나중에 작업을 요구한 사용자의 세션에서는 해당 트랜잭션에 충돌이 발생했음을 인지할 수 있도록 하는 것
- Redis는 WATCH 명령어에 의해 트랜잭션을 취소할 수 있다
> WATCH a ← 다중 트랜잭션 발생 여부 모니터링 시작
OK
> MULTI ← 트랜잭션 시작
OK
> set 1 hi
QUEUED ← 임시 저장
> set 2 hello
QUEUED ← 임시 저장
> EXEC
(error) EXECABORT Transactin discarded because of previous errors
← 이미 다른 세션에서 변경한 데이터를 다시 변경하려고 할 경우 에러 발생
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)
Primary Key Index
: 빠른 검색을 위해 Key에 기본적으로 생성되는 인덱스Secondary Index
: 사용자의 필요에 따라 추가적으로 생성하는 인덱스Exact Match By a Secondary Index
: 인덱스 키를 통해 유일한 값을 검색하는 경우Range By a Secondary Index
: 일정 범위의 값을 검색 조건으로 부여하는 경우
> 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"
> 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"
> 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"
- 인가된 사용자만이 안전하게 데이터를 관리할 수 있도록 다양한 엑세스 권한과 인증 방법들 제공
- 미리 DB 내에 사용자 계정과 암호를 생성해 두고 Redis 서버에 접속하려는 사용자는 해당 계정과 암호를 입력하여 허가 받는 방법
- 여러 대의 서버를 분산 및 복제 시스템으로 구축할 때는 추가로 Master, Slave, Sentinel, Partition, Replication 서버 간에 네트워크 엑세스 컨트롤 권한이 필요 → CONF 파일 내 requirepass, master auth 파라미터를 통해 환경 설정
- 운영체계(Operating System) 인증 방법
- CONF 파일에 접속할 클라이언트의 IP-Address 미리 지정
- 내부(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