Redis는 다양한 데이터 타입과 데이터 타입별 커맨드를 제공합니다.

Key 설정 포인트

  • Key는 문자열이므로 최대 512MB까지 가능
    • 길이 등 가독성을 고려해야하고, 스키마를 유지할 수 있도록 설계할 것
    • ex) user:1000:followers

 

Strings

가장 기본적인 Redis 데이터 유형

텍스트, 직렬화된 개체 및 이진 배열을 포함한 바이트 시퀀스를 저장, 이미지 저장 가능

캐싱에 자주 사용되지만 카운터를 구현하고, 비트 연산을 수행할 수 있는 기능도 제공

단일 문자열은 최대 512MB

 

  • 문자열 저장하고 검색
> SET user:1 minju
OK
> GET user:1
"minju"
  • 직렬화된 JSON 문자열 저장하고 지금부터 100초 후에 만료되도록 설정
> SET ticket:27 "\"{'username': 'minju', 'ticket_id': 321}\"" EX 100
  • 카운터 증가
> INCR views:page:2
(integer) 1
> INCRBY views:page:2 10
(integer) 11

Bitmaps

String의 확장, bit 단위 연산

데이터 저장공간 절약

정수로 된 데이터만 카운팅 가능

데이터 on/off 가능 - SETBIT

  • 하루 총 방문자 수 세기

 

Lists

문자열의 목록

Linked List와 같은 형태, 스택과 큐 형태 구현

백그라운드 시스템을 위한 대기열 관리 구축

Blocking 기능을 이용해 Event Queue로 사용

  • 트위터 피드 기능
    • 키가 있을 때만 데이터 저장 가능 - LPUSHX / RPUSHX : 이미 캐싱되어 있는 피드에만 신규 트윗을 저장해서 자주 사용하는 유저에게만 데이터를 넣어줄 수 있음

 

  •  
  • 리스트를 대기열처럼 취급(선입선출)
> LPUSH work:queue:ids 101
(integer) 1
> LPUSH work:queue:ids 237
(integer) 2
> RPOP work:queue:ids
"101"
> RPOP work:queue:ids
"237"
  • 리스트를 스택처럼 취급(선입, 후출)
> LPUSH work:queue:ids 101
(integer) 1
> LPUSH work:queue:ids 237
(integer) 2
> LPOP work:queue:ids
"237"
> LPOP work:queue:ids
"101"
  • 리스트 길이 조회
> LLEN work:queue:ids
(integer) 0
  • 한 리스트에서 요소를 atomic하게 pop하고 다른 목록으로 push
> LPUSH board:todo:ids 101
(integer) 1
> LPUSH board:todo:ids 273
(integer) 2
> LMOVE board:todo:ids board:in-progress:ids LEFT LEFT
"273"
> LRANGE board:todo:ids 0 -1
1) "101"
> LRANGE board:in-progress:ids 0 -1
1) "273"
  • 100개를 초과하지 않는 리스트를 만들려면 다음을 호출할 때마다(LTRIM) 호출(LPUSH)
> LPUSH notifications:user:1 "You've got mail!"
(integer) 1
> LTRIM notifications:user:1 0 99
OK
> LPUSH notifications:user:1 "Your package will be delivered at 12:01 today."
(integer) 2
> LTRIM notifications:user:1 0 99
OK

Hashes

하나의 key 안에 여러 개의 field-value 쌍의 컬렉션

field = subkey, field 개수는 제한 없음

기본 객체를 나타내고 카운터를 그룹화하여 저장

 

  • 기본 사용자 프로필을 해시로 나타냄
> HSET username:123 username minju firstName Minju lastName Jeon country KR
(integer) 4
> HGET user:123 username
"minju"
> HGETALL user:123
1) "username"
2) "minju"
3) "firstName"
4) "Minju"
5) "lastName"
6) "Jeon"
7) "country"
8) "KR"
  • 장치 777이 서버에 핑을 보내거나, 요청을 발행하거나, 오류 보낸 횟수에 대한 카운터 저장
> HINCRBY device:777:stats pings 1
(integer) 1
> HINCRBY device:777:stats pings 1
(integer) 2
> HINCRBY device:777:stats pings 1
(integer) 3
> HINCRBY device:777:stats errors 1
(integer) 1
> HINCRBY device:777:stats requests 1
(integer) 1
> HGET device:777:stats pings
"3"
> HMGET device:777:stats requests errors
1) "1"
2) "1"

Sets

고유한 문자열, 중복 X, 정렬X → 집합

고유한 항목 추적(예: 지정된 블로그 게시물에 액세스하는 모든 고유한 IP 주소 추적)

관계 나타내기(예: 주어진 역할을 가진 모든 사용자 집합)

교집합, 합집합 등 일반적인 집합 연산 수행

 

  • 사용자 123 및 456의 즐겨찾는 책 ID set 저장
> SADD user:123:favorites 347
(integer) 1
> SADD user:123:favorites 561
(integer) 1
> SADD user:123:favorites 742
(integer) 1
> SADD user:456:favorites 561
(integer) 1
  • 사용자 123이 책 742와 299를 좋아하는지 조회
> SISMEMBER user:123:favorites 742
(integer) 1
> SISMEMBER user:123:favorites 299
(integer) 0
  • 사용자 123과 456이 공통적으로 좋아하는 책 조회
> SINTER user:123:favorites user:456:favorites
1) "561"
  • 사용자 123이 좋아하는 책이 몇 권인지 조회
> SCARD user:123:favorites
(integer) 3

Sorted Sets

정렬된 고유한 문자열 set

key, value에서 score까지 함께 저장 → 둘 이상의 score 값이 동일할 경우 사전순 정렬

  • 순위표. 예를 들어 대규모 온라인 게임에서 가장 높은 점수의 정렬된 목록을 쉽게 유지 관리
  • 속도 제한기. 과도한 API 요청을 방지하기 위해 슬라이딩 윈도우 속도 제한기 구축

  • 플레이어의 점수가 변경되면 실시간 순위표 업데이트
> ZADD leaderboard:455 100 user:1
(integer) 1
> ZADD leaderboard:455 75 user:2
(integer) 1
> ZADD leaderboard:455 101 user:3
(integer) 1
> ZADD leaderboard:455 15 user:4
(integer) 1
> ZADD leaderboard:455 275 user:2
(integer) 0
  • 상위 3명의 플레이어 점수 조회
> ZRANGE leaderboard:455 0 2 REV WITHSCORES
1) "user:2"
2) "275"
3) "user:3"
4) "101"
5) "user:1"
6) "100"
  • 사용자 2의 등급 조회
> ZREVRANK leaderboard:455 user:2
(integer) 0

HyperLogLogs(HLL)

2007년 Philippe Flajolet이 발표한 알고리즘

시간복잡도 O(1)로 효율적인 공간 활용을 위해 unique count를 통한 완벽한 정확도 제공, set의 카디널리티를 구하는데 주로 사용됨

확률적 자료구조를 이용한 추정 원리 : https://d2.naver.com/helloworld/711301

최대 12KB를 사용하고 0.81%의 오류 제공

count만 셀뿐이어서 value는 저장하지 않음 (내부 데이터 확인 불가능)

AWS 엘라스틱캐시, 클라우드 미터링(돈을 매기는 지표)

 

  • 몇 가지 항목 추가
> PFADD members 123
(integer) 1
> PFADD members 500
(integer) 1
> PFADD members 12
(integer) 1
  • set의 구성원 수 추정
> PFCOUNT members
(integer) 3

Streams

신규 기능

append-only 로그, 로그를 저장하기에 최적의 자료구조

메시지 브로커로 특화

실시간으로 이벤트를 기록하고 동시에 syndicate 한다. (일괄적으로 ..??)

kafka에서 영향을 받음

  • 이벤트 소싱(예: 사용자 작업, 클릭 추적 등)
  • 센서 모니터링(예: 현장 장치의 판독값)
  • 알림(예: 각 사용자의 알림 기록을 별도의 스트림에 저장)

각 스트림 항목에 대해 고유한 ID를 생성 → 나중에 연결된 항목을 검색하거나 후속 항목 처리

여러 트리밍 전략(스트림이 무제한으로 커지는 것을 방지)과 둘 이상의 소비 전략(XREAD, XREADGROUP, 과 XRANGE)을 지원

 

  • 스트림에 여러 온도 판독값 추가
> XADD temperatures:us-ny:10007 * temp_f 87.2 pressure 29.69 humidity 46
"1658354918398-0"
> XADD temperatures:us-ny:10007 * temp_f 83.1 pressure 29.21 humidity 46.5
"1658354934941-0"
> XADD temperatures:us-ny:10007 * temp_f 81.9 pressure 28.37 humidity 43.7
"1658354957524-0"
  • ID에서 시작하는 처음 두 개의 스트림 항목 조회
> XRANGE temperatures:us-ny:10007 1658354934941-0 + COUNT 2
1) 1) "1658354934941-0"
   2) 1) "temp_f"
      2) "83.1"
      3) "pressure"
      4) "29.21"
      5) "humidity"
      6) "46.5"
2) 1) "1658354957524-0"
   2) 1) "temp_f"
      2) "81.9"
      3) "pressure"
      4) "28.37"
      5) "humidity"
      6) "43.7"
  • 스트림의 끝에서 시작해서 최대 100개의 새 스트림을 읽고 항목이 기록되지 않는 경우 최대 300ms 동안 차단
> XREAD COUNT 100 BLOCK 300 STREAMS temperatures:us-ny:10007 $
(nil)

 

데이터 타입별 커맨드

https://redis.io/commands/

 

Commands

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker

redis.io

 

yum에 대해서

개념

  • Yellowdog Update Modified의 약자
  • 레드햇 계열의 리눅스에서 사용하는 패키지 설치 관리 도구
  • rpm이 해결하지 못했던 패키지 의존성 문제를 해결한 스마트한 패키지 관리 툴
  • 패키지 의존성 문제를 자동으로 처리하면서 설치, 업데이트, 삭제를 진행 → Spring(=rpm)에서 안되던 dependency 주입을 Springboot(=yum)에서 해주는 느낌
  • 발음은 대부분 염이라고 한다..!

💡 패키지 의존성 이란?

더보기

A라는 패키지를 설치하려면 B 패키지를 먼저 설치해야 하는 것이다.

A라는 패키지를 B 패키지의 기능을 사용하도록 제작되었기 때문이다.

서로 여러 패키지들이 의존성을 갖게 되어 패키지 간의 의존 관계가 점점 복잡해지게 되고, 관리가 어려워지는 문제가 있다.

 

사용법

  • 필요한 패키지는 인터넷에 있는 패키지 저장소 서버로부터 다운로드 받기 때문에 인터넷에 연결된 상태여야 함
  • 패키지 저장소 서버는 /etc/yum.conf/etc/yum.repos.d/ 디렉토리의 저장소 파일을 통해 관리됨
# 사용 형식
yum [옵션] [명령] [패키지명]

# 설치
yum install 패키지명
yum -y install 패키지명  # y옵션을 사용하면 사용자에게 yes/no 여부를 묻지 않고 넘어감

# 업데이트 가능한 패키지 목록 확인
yum check-update

# 업데이트
yum update 패키지명

# 삭제
yum remove 패키지명

# 정보 확인
yum info 패키지명

# 패키지 list ghkrdls
yum list
yum list | grep 패키지명 # 원하는 패키지 목록만 확인

# 설치된 패키지 중 업데이트된 패키지 목록을 보고싶은 경우
yum list updates

# 설치 가능한 패키지 리스트
yum list available                                                                        

# 설치된 패키지 리스트
yum list installed

 

동작방식

  1. yum install로 패키지 설치 명령을 실행합니다.
  2. /etc/yum.repos.d/ 디렉토리의 여러 설정파일 및 CentOS-Base.repo 파일을 참고하여 인터넷 상의 패키지 저장소 서버 주소를 얻습니다.
  3. 패키지 목록을 저장소 서버로부터 얻습니다. 실제 패키지를 받는 것은 아니고 목록만 가져옵니다.
  4. 3번과 동일
  5. 가져온 패키지 목록을 터미널에 출력하고 설치할 것인지(y/n) 묻습니다.
  6. y를 입력하면 패키지를 다운로드하여 자동으로 설치합니다.

 

CentOS-Base.repo 설정 파일

패키지를 다운받는 패키지 저장소 서버는 /etc/yum.repos.d/CentOS-Base.repo 파일에 주소가 명시되어 있습니다.

 

아래 명령어로 파일을 열어봅니다.

vi /etc/yum.repos.d/CentOS-Base.repo

 

파일은 다음과 같은 구조입니다.

 

패키지 저장소

각 항목은 패키지 저장소의 위치를 나타냅니다.

[base], [updates], [extras]는 동작방식에 있는 원본 패키지, 업데이트 패키지, 추가 패키지입니다.

 

[base]

  • CentOS가 릴리즈 되는 시점에 제작된 버전의 패키지
  • 배포판을 처음 설치할때 같이 설치되는 패키지, DVD 이미지에 담겨있습니다.
 
[updates]
  • 이후 버그 수정이나 기능 수정 등으로 인해 업데이트 된 패키지
  • [updates] 항목에 URL을 설정할 수 있습니다.
  • yum은 패키지를 설치할 때 기본적으로 [base] 저장소가 아닌 [updates] 저장소를 이용하며, 이 항목을 주석처리하게 되면 yum 명령어로 패키지를 설치할때 업데이트 버전을 설치하는 것이 아닌 원본패키지 저장소의 패키지를 설치하게 됩니다.
 
[extras], [centosplus]
  • 추가로 배포된 패키지인 추가패키지 저장소 설정은 [extras] 항목에서 관리
  • [centosplus] 항목이 있지만 기본적으로 enabled=0 으로 설정이 꺼져있고 사용되지 않습니다.

 

CentOS-Base.repo 설정 구성

  • name : 저장소의 이름을 명시한 것이며, 아무렇게나 지정해도 상관없습니다.
  • mirrorlist : baseurl 속성의 값이 생략된 경우 이곳에 명시된 URL을 사용합니다. 기본적으로 CentOS 프로젝트에서 운영하는 공식 서버 URL이 지정 되어 있습니다.
  • baseurl : 패키지 저장소의 url이며, http://, ftp://, file:// 프로토콜 스킴을 사용할 수 있습니다.
  • gpgcheck : GPG(GNU Privacy Guard) 키가 들어있는 저장소의 URL을 적습니다. GPG 키는 rpm 패키지를 인증하는데 사용하는 암호화 서명입니다.
  • enabled : 이 저장소 설정 여부를 사용할것인지 여부를 지정합니다. 기본값은 1이며 1 = 사용, 0 = 미사용 입니다.
 

🔜 더 알아볼 내용

  • RPM
  • epel
 
 

참고

https://dololak.tistory.com/331

https://dololak.tistory.com/332

분명 설치 잘 돼서 데이터 입출력까지 하고, 다시 켰는데

mysql --version 도 안되고 그냥 mysql 커맨드가 다 안 됐다.

 

에러는 Error - bash: mysql: command not found 라고 났다.

 

뭐지 싶어서 구글링 엄청 했는데

검색했을 때 보통 PATH에 추가하라고 나오는 경로가 있는데

나는 mysql이 설치된 경로가 달라서 맞지 않았다.

 

이런 경우 본인의 mysql이 어느 경로에 설치되어 있는지 확인해보는걸 추천한다.

 

참고) PATH에 넣을 경로는 my.cnf 에 basedir 경로에 bin만 추가한 것과 같다.

 

🧐 압축파일로 설치했을 때만 문제가 있었고, yum으로 설치한거는 따로 설정없이도 잘 동작했다. 왜일까?


⭐️ 이 과정을 거쳐야 mysql 커맨드를 사용할 수 있습니다. ⭐️

예) mysql --version , mysql -u [사용자이름] -p

 

1. /etc/profile 수정하기

#pwd 했을 때 / 인 상태에서
sudo vi /etc/profile

2. GG 이용해서 파일 맨 끝으로 가서 추가하고 저장하기(:wp)

export PATH="$PATH:/home/centos/mysql/bin"

3. 변경된 파일 적용하기

source /etc/profile

4. 결과

잘 되는 것을 확인할 수 있다!

 

 

시나리오

client1 인스턴스에서 공개키(id_rsa.pub)를 생성하고, host 인스턴스로 보낸다.

받은 공개키 내용을 host 인스턴스에 등록한다.

 

왜?

기존에 비밀번호를 네트워크를 통해 보내는 비밀번호 인증은 네트워크 상에서 ID/비밀번호가 그대로 노출되는 문제가 있고, 접속할 때마다 입력해야 하는 번거로움이 있다.
SSH 키는 이와 달리 공개키 암호 방식을 사용하여 서버에서 인증받을 수 있으며, 암호를 생략하고 원격 호스트로 접속할 수 있다.

 

실습 환경

  • client1 인스턴스 : CentOS 7.9
  • host 인스턴스 : CentOS 7.9

 

준비할 항목

1. client1에서 실행

sudo vi /etc/ssh/sshd_config
  • PubkeyAuthentication yes
  • PasswordAuthentication yes

 

2. 보안그룹 설정

  • client1의 플로팅 IP를 수신으로 등록한다.

 

과정

1. client1에서 실행해서 Key Pair 생성

ssh-keygen

# default 설정
# ssh-keygen -t rsa 3072

# 공개키 암호화 알고리즘을 명시하고자 하는 경우
# ssh-keygen -t rsa

# 키 크기(bit)를 명시하고자 하는 경우
# ssh-keygen -t rsa -b 2048

 

2. Key Pair 생성됐는지 확인

파일명 설명 저장 위치 비고
id_rsa 개인키 client1(Local) 철저한 보안 관리 필요
id_rsa.pub 공개키 host(Remote) 외부에 공개해도 상관 없음

 

 

3. client1에 있는 파일 권한 변경

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub  
chmod 644 ~/.ssh/known_hosts

 

4. client1에서 실행

scp ~/.ssh/id_rsa.pub [host id]@[host fixed ip]:id_rsa.pub

 

5. host에서 client1로부터 받은 id_rsa.pub 내용 복사

 

6. 5번에서 복사한 내용을 host의 ~/.ssh/authorized_keys에 복사 (여러 공개키는 줄바꿈으로 구분)

 

결과

client1에서 host로 SSH 접속을 시도한다.

ssh [host id]@[host fixed ip]

더 이상 비밀번호를 묻지 않아 편리한 서버 작업이 가능하다!

 

 

 

 

참고

https://blog.radia.me/%EA%B3%B5%EA%B0%9C%ED%82%A4-%EA%B8%B0%EB%B0%98-ssh-%EC%A0%91%EC%86%8D-%EB%B0%A9%EB%B2%95/

https://opentutorials.org/module/432/3742

https://www.cubrid.com/blog/3825015

#!

sharp(#) + bang(!)의 합성어, shebang이라 한다.

  • 2byte의 매직 넘버(magic number)로 이 자체가 하나의 기호
  • 스크립트를 실행시킬 프로그램의 경로를 지정하는 역할
  • 이 뒤에 나오는 것은 경로명, 명령어들을 해석할 프로그램의 위치를 나타냄
  • 경로가 정확하지 않다면 bad interpreter 발생
  • 다른 인터프리터를 지정하면 문법 오류 발생

문법

#!<interpreter> [optional-arg]

#! 뒤에 공백이 하나 있어도 동작
<interpreter>에는 프로그램의 절대경로 입력

예시

#!/bin/sh
#!/bin/bash
#!/usr/bin/php
#!/usr/bin/python -O
#!/usr/bin/env bash

#!/usr/bin/env

  • interpreter에 들어갈 프로그램의 절대 경로는 시스템에 따라 달라질 수 있다.
    ex) 파이썬을 예로 들면 /bin/local/python 또는 /usr/bin/python에 위치할 수도 있고
    버전도 python2와 python3이 둘다 설치되어 있을수 있다.
  • 이럴 때 #!/usr/bin/env로 설정하면 절대경로에 상관없이 인터프리터의 위치를 찾아서 살행
    • env는 사용자의 $PATH(환경변수)에서 첫번째로 찾은 명령를 찾아서 실행됨
    • 다양한 환경에서 실행되는 스크립트라면 env 사용하기

예시

# 환경 변수 정보 출력
env

# 환경 변수 정보 변경
env -i HOSTNAME=test.com

# 환경 변수 정보 변경
env -u HOSTNAME

# env 이용한 bash 실행하기
/usr/bin/env bash --version

테스트

1. vi test 파일 작성

#!/usr/bin/env bash

echo "Hello, This is Bash"

2. 실행 권한 추가하고 실행

# 권한 추가
$ chmod +x test

# 실행
$ ./test
Hello This is Bash

3. 다시 파일을 열고 인터프리터를 파이썬으로 지정

#! /usr/bin/env python

echo "Hello This is Bash"

4. 파이썬 문법에 맞지 않아 오류 발생

$ ./test
File "./test", line 3
echo "Hello This is Bash"
^
SyntaxError: invalid syntax

5. 파일 열고 파이썬 문법으로 수정

#! /usr/bin/env python

print "Hello This is Python"

6. 파일 실행하면 정상적으로 작동함

$ ./test
Hello This is Python

 

참고

https://blog.gaerae.com/2015/10/what-is-the-preferred-bash-shebang.html

https://bcp0109.tistory.com/343

https://ingorae.tistory.com/365

+ Recent posts