sugang
sugang'study
sugang
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
    • [OS]
    • [์ทจ์—…์ •๋ณด]
    • [Server]
    • [Algorithm]
    • [Database]
    • [MyTravel]
    • [Network]

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • n

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
sugang

sugang'study

Redis cache ์„ค์ • (Node.js)
[Server]

Redis cache ์„ค์ • (Node.js)

2024. 1. 2. 01:37

์ถœ์ฒ˜: https://inpa.tistory.com/entry/REDIS-๐Ÿ“š-Redis๋ฅผ-ํด๋ผ์šฐ๋“œ๋กœ-์‚ฌ์šฉํ•˜์ž-Redislabs [Inpa Dev ๐Ÿ‘จ‍๐Ÿ’ป:ํ‹ฐ์Šคํ† ๋ฆฌ]

 

[REDIS] ๐Ÿ“š Node.js ์—์„œ redis ๋ชจ๋“ˆ ์‚ฌ์šฉ๋ฒ• (์บ์‹ฑ & ์„ธ์…˜ ์Šคํ† ์–ด)

Node ํ”„๋กœ์ ํŠธ์—์„œ pm2๋กœ ๋‹ค์ค‘ ํด๋Ÿฌ์Šคํ„ฐ ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ–ˆ๋‹ค๋ฉด ์„ธ์…˜ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋งˆ๋ จ์ด๋‹ค. ๋งŒ์ผ ์„œ๋ฒ„๊ฐ€ ์ข…๋ฃŒ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‚ ๋ผ๊ฐ€๋ฉด ์ ‘์†์ž๋“ค์˜ ๋กœ๊ทธ์ธ์ด ๋ชจ๋‘ ํ’€๋ ค๋ฒ„๋ฆฌ๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ

inpa.tistory.com

 

์ด ๋ถ„์˜ ๊ธ€์„ ํ† ๋Œ€๋กœ ์ž‘์„ฑํ–ˆ๋‹ค. ์ด๋ถ„์˜ ๊ธ€์—๋Š” redis ์„ค์ • ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์บ์‹ฑ ์ „๋žต์ด๋‚˜ redis๋กœ ์„ธ์…˜๊ด€๋ฆฌ๋ฅผ ํ•˜์—ฌ ๋ณต์ˆ˜ ์„œ๋ฒ„ ํ™˜๊ฒฝ(ํด๋Ÿฌ์Šคํ„ฐ๋ง)์—์„œ๋„  ์„ธ์…˜์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋‚˜์™€์žˆ์–ด ๋„์›€์ด ๋งŽ์ด ๋œ๋‹ค!

1. Redis Labs ๋กœ ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„ ๊ฐœ์„ค

MySQL์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์›Œํฌ๋ฒค์น˜๋ฅผ ์„ค์น˜ํ–ˆ๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ, ๋ ˆ๋””์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ ˆ๋””์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค. 

Redislabs์—์„œ๋Š” 1๊ฐœ์˜ db์—์„œ 30mb ๋ฅผ ๋ฌด๋ฃŒ ์ œ๊ณตํ•ด์ค€๋‹ค. (ram ์˜์—ญ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ถฉ๋ถ„ํ•˜๋‹ค.) 

 

 

https://redis.com/

 

Redis | The Real-time Data Platform

Developers love Redis. Unlock the full potential of the Redis database with Redis Enterprise and start building blazing fast apps.

redis.com

  1. ์ ‘์†ํ•˜์—ฌ ํšŒ์›๊ฐ€์ž…
  2. ํด๋ผ์šฐ๋“œ ์—…์ฒด ์„ ํƒ (์ง€์žฅ ์—†์œผ๋‹ˆ ์•„๋ฌด ๊ฒƒ์ด๋‚˜ ์ฒดํฌ )
  3. DB ์ƒ์„ฑ ์™„๋ฃŒ 

Mysql ์„ ์—ฐ๊ฒฐํ•  ๋•Œ์™€ ๊ฐ™์ด, ๋ ˆ๋””์Šค๋„ ์ƒ์„ฑ๋œ ํด๋ผ์šฐ๋“œ db์„œ๋ฒ„์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•ด์„  Host, Port, Password 3๊ฐ€์ง€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

2. Redis Cloud ์ ‘์† 

์–ป์€ ์ •๋ณด๋กœ redis์—  ์ ‘์†ํ•ด๋ณด์ž. 

Mac ๊ธฐ์ค€ 

$brew install redis # apt-get install redis-tools , redis ์„ค์น˜

$redis-cli-v #๋ฒ„์ „ํ™•์ธ

$redis-cli -h [endpoint] -p [port] -a [password] #redis cloud ์ ‘์†

 

- redis ์„œ๋ฒ„ ๋ช…๋ น์–ด

 

$redis-server #์„œ๋ฒ„ ์‹œ์ž‘
$redis-cli ping # ์„œ๋ฒ„ ํ™•์ธ, ์‹คํ–‰์ค‘์ด๋ผ๋ฉด PONG
$redis-cli shutdown #์„œ๋ฒ„ ์ •์ง€

$redis-cli # redis ๋ช…๋ น์ฐฝ์œผ๋กœ ์ ‘์† 
$redis-cli shutdown 

#cli์—์„œ ์ •์ง€
> shutdown save #์ง€๊ธˆ๊นŒ์ง€ ๋‚ด์šฉ ์ €์žฅ 
> shutdown nosave #์ง€๊ธˆ๊นŒ์ง€ ๋‚ด์šฉ ์ €์žฅ X

3. Node์— ์—ฐ๊ฒฐ

npm i redis #node ์— Redis ํŒจํ‚ค์ง€ ์„ค์น˜

 

redis ํด๋ผ์šฐ๋“œ์— ์—ฐ๊ฒฐํ•˜๊ธฐ

redis db์˜ ๊ณ„์ • ์ •๋ณด๋“ค ์ €์žฅ ํŒŒ์ผ ์ƒ์„ฑ(.env)

redisenv.env

# redisEnv.env ํŒŒ์ผ
REDIS_HOST=[endpoint]
REDIS_PORT=[port]
REDIS_USERNAME=[user]
REDIS_PASSWORD=[password]

 

redis.js

#with cloud redis server

const redis = require("redis");
const redisEnv= require('redisEnv')
redisEnv.config()  //ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ
// redis[s]://[[username][:password]@][host][:port][/db-number]
const redisClient = redis.createClient({
   url: `redis://${process.env.REDIS_USERNAME}:${process.env.REDIS_PASSWORD}@${process.env.REDIS_HOST}:${process.env.REDIS_PORT}/0`,
   legacyMode: true, // ๋ฐ˜๋“œ์‹œ ์„ค์ • !!
});
 

redis ๋กœ์ปฌ์— ์—ฐ๊ฒฐํ•˜๊ธฐ + ์บ์‹œ ๋“ฑ๋ก, ์ œ๊ฑฐ, ์กฐํšŒ

const redis = require("redis");

const bluebird = require("bluebird");
bluebird.promisifyAll(redis);

//redis ์—ฐ๊ฒฐ, ๋กœ์ปฌ์—์„œ
const redisClient = redis.createClient({
  host: `127.0.0.1`,
  port: 6379,
  legacyMode: true, //๋ ˆ๊ฑฐ์‹œ ๋ชจ๋“œ ๋ฐ˜๋“œ์‹œ ์„ค์ •
});

redisClient.on(`connect`, () => {
  console.info(`Redis connected!`);
});
redisClient.on(`error`, (err) => {
  console.error(`Redis Client Error`, err);
});
redisClient.connect().then();//redis v4 ์—ฐ๊ฒฐ ๋น„๋™๊ธฐ
const redisCli = redisClient.v4; // ๊ธฐ๋ณธ redisClient ๊ฐ์ฒด๋Š” ์ฝœ๋ฐฑ๊ธฐ๋ฐ˜์ธ๋ฐ v4๋ฒ„์ ผ์€ ํ”„๋กœ๋ฏธ์Šค ๊ธฐ๋ฐ˜์ด๋ผ ์‚ฌ์šฉ

const setCache = async (key, value) => {
  await redisCli.set(key,  JSON.stringify(value)); // key, value ํ˜•ํƒœ๋กœ redis์— ์ €์žฅ
  await redisCli.expire(key, 3600); //
};

const deleteCache = async (key) => {
  await redisCli.delAsync(key); //๋ฐ์ดํ„ฐ ์ œ๊ฑฐ
  res.status(200).json({
    isSuccess: "all cache deleted",
  });
};

// ์ฑ… ๋ฆฌ์ŠคํŠธ ๊ฒฐ๊ณผ ์บ์‹œ์— ์ €์žฅํ•˜๊ธฐ 
const getBooksCache = async (req, res, next) => {
  let key = "book-list/";
  try {
    const data = JSON.parse(await redisCli.get(key));

    if (data) {
      if (redisCli.ttl(key) < 1000) { // ttl ํƒ€์ž„์•„์›ƒ๊นŒ์ง€ ๋‚จ์€ ์‹œ๊ฐ„์„ ์ดˆ๋‹จ์œ„๋กœ ๋ฐ˜ํ™˜
        // ์†Œ๋ฉธ ์‹œ๊ฐ„ ์—ฐ์žฅํ•˜๊ธฐ
        console.log("redis work1");
        await redisCli.setex(key, 3600, data); //์†Œ๋ฉธ์‹œ๊ฐ„ ์ง€์ •ํ•ด์„œ ์ €์žฅํ•˜๊ธฐ , 3600์ดˆ
        console.log("redis work2");
      }

      res.status(200).json(
        //๊ฒฐ๊ณผ ์ „์†ก
        data
      );
    } else {
      next(); //๋‹ค์Œ ํ•จ์ˆ˜ ์‹คํ–‰  (์ปจํŠธ๋กค๋Ÿฌ์˜ getBookList ํ•จ์ˆ˜ ์‹คํ–‰, ์บ์‹œ ์—†์ด ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ(ํ‚ค ๊ฐ’ ์กด์žฌX) )
    } 
  } catch (err) {
    res.status(400).json({
      ok: false,
      message: err,
    });
  }
};

module.exports = {
  setCache,
  getBooksCache,
  deleteCache,
};

'[Server]' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

JavaScript  (0) 2023.07.05
[Server] ec2 vscode ssh : Operation timed out, Permission denied (PublicKey) ์˜ค๋ฅ˜ ํ•ด๊ฒฐ  (0) 2023.04.13
[Node] ๋‹ค์ค‘ ํŒŒ์ผ ์˜ฌ๋ฆฌ๊ธฐ  (0) 2022.09.23
์Šคํ”„๋ง์ž…๋ฌธ - ๋ฐ์ดํ„ฐ ์กฐํšŒํ•˜๊ธฐ with JPA, ํŽ˜์ด์ง€ ์ด๋™ํ•˜๊ธฐ, ์ˆ˜์ •, ์‚ญ์ œ  (0) 2022.09.08
[server] Docker ๋กœ Node.JS & Nginx๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์ถ•  (0) 2022.07.03
    '[Server]' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • JavaScript
    • [Server] ec2 vscode ssh : Operation timed out, Permission denied (PublicKey) ์˜ค๋ฅ˜ ํ•ด๊ฒฐ
    • [Node] ๋‹ค์ค‘ ํŒŒ์ผ ์˜ฌ๋ฆฌ๊ธฐ
    • ์Šคํ”„๋ง์ž…๋ฌธ - ๋ฐ์ดํ„ฐ ์กฐํšŒํ•˜๊ธฐ with JPA, ํŽ˜์ด์ง€ ์ด๋™ํ•˜๊ธฐ, ์ˆ˜์ •, ์‚ญ์ œ
    sugang
    sugang

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”