DAY 66 데이터베이스 캐시 서비스 - NoSQL의 Redis 구성 및 최적화

캐시 개념

캐시는 속도가 서로 다른 두 개 이상의 물질의 속도를 조절하고 중간에 느린 물질을 가속시키는 역할을 합니다. 메모리는 CPU가 하드디스크에 자주 접근하는 데이터를 저장하기 위해 사용되며, 하드디스크에도 다양한 크기의 캐시가 존재하며 물리적 서버의 레이드 카드에도 캐시가 존재하는데, 모두 CPU의 속도를 높이기 위한 목적이다. 하드 디스크 데이터에 대한 액세스는 CPU의 속도가 너무 빠르기 때문에 CPU가 필요로 하는 데이터는 종종 하드 디스크로 인해 단기간에 CPU의 요구를 충족할 수 없으므로 CPU 캐시, 메모리 , RAID 카드 캐시 및 하드 디스크 캐시는 CPU의 데이터 요구 사항을 어느 정도 충족할 수 있습니다. 즉, CPU는 캐시에서 데이터를 읽을 수 있습니다. CPU 효율성을 크게 향상시킵니다.

시스템 캐시

버퍼 및 캐시:

  • 버퍼: 버퍼는 쓰기 버퍼라고도 합니다. 일반적으로 쓰기 작업에 사용됩니다. 데이터는 먼저 메모리에 쓴 다음 디스크에 쓸 수 있습니다. 버퍼는 일반적으로 쓰기 버퍼에 사용되어 서로 다른 미디어의 속도가 일치하지 않는 버퍼를 해결합니다. 데이터는 일시적으로 먼저 기록됩니다.가장 가까운 곳으로 쓰기 속도를 높이기 위해 CPU는 먼저 메모리의 디스크 버퍼에 데이터를 기록한 다음 데이터가 기록되었다고 생각한 다음 커널이 디스크에 기록합니다. 나중에 서버가 갑자기 정전되면 메모리의 데이터 일부가 손실됩니다.

  • 캐시: 캐시는 읽기 캐시라고도 하며 일반적으로 읽기 작업에 사용됩니다. CPU는 메모리에서 파일을 읽습니다. 메모리가 없으면 하드 디스크에서 메모리로 읽은 다음 CPU로 읽습니다. 자주 읽어야 하는 데이터를 가장 가까운 캐시 영역, 다음에 읽을 때 빠르게 읽을 수 있습니다.

캐시 저장 위치 및 계층 구조

  • 사용자 계층: 브라우저 DNS 캐시, 애플리케이션 DNS 캐시, 운영 체제 DNS 캐시 클라이언트
  • 프록시 레이어: CDN, 리버스 프록시 캐시
  • 웹 계층: 웹 서버 캐시
  • 애플리케이션 계층: 페이지 정적
  • 데이터 계층: 데이터 분산 캐시, 라이브러리
  • 시스템 계층: 운영 체제 캐시
  • 물리적 계층: 디스크 캐시, Raid 캐시

DNS 캐시

브라우저의 DNS 캐시는 기본적으로 60초로 설정되어 있습니다. 즉, 60초 이내에 동일한 도메인 이름에 액세스하면 DNS 확인이 수행되지 않습니다.

애플리케이션 계층 캐시

Nginx 및 PHP와 같은 웹 서비스는 사용자 요청에 대한 응답 속도를 높이기 위해 응용 프로그램 캐시를 설정할 수 있습니다.또한 PHP/Python/Java와 같은 일부 해석 언어는 직접 실행할 수 없으며 먼저 바이트 코드로 컴파일해야 하지만 바이트 코드는 기계 코드는 나중에 실행될 수 있으므로 바이트 코드도 일종의 캐시이며 때때로 프로그램 코드가 시작된 후 바이트 코드가 업데이트되지 않는 현상이 있습니다. 따라서 새 버전을 실행하기 전에 먼저 애플리케이션 캐시를 지운 다음 새 버전을 실행해야 합니다.

또한 동적 페이지 정적 기술을 사용하여 액세스 속도를 높일 수 있습니다. 예를 들어 데이터베이스 데이터의 동적 페이지에 액세스하려면 프로그램을 사용하여 정적 페이지 파일 html을 미리 생성하고 전자 상거래 웹 사이트의 제품 소개, 의견 정보, 비실시간 데이터 등을 이 기술을 이용하여 구현할 수 있습니다.

 데이터 레이어 캐시

분산 캐시 서비스:

  • 레디스
  • 멤캐시드

데이터 베이스:

  • MySQL 쿼리 캐시
  • innodb 캐시, MYISAM 캐시

 하드웨어 캐시

  • CPU 캐시(L1 데이터 캐시 및 L1 명령 캐시), L2 캐시, L3 캐시
  • 디스크 캐시: 디스크 캐시
  • 디스크 어레이 캐시: 전원 장애로 인한 데이터 손실을 방지하기 위해 배터리를 사용할 수 있는 RAID 캐시

관계형 및 비관계형 데이터베이스

관계형 데이터베이스

  • 관계형 데이터베이스는 일반적으로 레코드를 지향하는 관계형 모델(2차원 테이블 모델)을 기반으로 구축된 구조화된 데이터베이스입니다.
  • SQL 문(Standard Data Query Language)은 관계형 데이터베이스를 기반으로 하는 언어로 관계형 데이터베이스에서 데이터를 검색하고 연산하는 데 사용됩니다.
  • 주요 관계형 데이터베이스에는 Oracle, MySQL, SQL Server, Microsoft Access, DB2, PostgreSQL 등이 포함됩니다.

위의 데이터베이스를 사용할 때 먼저 데이터베이스를 구축하고, 테이블을 구축하고, 테이블 구조를 설계한 다음 테이블 구조에 따라 데이터를 저장해야 합니다.데이터가 테이블 구조와 일치하지 않으면 저장에 실패합니다.

비관계형 데이터베이스

  • "not just SQL"을 의미하는 NoSQL(NoSQL=NotonlysQL)은 비관계형 데이터베이스의 일반적인 용어입니다.
  • 주류 관계형 데이터베이스 이외의 데이터베이스는 비관계형으로 간주됩니다.
  • 데이터 저장 테이블 구조를 정의하기 위해 데이터베이스와 테이블을 미리 구축할 필요가 없습니다.각 레코드는 서로 다른 데이터 유형과 필드 수(예: WeChat 그룹 채팅의 텍스트, 사진, 비디오, 음악 등)를 가질 수 있습니다.
  • 주류 NOSQL 데이터베이스로는 Redis, MongBD, Hbase(빅데이터에 사용되는 분산 비관계형 데이터베이스), Memcached, ElasticSearch(ES, 인덱스 데이터베이스라고도 함), TSDB(시간 연속 데이터베이스) 등이 있습니다.

관계형 데이터베이스와 비관계형 데이터베이스의 차이점:

(1) 다양한 데이터 저장 방법

관계형 데이터베이스와 비관계형 데이터베이스의 주요 차이점은 데이터가 저장되는 방식입니다.

  • 관계형 데이터는 기본적으로 테이블 형식이므로 데이터 테이블의 행과 열에 저장됩니다. 데이터 테이블은 서로 연관되어 공동으로 저장될 수 있으며 데이터 추출도 쉽습니다.
  • 반대로 비관계형 데이터는 테이블의 행과 열에 맞지 않고 큰 덩어리로 함께 그룹화됩니다. 비관계형 데이터는 일반적으로 문서, 키-값 쌍 또는 그래프 구조와 같은 데이터 세트에 저장됩니다. 데이터와 해당 특성은 데이터를 저장하고 추출하는 방법을 선택하는 데 가장 큰 영향을 미치는 요소입니다. (데이터 유형을 전환하기 쉽고 데이터 세트에 여러 데이터 유형이 있음)

(2) 다른 확장 방법

SQL과 NoSQL 데이터베이스의 가장 큰 차이점은 확장 방식에 있을 수 있으며, 증가하는 수요를 지원하기 위해서는 확장이 필요합니다.

  • 더 많은 동시성을 지원하기 위해 SQL 데이터베이스를 확장합니다 . 즉, 처리 능력을 높이고 더 빠른 컴퓨터를 사용하여 동일한 데이터 세트를 더 빠르게 처리할 수 있습니다. 데이터가 관계형 테이블에 저장되기 때문에 많은 테이블이 포함될 수 있는 작업의 성능 병목 현상은 컴퓨터 성능을 향상하여 극복해야 합니다. SQI 데이터베이스는 발전의 여지가 많지만 종국에는 분명히 수직적 확장의 상한선에 도달할 것입니다. (데이터는 일반적으로 로컬 파일 시스템에 저장됩니다. 읽기는 읽기-쓰기 분리 및 로드 밸런싱을 통해 성능을 공유할 수 있지만 읽기와 쓰기는 여전히 IO 성능을 소비합니다.)
  • 반면에 NoSQL 데이터베이스는 수평적으로 확장됩니다 . 비관계형 데이터 저장소가 자연스럽게 분산되기 때문에 NoSQL 데이터베이스의 확장은 리소스 풀에 더 많은 공통 데이터베이스 서버(노드)를 추가하여 로드를 공유할 수 있습니다. (데이터 분배는 서로 다른 서버에 저장되며, 동시에 읽고 쓸 수 있어 효율성을 높일 수 있음)

팁:

  • 수평적 확장: 서버를 추가합니다. (저렴)
  • 수직 확장: 고성능 CPU로 변경, CPU 코어, 하드 디스크, 디스크 IO 및 메모리 스틱 수 증가와 같은 하드웨어 구성을 개선합니다. (하드디스크를 제외하고 나머지는 종료해야 추가할 수 있음)

(3) 트랜잭션에 대한 다양한 지원

  • 데이터 작업에 높은 트랜잭션이 필요하거나 복잡한 데이터 쿼리가 실행 계획을 제어해야 하는 경우 성능 및 안정성 측면에서 기존 SQL 데이터베이스가 최선의 선택입니다. SQL 데이터베이스는 트랜잭션 원자성에 대한 세분화된 제어를 지원하며 트랜잭션을 쉽게 롤백할 수 있습니다.
  • NoSQL 데이터베이스도 트랜잭션 연산을 사용할 수 있지만 안정성 측면에서 관계형 데이터베이스와 비교할 수 없기 때문에 연산의 확장성과 대량의 데이터 처리에 진정한 가치가 있습니다.
  • 비관계형 데이터베이스는 트랜잭션 처리 및 안정성 측면에서 관계형 데이터베이스보다 열등합니다. 그러나 읽기 및 쓰기 성능이 좋고 확장이 용이하며 대용량 데이터 처리에 장점이 있습니다.

관계형 데이터베이스: 높은 트랜잭션 요구 사항 및 실행 계획을 제어해야 하는 작업에 특히 적합하며 세분화된 트랜잭션 제어가 더 좋습니다.

비관계형 데이터베이스: 트랜잭션 제어가 약간 약하고 높은 확장성과 대용량 데이터 처리에 가치가 있습니다.

비관계형 데이터베이스의 배경

Web2.0 순수 동적 웹 사이트 유형의 세 가지 높은 문제를 처리하는 데 사용할 수 있습니다.

(1) 고성능 - 데이터베이스에 대한 높은 동시 읽기 및 쓰기 요구 사항.

(2) Hugestorage - 대용량 데이터에 대한 효율적인 저장 및 액세스가 필요합니다.

(3) HighScalability&&HighAvailability - 데이터베이스의 높은 확장성 및 고가용성에 대한 요구 사항.

관계형 데이터베이스와 비관계형 데이터베이스는 고유한 특성과 응용 시나리오가 있으며, 이 둘의 긴밀한 결합은 web2.0 데이터베이스 개발에 새로운 아이디어를 가져올 것입니다. 관계형 데이터베이스는 관계 및 데이터 일관성 보장에 중점을 두고 비관계형 데이터베이스는 스토리지 및 고효율에 중점을 둡니다 . 예를 들어, 읽기와 쓰기가 분리된 MySQI 데이터베이스 환경에서 자주 접근하는 데이터(즉, 열량이 높은 데이터)를 비관계형 데이터베이스에 저장하여 접근 속도를 높일 수 있다.

2.5 요약

관계형 데이터베이스:

  • 예 --> 데이터베이스 --> 테이블(테이블) --> 레코드 행(행), 데이터 필드(열)

비관계형 데이터베이스:

  • 인스턴스 --> 데이터베이스 --> 컬렉션(collection) --> 키-값 쌍(key-value)

  • 비관계형 데이터베이스는 데이터베이스 및 컬렉션(테이블)을 수동으로 생성할 필요가 없습니다.

레디스 소개

Redis(원격 사전 서버)는 C로 작성된 오픈 소스 NoSQL 데이터베이스입니다.

Redis는 메모리를 기반으로 실행되며 지속성을 지원하며 현재 분산 아키텍처의 필수 요소인 키-값(키-값 쌍) 스토리지 형식을 채택합니다.

Redis 서버 프로그램은 단일 프로세스 모델입니다. 즉, 한 서버에서 여러 Redis 프로세스를 동시에 시작할 수 있으며 Redis의 실제 처리 속도는 전적으로 주 프로세스의 실행 효율성에 달려 있습니다.

  • 서버에서 하나의 Redis 프로세스만 실행 중인 경우 여러 클라이언트가 동시에 액세스하면 서버의 처리 용량이 어느 정도 감소합니다.
  • 동일한 서버에서 여러 Redis 프로세스가 시작되면 Redis는 동시 처리 기능을 향상시키면서 서버의 CPU에 많은 부담을 줍니다.

즉, 실제 프로덕션 환경에서 실제 요구 사항에 따라 몇 개의 Redis 프로세스를 열지 결정해야 합니다. 높은 동시성에 대한 요구 사항이 더 높은 경우 동일한 서버에서 여러 프로세스를 여는 것을 고려할 수 있습니다. CPU 리소스가 상대적으로 부족한 경우 단일 프로세스를 사용할 수 있습니다.

Redis에는 다음과 같은 장점이 있습니다.

(1) 높은 데이터 읽기 및 쓰기 속도: 데이터 읽기 속도는 최대 110,000회/초에 도달할 수 있으며 데이터 쓰기 속도는 최대 81,000회/초에 도달할 수 있습니다.

(2) 지원되는 데이터 구조: 키-값, 문자열, 목록, 해시, 세트 및 정렬된 세트 및 기타 데이터 유형 작업과 같은 풍부한 데이터 유형을 지원합니다.

  • 문자열 문자열 유형
  • 목록 목록 유형
  • 해시 해시(해시)
  • 정렬되지 않은 컬렉션 설정
  • 정렬된 세트 정렬된 컬렉션(또는 zsets)

(redis는 Sorted Sets를 통해 구현할 수 있는 메시지 큐로도 사용할 수 있습니다.)

(3) 지원 데이터 지속성: 메모리의 데이터를 디스크에 저장하고 다시 시작할 때 다시 로드하여 사용할 수 있습니다.

(4) 원자성: 모든 Redis 작업은 원자성입니다. (지원 트랜잭션, 모든 작업은 트랜잭션으로 처리됨)

(5) 지원 데이터 백업: 마스터-살브 모드에서 데이터 백업. (마스터-슬레이브 복제 지원)

레디스의 단점

  1. 캐시 및 데이터베이스 이중 쓰기 일관성 문제
  2. 캐시 사태 문제
  3. 캐시 고장 문제
  4. Cache ## Redis 적용 시나리오
  • 메모리 기반 데이터베이스인 Redis는 일반적으로 세션 캐시, 대기열, 순위표, 카운터, 최근 가장 인기 있는 기사, 최근 가장 인기 있는 댓글, 게시 구독 등에 사용되는 고성능 캐시입니다.
  • Redis는 높은 실시간 데이터 요구 사항, 만료 및 제거 특성이 있는 데이터 스토리지, 지속성이 필요하지 않거나 약한 일관성 및 간단한 논리가 있는 시나리오에 적합합니다.

Redis가 왜 그렇게 빠릅니까?

  • 1. Redis는 디스크 I/O와 같은 시간 소모적인 작업을 방지하는 순수한 메모리 구조입니다. (메모리 기반으로 실행)

  • 2. Redis 명령 처리의 핵심 모듈은 단일 스레드이므로 잠금 경쟁, 빈번한 스레드 생성 및 소멸 비용을 줄이고 스레드 컨텍스트 전환 소비를 줄입니다. (단일 스레드 모델)

  • 3. I/O 다중화 메커니즘이 채택되어 동시성 효율성이 크게 향상됩니다. (에폴 모드)

메모:

Linux 시스템에는 디스크 I/O와 네트워크 요청 I/O의 두 가지 유형의 I/O가 있습니다.

Redis 6.0에 새로 추가된 멀티스레딩은 네트워크 요청 처리에 다중 선형성만 사용하는 반면 데이터 읽기 및 쓰기 명령은 여전히 ​​단일 스레드에서 처리됩니다.

Redis와 memcached의 비교

 Redis 설치 및 배포

关闭防火墙
systemctl stop firewalld
setenforce 0
#安装依赖环境
yum install -y gcc gcc-c++ make
 
#解压文件到指定文件夹 opt
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
#安装
make
make PREFIX=/usr/local/redis install
#执行软件包提供的install_server.sh 脚本文件,设置Redis服务所需要的相关配置文件
cd /opt/redis-5.0.7/utils
./install_server.sh
……
慢慢回车
Please select the redis executable path []
手动输入
/usr/local/redis/bin/redis-server
 
#创建软链接
ln -s /usr/local/redis/bin/* /usr/local/bin/
 
/etc/init.d/redis_6379 stop				#停止
/etc/init.d/redis_6379 start			#启动
/etc/init.d/redis_6379 restart			#重启
/etc/init.d/redis_6379 status	
 
vim /etc/redis/6379.conf
 
70行,添加 监听的主机地址
bind 127.0.0.1 192.168.137.10				
 
93行,Redis默认的监听端口
port 6379									
 
137行,启用守护进程
daemonize yes							
 
159行,指定 PID 文件
pidfile /var/run/redis_6379.pid				
 
167行,日志级别
loglevel notice								
 
172行,指定日志文件
logfile /var/log/redis_6379.log				
------------------------------------------
#重启服务
/etc/init.d/redis_6379 restart

패키지의 압축을 풀고 컴파일하십시오.

지정된 디렉토리에 설치

 패키지에서 제공하는 스크립트 파일 실행 및 소프트 연결

 redis 서비스 시작 및 확인

수신 호스트를 추가하려면 구성 파일을 입력하십시오.

서비스 재시작

 

  Redis 명령 도구

  • redis-server: Redis 시작 도구
  • redis-benchmark: 머신에서 Redis의 운영 효율성을 감지하는 데 사용됩니다.
  • redis-check-aof: AOF 영구 파일 복구
  • redis-check-rdb: RDB 영구 파일 복구
  • redis-cli: Redis 명령줄 도구

redis-cli 명령줄 도구

语法:redis-cli -h host -p port -a password 
 
-h:指定远程主机
-p:指定Redis服务的端口号
-a:指定密码,未设置数据库密码可以省略-a选项若不添加任何选项表示,则使用127.0.0.1:6379连接本机上的Redis数据库  
redis-cli -h 192.168.137.10 -p 6379     #登录指定主机redis
redis-cli                               #登录本机redis

 

 redis -벤치마크 테스트 도구

redis-benchmark는 Redis 서비스의 성능을 효과적으로 테스트할 수 있는 공식 Redis 성능 테스트 도구입니다.

 基本的测试语法:redis-benchmark [选项] [选项值]
옵션 효과
-시간 서버 호스트 이름 지정
서버 포트 지정
-에스 서버 소켓 지정
-N 요청 수 지정
-디 SET/GET 값의 데이터 크기를 바이트 단위로 지정
-케이 1=활성 유지 0=재연결
-아르 자형 SET/GET/INCR 임의 키 사용, sADD 임의 값 사용
-피 파이프 <numerq> 요청
--csv csv 형식으로 출력합니다.
-l (소형 L) 루프 생성, 영원히 테스트 실행
-티 쉼표로 구분된 테스트 명령 목록만 실행
-I(대I) 유휴 모드. N 유휴 연결만 열고 대기

성능 테스트를 위해 IP 주소 192.168.137.10 및 포트 6379로 Redis 서버에 100개의 동시 연결 및 100,000개의 요청을 보냅니다.

redis-benchmark -h 192.168.137.10 -p 6379 -c 100 -n 100000
#测试存取大小为100字节的数据包的性能
redis-benchmark -h 192.168.137.10 -p 6379 -q -d 100
 
#测试本机上Redis服务在进行 set与1push操作时的性能
redis-benchmark -t set,lpush -n 100000 -q

 Redis 데이터베이스 일반 명령

대소문자를 구분하지 않음

 set     存放数据,命令格式为 set key value
 get     获取数据,命令格式为 get key
redis-cli
127.0.0.1:6379> set name my  #设置name值为my
OK
127.0.0.1:6379> get name     #查看name的值
"my"

 데이터베이스의 키 상태 확인

 keys    命令可以取符合规则的键值列表,通常情况可以结合*、?等选项来使用。
 exists  命令可以判断键值是否存在。
 del     命令可以删除当前数据库的指定 key。
 type    命令可以获取 key 对应的 value 值类型。

키는 데이터베이스의 키를 봅니다.

  열쇠? 与 키 *

set qq 1
set qq1 2
set q2 3
set q4 4
keys q?
keys q*

  열쇠 ??

exists 명령은 키 값이 존재하는지 여부를 판별할 수 있습니다.

 exists qq#判断 qq键是否存在
 #1表示 qq键是存在
 exists q
 #0表示q键不存在

 del 명령은 현재 데이터베이스의 지정된 키를 삭제할 수 있습니다.

del 键名

 type 명령은 키에 해당하는 값 유형을 가져올 수 있습니다.

type 键名

 이름 바꾸기 명령은 기존 키의 이름을 바꾸는 것입니다.

(覆盖)命令格式:rename 源key 目标key

rename 명령을 사용하여 이름을 변경하면 대상 키의 존재 여부에 관계없이 이름 변경이 수행되며 원본 키의 값이 대상 키의 값을 덮어씁니다. 실제 사용 시에는 exists 명령을 사용하여 대상 키가 존재하는지 확인한 후 중요한 데이터를 덮어쓰지 않도록 rename 명령을 실행할지 여부를 결정하는 것이 좋습니다.

 renamenx 명령

renamenx 명령은 기존 키의 이름을 바꾸고 새 이름이 있는지 감지하는 것입니다. 대상 키가 있으면 이름이 바뀌지 않습니다.

 (不覆盖)命令格式:renamenx 源key 目标key

 dbsize 명령은 현재 데이터베이스의 키 수를 확인합니다.

dbsize

 config set requirepass password 명령을 사용하여 암호를 설정합니다.

config set requirepass 密码

config get requirepass 명령을 사용하여 암호를 확인합니다(암호가 설정되면 먼저 암호를 확인해야 합니다. 그렇지 않으면 모든 작업을 사용할 수 없음 ) .

config get requirepass

비밀번호 삭제

 config  set requirepass ''

Redis 다중 데이터베이스 공통 명령

  • Redis는 다중 데이터베이스를 지원합니다.Redis는 기본적으로 16개의 데이터베이스를 포함하고 있으며 데이터베이스 이름은 0-15의 숫자로 순차적으로 이름이 지정됩니다.
  • 여러 데이터베이스는 서로 독립적이며 서로 간섭하지 않습니다.

여러 데이터베이스 간 전환

 命令格式:select 序号

redis-cli를 사용하여 Redis 데이터베이스에 연결한 후 일련 번호가 0인 데이터베이스가 기본적으로 사용됩니다.

여러 데이터베이스 간에 데이터 이동

 格式:move 键值 序号

데이터베이스의 데이터 지우기

 FLUSHDB :清空当前数据库数据
 FLUSHALL :清空所有数据库的数据,慎用!

추천

출처blog.csdn.net/weixin_57560240/article/details/130912989