새소식

Redis

[Redis] Redis Cache Server 만들기!

  • -
반응형

아는 선배에게 많은 기업들이 현재 Redis를 이용해서 Cache Server를 사용하고 있다는 말을 듣게 되었다.
해서 이번에는 Redis를 이용한 Cache Server 구축에 관하여 포스팅을 해볼 생각이다.

 

1.Cache 란?


- 파레토 법칙이란 80퍼센트의 결과는 20퍼센트의 원인으로 인해 발생
한다는 말입니다.- cache가 동작 할 수 있는 철학에는 파레토 법칙이 있습니다.- Cache란 자주사용되는 데이터를 미리 올려놓는 저장소를 말한다. 쉽게 말해 사용자들은 원하는 데이터를 저장하고 나중에 요청이 오면 DB / API를 참조하지 않고 Cache를 접근하여 요청을 처리하게 된다. 

 

 

- Cache 구조 1 ( Look aside Cache ) 일반적으로 많이 사용되는 패턴

 

- Cache 구조 2 ( Write Back ) Write 작업이 많을 때 사용되는 패턴

- Write Back은 단점이 있다. 처음에 Cache Memory에 저장되기 때문에 서버에 문제가 발생하게 되면 Data 손실이 발생하게 된다. 

 

2. Redis 설치

 

2021.09.30 - [Redis] - [Redis] Redis 설치

 

[Redis] Redis 설치

많은 회사들이Database cache server용으로 Redis를 이용한다는 말을 듣고 Redis에 대해 공부해보기로 하였다. 오늘은 간단한 Redis 설치 과정에대해 포스팅해야지.. 1. Redis란? - 레디스는 Key-Value 구조의..

yunhyeonglee.tistory.com

 

■ 3.Redis TEST

- Python을 사용하여 Redis에 연결하는 동작을 Test 해보았다.

[root@redis ~]# pip3 install redis
Collecting redis
  Downloading https://files.pythonhosted.org/packages/a7/7c/24fb0511df653cf1a5d938d8f5d19802a88cef255706fdda242ff97e91b7/redis-3.5.3-py2.py3-none-any.whl (72kB)
    100% |████████████████████████████████| 81kB 1.6MB/s
Installing collected packages: redis
Successfully installed redis-3.5.3
You are using pip version 8.1.2, however version 21.2.4 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.


[root@redis ~]# cat redis_connect.py
import redis
r = redis.Redis(host="10.0.3.245", port=6379, password="test",decode_responses=True)


print(r.ping())                     #// True
print(r.set(name="name", value="test")) #// True
print(r.get(name="name"))  


[root@redis ~]# python redis_connect.py
True
True
test

■ 4. MySQL TEST

- Python으로 MySQL과 연결해 보았다.

[root@redis ~]# pip3 install pymysql
Collecting pymysql
  Downloading PyMySQL-1.0.2-py3-none-any.whl (43 kB)
     |████████████████████████████████| 43 kB 3.4 MB/s
Installing collected packages: pymysql
Successfully installed pymysql-1.0.2




[root@redis ~]# pip3 install pandas
Collecting pandas
  Downloading pandas-1.1.5-cp36-cp36m-manylinux1_x86_64.whl (9.5 MB)
     |████████████████████████████████| 9.5 MB 23.1 MB/s
Collecting python-dateutil>=2.7.3
  Downloading python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
     |████████████████████████████████| 247 kB 58.6 MB/s
Collecting numpy>=1.15.4
  Downloading numpy-1.19.5-cp36-cp36m-manylinux2010_x86_64.whl (14.8 MB)
     |████████████████████████████████| 14.8 MB 55.4 MB/s
Collecting pytz>=2017.2
  Downloading pytz-2021.1-py2.py3-none-any.whl (510 kB)
     |████████████████████████████████| 510 kB 54.0 MB/s
Collecting six>=1.5
  Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: six, pytz, python-dateutil, numpy, pandas
Successfully installed numpy-1.19.5 pandas-1.1.5 python-dateutil-2.8.2 pytz-2021.1 six-1.16.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv



[root@redis ~]# cat mysql.py   ## Linux 에서는 Pandas로했을때 안나온다.
import pymysql
mysql_db = pymysql.connect(
    user="root",
    passwd="root",
    host="10.0.3.224",
    port=3306,
    db="sakila",
)


cursor = mysql_db.cursor()
sql = "select * from actor;"
cursor.execute(sql)
result = cursor.fetchall()

import pandas as pd

result = pd.DataFrame(result)
result

Jupyter Notebook에서 실행해보았다.

■ 5. Cache Server 사용해보기

- Redis를 이용하여 Cache Server를 구현하고 같은 SQL문을 실행했을때 요청 시간을 비교해보았다.

[root@redis ~]# cat cache.py 
import redis
import pymysql
import time


# 레디스 클라이언트를 만든다
# Redis<ConnectionPool<Connection>>
r = redis.Redis(host="10.0.3.245", port=6379, password="test",decode_responses=True)
                
#pymysql로 mysql 연결
mysql_db = pymysql.connect(
    user="root",
    passwd="root",
    host="10.0.3.224",
    port=3306,
    db="employees",
)


#여기부터 실제 로직
result_list = []
#id=int(input("emp_no 입력 (6자리)")) #직접입력귀찮아서;
for emp_no in range(10200,10300):
    id= int(emp_no)
    first_time = time.time()
    result = r.get(name=id)
    print(id)


    if not result:
        print("no cache")
        cursor = mysql_db.cursor()
        sql = '''select emp_no,first_name from employees where emp_no=%s'''
        cursor.execute(sql, (int(id)))
        result = cursor.fetchone()
        r.set(name=result[0], value=result[1])

    else:
        print("cache")


    result = r.get(name=id) #if문에 넣을수있지만 동일한 조건을 주기위함
    last_time = time.time()
    timetotime = last_time-first_time
    print(timetotime, "Second\n")
    print(result)
    result_list.append(timetotime)
    print(sum(result_list)/len(result_list))


[root@redis ~]# python3 cache.py   ## Cache에 없을때
(생략)
Kristine
0.0009391903877258301
10296
no cache
0.0009417533874511719 Second

Petter
0.0009392168104034109
10297
no cache
0.0009377002716064453 Second

Narain
0.0009392013355177276
10298
no cache
0.0009076595306396484 Second

Dietrich
0.00093888273142805
10299
no cache
0.0009188652038574219 Second


[root@redis ~]# python3 cache.py   ##Cache에 있을떄
(생략)
Kristine
0.0003529191017150879
10296
cache
0.0003180503845214844 Second

Petter
0.00035255963040381363
10297
cache
0.0003380775451660156 Second

Narain
0.0003524118540238361
10298
cache
0.000354766845703125 Second

Dietrich
0.0003524356418185764
10299
cache
0.0003418922424316406 Second

**3배 더 빠른것을 볼 수 있다!!!!!

 

■ 참조

https://www.lostcatbox.com/2020/10/23/DB-cache-server/

 

DB-cache-server에 대해서 · lostcatbox

Word count: 1.2kReading time: 7 min  2020/10/23   Share

www.lostcatbox.com

https://www.youtube.com/watch?v=mPB2CZiAkKM&list=PLgXGHBqgT2TtGi82mCZWuhMu-nQy301ew&index=14

 

반응형

'Redis' 카테고리의 다른 글

Redis 6 Download & Install  (1) 2023.12.20
Redis Migration  (1) 2023.12.08
Redis - Maxmemory  (0) 2022.02.22
[Redis] Redis 설치  (1) 2021.09.30
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.