[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 설치
■ 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 |
■ 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/
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 |
소중한 공감 감사합니다