Redis SQL 쿼리를 실행하는 것은 어렵지 않습니다. 사실 저는 몇 년 전에 소매 회사에서 데이터 웨어하우징 솔루션을 관리하는 친구와 이야기할 때 이 점을 제기했습니다. Redis가 직면한 문제를 설명하자 우리는 Redis의 쿼리에 대해 이야기하기 시작했습니다.
“데이터 웨어하우징 솔루션에 문제가 있습니다. 데이터를 기록하고 실시간으로 분석 작업을 수행해야 하는 사용 사례가 있습니다. 그러나 때때로 결과를 얻는 데 몇 분이 걸립니다. 여기서 Redis가 도움이 될까요? 한 번에 SQL 기반 솔루션을 완전히 교체할 수는 없습니다. 우리는 한 번에 한 걸음만 내딛을 수 있습니다. "
이제 내 친구와 같은 상황에 처해 있다면 좋은 소식이 있습니다. Redis 쿼리를 실행하고 없이 아키텍처에 Redis를 도입할 수 있는 방법에는 여러 가지가 있습니다. 현재 SQL 기반 솔루션을 방해합니다.
이 작업을 수행하는 방법을 알아보겠습니다. 그러나 더 진행하기 전에 Redis에서 SQL로 데이터를 쿼리할 수 있는 자체 앱을 만든 Redis Hackathon 참가자가 있습니다.
아래 동영상을 시청하세요.
Redis 데이터 구조로 테이블 리모델링
테이블을 Redis 데이터 구조에 매핑하는 것은 매우 간단합니다. 따라야 할 가장 유용한 데이터 구조는 다음과 같습니다.
- 해시
- 정렬된 집합
- 설정
이를 수행할 수 있는 한 가지 방법은 테이블의 기본 키를 기반으로 하는 키를 사용하여 모든 행을 해시로 저장하고 키를 세트 또는 정렬된 세트에 저장하는 것입니다.
그림 1은 테이블을 Redis 데이터 구조에 매핑하는 방법의 예를 보여줍니다. 이 예에는 Products라는 테이블이 있습니다. 모든 행은 해시 데이터 구조에 매핑됩니다.
기본 ID가 10001인 행은 키가 product:10001인 해시로 들어갑니다. 이 예에는 두 개의 정렬된 세트가 있습니다. 첫 번째는 기본 키로 데이터 세트를 반복하고 두 번째는 가격을 기반으로 쿼리합니다.
이 옵션을 사용하면 SQL 명령 대신 Redis 쿼리를 사용하도록 코드를 변경해야 합니다. 다음은 SQL 및 Redis에 해당하는 명령의 몇 가지 예입니다.
아. 데이터 삽입
SQL: insert into Products (id, name, description, price) values = (10200, “ZXYW”,“Description for ZXYW”, 300);
Redis: MULTI HMSET product:10200 name ZXYW desc “Description for ZXYW” price 300 ZADD product_list 10200 product:10200 ZADD product_price 300 product:10200 EXEC
나. 제품 ID로 쿼리
SQL: select * from Products where id = 10200
Redis: HGETALL product:10200
다. 가격으로 쿼리
SQL: select * from Product where price < 300
Redis: ZRANGEBYSCORE product_price 0 300
이것은 product:10001, product:10002, product:10003 키를 반환합니다. 이제 각 키에 대해 HGETALL을 실행합니다.
HGETALL product:10001 HGETALL product:10002 HGETALL product:10003
DataFrame을 사용하여 테이블을 Redis 데이터 구조에 자동으로 매핑
이제 솔루션에서 SQL 인터페이스를 유지 관리하고 기본 데이터 저장소를 Redis로 변경하여 더 빠르게 만들고 싶다면 Apache Spark 및 Spark-Redis 라이브러리를 사용하면 됩니다.
Spark-Redis 라이브러리를 사용하면 DataFrame API를 사용하여 Redis 데이터를 저장하고 액세스할 수 있습니다. 즉, SQL 명령을 사용하여 데이터를 삽입, 업데이트 및 쿼리할 수 있지만 데이터는 내부적으로 Redis 데이터 구조에 매핑됩니다.
먼저 spark-redis를 다운로드하고 jar 파일을 가져오기 위해 라이브러리를 빌드해야 합니다. 예를 들어, spark-redis 2.3.1을 사용하면 spark-redis-2.3.1-SNAPSHOT-jar-with-Dependency.jar을 얻습니다.
그런 다음 Redis 인스턴스가 실행 중인지 확인해야 합니다. 이 예에서는 localhost 및 기본 포트 6379에서 Redis를 실행합니다.
Apache Spark 엔진에서 쿼리를 실행할 수도 있습니다. 다음은 이를 수행하는 방법의 예입니다.
$ spark-shell --jars spark-redis-2.3.1-SNAPSHOT-jar-with-dependencies.jar
scala> import org.apache.spark.sql.SparkSession scala> val spark = SparkSession .builder() .appName("redis-sql") .master("local[*]") .config("spark.redis.host","localhost") .config("spark.redis.port","6379").getOrCreate() scala> import spark.sql scala> import spark.implicits._ scala> sql("create table if not exists products(id string, name string, description string, price int) using org.apache.spark.sql.redis options (table 'product')") scala> sql("insert into products values = ('10200','ZXYW','Description of ZXYW', 300)") scala> val results = sql("select * from products") scala> results.show() +-----+----+-------------------+-----+ | id|name| description|price| +-----+----+-------------------+-----+ |10200|ZXYW|Description of ZXYW| 300| +-----+----+-------------------+-----+
이제 Redis 클라이언트를 사용하여 이 데이터를 Redis 데이터 구조로 액세스할 수도 있습니다.
127.0.0.1:6379> keys product* 1) "product:2e3f8611dbe94a588706a2aaea547caa"
데이터를 탐색할 때 페이지를 매길 수 있으므로 스캔 명령을 사용하는 것이 더 효과적인 방법입니다.
127.0.0.1:6379> scan 0 match product* 1) "3" 2) 1) "product:2e3f8611dbe94a588706a2aaea547caa" 127.0.0.1:6379> hgetall product:2e3f8611dbe94a588706a2aaea547caa 1) "name" 2) "ZXYW" 3) "price" 4) "300" 5) "description" 6) "Description of ZXYW" 7) "id" 8) "10200"
중단 없이 Redis SQL 쿼리를 실행할 수 있는 두 가지 간단한 방법이 있습니다. 한 단계 더 나아가 SQL Server에 Redis가 필요한 이유를 확인하는 것이 좋습니다. 새 백서에서.
그러나 Redis의 실시간 데이터와 관련하여 이것은 실시간 경험을 제공하는 데 사용할 수 있는 여러 가지 방법 중 하나일 뿐입니다.
Redis가 실시간 데이터 전송을 보장하는 방법을 알고 싶다면 저희에게 연락하십시오.