캐시에 Redis 또는 Memcached 및 Node 사용

여보게, 덕부
이 강좌에서 캐시에 대해 토론합시다. 사용자 세션을 추적하고 싶다고 가정한 jasonwebtoken에 대해 토론한 적이 있습니다.응용 프로그램에서 Redis 또는 Memcached를 사용할 수 있습니다.
캐시는 파일 복사본을 캐시나 임시 저장소에 저장하는 과정으로 더 빨리 접근할 수 있습니다.기술적으로 캐시는 파일이나 데이터 복사본의 임시 저장 위치이지만, 이 용어는 일반적으로 인터넷 기술을 가리키는 데 쓰인다.
Redis와Memcached는 매우 빠른 메모리 데이터 구조 저장이기 때문에 소형과 비복잡한 데이터의 잃어버리기 쉬운 저장과 매우 빠른 검색에 적합하다.
그것들은 대량의 데이터를 저장하는 데 쓰이지 않는다.기호화폐, 빠르게 변화하는 데이터 등은 모두 매우 이상적이다.올바른 설정이 없으면 고객에게 유행이 지난 데이터를 제공할 수 있기 때문에 조심해야 합니다.
Redis와 Memcached의 배후 논리를 사용하는 장면을 살펴보겠습니다.

정경 A


프로그램에서 모든 내용을 동시에 가져오기를 원하지 않습니다.사용자가 100개의 내용을 얻으려고 하지만, 한 번에 모든 내용을 얻지 않고, 대량으로 얻는다고 가정하십시오.
AWS DynamoDB를 사용하려면 데이터베이스에 페이지가 나누어지지 않도록 항상 LastEvaluatedKey를 제공해야 합니다.이 LastEvaluatedKey는 항상 Redis 또는 Memcached에 저장될 수 있습니다.Google 브라우저는 항상 요청을 캐시하기 때문에, 논리는 Google이 가지고 있지 않은 것만 가져오려고 하기 때문에 Last EvaluatedKey를 사용합니다.따라서 우리는 항상 얻기 전에 평가를 진행할 것이다.
이것은 응용 프로그램의 API 취득 비용을 낮출 것이다.대규모 애플리케이션 API 요청을 올바르게 처리하지 못하면 비용이 많이 듭니다.

정경 B


SAAS 제품이 있고 제한된 무료 버전을 원한다고 가정하십시오.Cloudflare에서 사이트를 호스팅합니다.사용자의 세부내용을 추적하여 임시로 저장할 수 있으므로 만료 후 재시도에서 제품에 액세스할 수 없습니다.
브라우저에 복사 및 붙여넣기
https://www.cloudflare.com/cdn-cgi/trace
이것이 바로 네가 얻게 될 대답이다
fl=4f422
h=www.cloudflare.com
ip=64.119.22.100
ts=1575967108.245
visit_scheme=https
uag=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36 Hypothesis-Via
colo=SJC
http=http/1.1
loc=US
tls=TLSv1.3
sni=plaintext
warp=off
이 응답을 통해 IP 주소를 임시로 저장하여 SAAS 무료 버전 사용을 추적할 수 있습니다.

정경


만약 네가 사이트의 총 방문량을 추적하고 싶다면.웹 사이트의 총 방문량을 저장하여 응용 프로그램에 표시할 수 있습니다.
나는 이미 다른 장면을 제시했지만, 많은 장면들이 응용 프로그램에서 캐시를 해야 한다.

레디스


응용 프로그램에 Redis를 설치합니다.
yarn add redis

에반 선생


응용 프로그램에 Redis 구성을 추가합니다.환경 파일.
REDIS_HOST=redis- // using the server labs
REDIS_PORT=6379
REDIS_PASSWORD=Cn*****************
...
https://redislabs.com/try-free/를 사용하여 30MB의 레지스터를 무료로 받거나 용기https://hub.docker.com/_/redis/로 받습니다.

실제 목적에서 나는 다이나믹DB의 예를 들 것이다.


각 요청에 대한 JSON의 응답은 다음과 같습니다.LastEvaluatedKey를 참고하십시오.데이터베이스에 더 이상 항목이 없으면 질의 요청에서 이 LastEvaluatedKey를 사용할 수 없습니다.
{
   "ConsumedCapacity": { 
      "CapacityUnits": number,
      "GlobalSecondaryIndexes": { 
         "string" : { 
            "CapacityUnits": number,
            "ReadCapacityUnits": number,
            "WriteCapacityUnits": number
         }
      },
      "LocalSecondaryIndexes": { 
         "string" : { 
            "CapacityUnits": number,
            "ReadCapacityUnits": number,
            "WriteCapacityUnits": number
         }
      },
      "ReadCapacityUnits": number,
      "Table": { 
         "CapacityUnits": number,
         "ReadCapacityUnits": number,
         "WriteCapacityUnits": number
      },
      "TableName": "string",
      "WriteCapacityUnits": number
   },
   "Count": number,
   "Items": [ 
      { 
         "string" : { 
            "B": blob,
            "BOOL": boolean,
            "BS": [ blob ],
            "L": [ 
               "AttributeValue"
            ],
            "M": { 
               "string" : "AttributeValue"
            },
            "N": "string",
            "NS": [ "string" ],
            "NULL": boolean,
            "S": "string",
            "SS": [ "string" ]
         }
      }
   ],
   "LastEvaluatedKey": { 
      "string" : { 
         "B": blob,
         "BOOL": boolean,
         "BS": [ blob ],
         "L": [ 
            "AttributeValue"
         ],
         "M": { 
            "string" : "AttributeValue"
         },
         "N": "string",
         "NS": [ "string" ],
         "NULL": boolean,
         "S": "string",
         "SS": [ "string" ]
      }
   },
   "ScannedCount": number
}
에 awssdk를 설치하고 자격 증명을 업데이트합니다.환경 파일.
yarn add aws-sdk 
.env 파일
AWS_REGION=your_region
AWS_ACCESS_KEY_ID=your_access_key_id
AWS_SECRET_ACCESS_KEY=your_secret_access_key
내 요청에서 API를 가져오면 데이터베이스를 검색하고 모든 데이터를 반환합니다.이상적인 상황에서, 우리는 사용자가 하나의 요청에서 데이터베이스에서 무엇을 얻을 수 있는지 제한하기를 희망한다.
다음은 제한을 추가하기 전의 요청입니다.우리는 현재 여섯 개의 항목이 있다.

우리가 우리의 제한을 다섯 가지로 늘릴 때.

마지막 검색 항목을 나타내는 LastEvaluatedKey가 있습니다.즉, 다음 요청에서 LastEvaluatedKey에서 항목을 가져옵니다.
이것이 바로 우리가 Redis나 Memcached에 저장하고자 하는 내용입니다. 그러면 고객이 무엇을 검색해야 하는지 알 수 있습니다.
Last EvaluatedKey를 확인하면 다음 검색은 Exclusive StartKey에 저장되고 설정된 내용을 사용하여 더 많은 항목을 검색합니다
나는 우리의 의견이 일치하기를 바란다.

색인js


Redis를 가져오고 응용 프로그램에서 구성합니다.
const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
require('dotenv').config()
const app = express();

// parse application/json
app.use(bodyParser.json())

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }))

// use cors options
app.use(cors())

// aws configuration
var AWS = require("aws-sdk");
AWS.config.update({
  region: process.env.AWS_REGION,
  accessKeyId: process.env.AWS_ACCESS_KEY_ID,
  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
});


// redis
const redis = require("redis");
const client = redis.createClient({
   host: process.env.REDIS_HOST,
   port: process.env.REDIS_PORT,
});
// i am using redis from redis server labs
client.auth(process.env.REDIS_PASSWORD)
// let us have a default value
client.set("LastEvaluatedKey", 0)

// catch redis error
client.on("error", function(error) {
  console.error(error);
});

// home route
app.get("/", async (req, res) => {  
    client.get("LastEvaluatedKey", async(err, data) => {
        if(err) console.log(err)
        if(parseInt(data) === 0){
          let item = { id: 0}
          const response = await scanTable(item)
          client.set("LastEvaluatedKey", JSON.stringify(response.LastEvaluatedKey))
          res.send(JSON.stringify(response))
        } else {
          const response = await scanTable(JSON.parse(data))
          client.set("LastEvaluatedKey", JSON.stringify(response.LastEvaluatedKey))
          res.send(JSON.stringify(response))
        }
    }) 
})

const scanTable = async (item) => {
  var params = {
    TableName : 'redis_memcached',
    Limit: 5,
    ExclusiveStartKey: item 
  };
  var db = new AWS.DynamoDB.DocumentClient();
  const results = await db.scan(params).promise()
  return results
}

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}.`);
});

Memcached


Linux에 Memcached 설치
wget http://memcached.org/latest
tar -zxvf memcached-1.x.x.tar.gz
cd memcached-1.x.x
./configure && make && make test && sudo make install
또는 Docker 컨테이너를 사용하여 하나를 호스팅합니다.
yarn add Memcached
색인에서memcahed를 가져옵니다.js를 설정합니다.
const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
require('dotenv').config()
const app = express();

// parse application/json
app.use(bodyParser.json())

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }))

// use cors options
app.use(cors())

// aws configuration
var AWS = require("aws-sdk");
AWS.config.update({
  region: process.env.AWS_REGION,
  accessKeyId: process.env.AWS_ACCESS_KEY_ID,
  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
});


// memcached
var Memcached = require('memcached');
var memcached = new Memcached(process.env.MEMCACHED_HOST);

// let us have a default value
memcached.set("LastEvaluatedKey", 0)

// home route
app.get("/", async (req, res) => {  
    memcached.get("LastEvaluatedKey", async(err, data) => {
        if(err) console.log(err)
        if(parseInt(data) === 0){
          let item = { id: 0}
          const response = await scanTable(item)
          memcached.set("LastEvaluatedKey", JSON.stringify(response.LastEvaluatedKey))
          res.send(JSON.stringify(response))
        } else {
          const response = await scanTable(JSON.parse(data))
          memcached.set("LastEvaluatedKey", JSON.stringify(response.LastEvaluatedKey))
          res.send(JSON.stringify(response))
        }
    }) 
})

const scanTable = async (item) => {
  var params = {
    TableName : 'redis_memcached',
    Limit: 5,
    ExclusiveStartKey: item 
  };
  var db = new AWS.DynamoDB.DocumentClient();
  const results = await db.scan(params).promise()
  return results
}

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}.`);
});
이것은Memcached와 Redis의 입문에 대한 모든 지식입니다. 더 많은 정보는 그들의 문서를 보십시오.
캐시는 응용 프로그램의 성능을 향상시키고 사용자 체험을 향상시킬 것이다.

보너스


Amazon ElastiCache를 사용하여 Redis 서버 또는 Memcached를 가져올 수 있습니다.AWS는 둘 다 지원합니다.
**
Amazon ElastiCache는 유행하는 소스 호환 메모리 데이터 저장소를 클라우드에서 빈틈없이 설정하고 실행하며 확장할 수 있도록 합니다.데이터 집약형 어플리케이션을 구축하거나 높은 처리량과 낮은 지연 메모리 데이터 저장소에서 데이터를 검색하여 기존 데이터베이스의 성능을 향상시킵니다.Amazon ElastiCache는 캐시, 세션 메모리, 게임, 지리 공간 서비스, 실시간 분석, 줄 서기 등 실시간 용례의 인기 선택이다.
**
다음 두 가지 옵션을 선택할 수 있습니다.
  • Redis용 Amazon ElastiCache
  • Amazon ElastiCache for Memcached

  • 값을 매기다


    가격은 노드 유형에 따라 결정됩니다.
    https://aws.amazon.com/elasticache/pricing/?nc=sn&loc=5
    메모리가 필요한 프로그램을 구축하고 있다면, AWS는 가장 좋은 확장 가능한 해결 방안을 제공할 것입니다.
    Redis 설명서https://redis.io/documentation
    Memcached 문서https://memcached.org/.
    고마워요

    좋은 웹페이지 즐겨찾기