Computer >> 컴퓨터 >  >> 프로그램 작성 >> Redis

중단 없이 Redis SQL 쿼리를 실행하는 방법

Redis SQL 쿼리를 실행하는 것은 어렵지 않습니다. 사실 저는 몇 년 전에 소매 회사에서 데이터 웨어하우징 솔루션을 관리하는 친구와 이야기할 때 이 점을 제기했습니다. Redis가 직면한 문제를 설명하자 우리는 Redis의 쿼리에 대해 이야기하기 시작했습니다.

데이터 웨어하우징 솔루션에 문제가 있습니다. 데이터를 기록하고 실시간으로 분석 작업을 수행해야 하는 사용 사례가 있습니다. 그러나 때때로 결과를 얻는 데 몇 분이 걸립니다. 여기서 Redis가 도움이 될까요? 한 번에 SQL 기반 솔루션을 완전히 교체할 수는 없습니다. 우리는 한 번에 한 걸음만 내딛을 수 있습니다. "

이제 내 친구와 같은 상황에 처해 있다면 좋은 소식이 있습니다. Redis 쿼리를 실행하고 없이 아키텍처에 Redis를 도입할 수 있는 방법에는 여러 가지가 있습니다. 현재 SQL 기반 솔루션을 방해합니다.

이 작업을 수행하는 방법을 알아보겠습니다. 그러나 더 진행하기 전에 Redis에서 SQL로 데이터를 쿼리할 수 있는 자체 앱을 만든 Redis Hackathon 참가자가 있습니다.

아래 동영상을 시청하세요.

Redis 데이터 구조로 테이블 리모델링

테이블을 Redis 데이터 구조에 매핑하는 것은 매우 간단합니다. 따라야 할 가장 유용한 데이터 구조는 다음과 같습니다. 

  • 해시
  • 정렬된 집합
  • 설정

이를 수행할 수 있는 한 가지 방법은 테이블의 기본 키를 기반으로 하는 키를 사용하여 모든 행을 해시로 저장하고 키를 세트 또는 정렬된 세트에 저장하는 것입니다.

그림 1은 테이블을 Redis 데이터 구조에 매핑하는 방법의 예를 보여줍니다. 이 예에는 Products라는 테이블이 있습니다. 모든 행은 해시 데이터 구조에 매핑됩니다.

기본 ID가 10001인 행은 키가 product:10001인 해시로 들어갑니다. 이 예에는 두 개의 정렬된 세트가 있습니다. 첫 번째는 기본 키로 데이터 세트를 반복하고 두 번째는 가격을 기반으로 쿼리합니다.

중단 없이 Redis SQL 쿼리를 실행하는 방법


이 옵션을 사용하면 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 데이터 구조에 매핑됩니다.

중단 없이 Redis SQL 쿼리를 실행하는 방법

먼저 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가 실시간 데이터 전송을 보장하는 방법을 알고 싶다면 저희에게 연락하십시오.