์ ๋ ํฐ ํ๋ก์ ํธ๋ฅผ ์งํ ์ค์ด๊ณ ์ด๋ค ๊ณณ์์๋ ํจํด์ผ๋ก ํค๋ฅผ ์ญ์ ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด filterProducts
์์ํ๋ ๋ชจ๋ ํค๋ฅผ ์ญ์ ํ๊ณ ์ถ์ต๋๋ค.
Google ๊ฒ์์ ์ํํ์ฌ ์ด ๊ธฐ์ฌ ์ ๋ฐฉ๋ฒ๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค.
ํ์ง๋ง ํฐ ํ๋ก์ ํธ์ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ ๋ฅผ ๋์์ฃผ์๊ฒ ์ต๋๊น?
๋น์ ์ด ๋งํฌ ํ ๋ฐฉ๋ฒ์ ๊ทธ๊ฒ์ ๋ํด ๊ฝค ๋์ฐํ ๋ฐฉ๋ฒ์
๋๋ค. KEYS
๋ ํ๋ก๋์
์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ DEL๋ ์๋นํ ๋นํจ์จ์ ์
๋๋ค. SCAN
๋ฐ UNLINK
๋ฅผ ์ฌ์ฉํ์ฌ ํ์ธํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด Redis๋ฅผ ์ฐ๊ฒฐํ์ง ์๊ณ ๋ ํ ๋ฒ์ ์์์ ํค๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
์ฆ, ํด๋น ์ ํ์ ์คํฌ๋ฆฝํธ๋ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์ฌ์ฉ์์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค. ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ๊ฒ ์ต๋๋ค.
@MohammedAl-Mahdawi ๋ด ํ๋ก์ ํธ ์ค ํ๋์ ๋น์ทํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ผ๋ฉฐ ioredis์์ ์ ๊ณตํ๋ scanStream
๊ตฌํ์ ์ฌ์ฉํฉ๋๋ค. ์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก scan
๋ช
๋ น์ ์ฌ์ฉํ๋ ๋ ์ฌ์ด ๋ฐฉ๋ฒ์
๋๋ค: https://github.com/luin/ioredis#streamify -scanning
์ด๋ฏธ ์ธ๊ธํ @stockholmux ์ ๊ฐ์ด SCAN
๋ฐ UNLINK
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Redis๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ์ํ๋ ์์ ํค๋ฅผ ์ ๊ฑฐํ ์ ์์ด์ผ ํฉ๋๋ค.
@dirkbonhomme ๋์ ์ฃผ์ ์ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค. ์ ๋ง ๊ฐ์ฌํฉ๋๋ค.
๋๋ ๋น์ ์ ์กฐ์ธ์ ๋ฐ๋ฅด๊ณ ioredis๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ๊ธฐ๋ฅ์ ๋ง๋ค์์ต๋๋ค. ํฐ ํ๋ก์ ํธ์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ธ์ง ์๋ ค์ฃผ์๊ฒ ์ต๋๊น?
//key example "prefix*"
function getKeysByPattern(key) {
return new Promise((resolve, reject) => {
var stream = redis.scanStream({
// only returns keys following the pattern of "key"
match: key,
// returns approximately 100 elements per call
count: 100
});
var keys = [];
stream.on('data', function (resultKeys) {
// `resultKeys` is an array of strings representing key names
for (var i = 0; i < resultKeys.length; i++) {
keys.push(resultKeys[i]);
}
});
stream.on('end', function () {
resolve(keys)
});
})
}
//key example "prefix*"
function deleteKeysByPattern(key) {
var stream = redis.scanStream({
// only returns keys following the pattern of "key"
match: key,
// returns approximately 100 elements per call
count: 100
});
var keys = [];
stream.on('data', function (resultKeys) {
// `resultKeys` is an array of strings representing key names
for (var i = 0; i < resultKeys.length; i++) {
keys.push(resultKeys[i]);
}
});
stream.on('end', function () {
redis.unlink(keys)
});
}
@MohammedAl-Mahdawi๋ ๋์๊ฒ ์ข์ ๋ณด์ธ๋ค. ๊ฐ๋ฅํ ๋ฌธ์ ๋ ์ผ์นํ๋ ๋ชจ๋ ํค๋ฅผ ํ ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ด ๋ฌธ์ ๋ผ๋ฉด, ๊ทธ๊ฒ๋ค์ด ๋ค์ด์ค๋ ์ฆ์ ์ผ๊ด์ ์ผ๋ก ์ ๊ฑฐํ ์ ์์ต๋๋ค:
stream.on('data', function (resultKeys) {
if (resultKeys.length) {
redis.unlink(resultKeys);
}
});
@dirkbonhomme ๋ฐ @MohammedAl-Mahdawi ์ด ๋ฐฉ๋ฒ์๋ ํ๋ก๋์ ์์ ์ฌ์ฉ์๋ฅผ ๋ฌผ๋ฆด ์ ์๋ ์์์ฑ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
@stockholmux ๋์์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ์ฌ๋ฐ๋ฅธ ํด๊ฒฐ์ฑ ์ ๋ฌด์์ ๋๊น?
์ฐ๋ฆฌ๊ฐ ์ง๊ธ๊น์ง ๋๋ฌํ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ์ฐพ๊ณ ๊ทธ๊ฒ์ด ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ๋ฏฟ๋ ์ฌ๋์ ์ํด ๋ค์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
//key example "prefix*"
function getKeysByPattern(key) {
return new Promise((resolve, reject) => {
var stream = redis.scanStream({
// only returns keys following the pattern of "key"
match: key,
// returns approximately 100 elements per call
count: 100
});
var keys = [];
stream.on('data', function (resultKeys) {
// `resultKeys` is an array of strings representing key names
for (var i = 0; i < resultKeys.length; i++) {
keys.push(resultKeys[i]);
}
});
stream.on('end', function () {
resolve(keys)
});
})
}
//key example "prefix*"
function deleteKeysByPattern(key) {
var stream = redis.scanStream({
// only returns keys following the pattern of "key"
match: key,
// returns approximately 100 elements per call
count: 100
});
var keys = [];
stream.on('data', function (resultKeys) {
// `resultKeys` is an array of strings representing key names
for (var i = 0; i < resultKeys.length; i++) {
keys.push(resultKeys[i]);
}
});
stream.on('end', function () {
redis.unlink(keys)
});
}
//key example "prefix*"
function batchDeletionKeysByPattern(key) {
var stream = redis.scanStream({
// only returns keys following the pattern of "key"
match: key,
// returns approximately 100 elements per call
count: 100
});
stream.on('data', function (resultKeys) {
if (resultKeys.length) {
redis.unlink(resultKeys);
}
});
}
์์ ์ฝ๋๋ ioredis์ฉ ์
๋๋ค.
๋ ๋์ ๋ฐฉ๋ฒ์ ์๊ณ ๊ณ์ ๋ถ์ด ๊ณ์๋ค๋ฉด ์ฃผ์ ํ์ง ๋ง๊ณ ๊ณต์ ํด ์ฃผ์ญ์์ค.
@MohammedAl-Mahdawi ,
๋๋์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ฐ์ ์์ด๋์ด
์ฝ๋๋ฒ ์ด์ค:
let redisDel = () => {
var key="employees*"
return new Promise((resolve, reject) => {
var stream = redis.scanStream({
// only returns keys following the pattern of "key"
match: key,
// returns approximately 100 elements per call
count: 100
});
stream.on('data', function (resultKeys) {
if (resultKeys.length) {
console.log(resultKeys)
redis.unlink(resultKeys);
}
});
stream.on('end', function (resultKeys) {
resolve()
})
})
}
์๋ฌด๋ ์ฌ๊ธฐ์ ์๋ฒฝํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๊น?
@siddhkadam1881 ๋งํฌ ํด์ ๋ช
๋ น์ Redis 4 https://redis.io/commands/unlink ์ดํ๋ก๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ง๋ ์ด์ ๋ฒ์ ์ ์คํ ์ค์ผ ๊ฒ์
๋๋ค. ๋์ del
๋ฅผ) ์๋ํ์ญ์์ค.
์ค์บ์ด ์ด๋ป๊ฒ ์ํ๋๋์ง ์ดํดํ๊ณ ์ถ์ต๋๋ค. ์ญ์ ๊ฐ ์ผ๊ด ์ฒ๋ฆฌ๋ก ๋ฐ์ํ๋ ๊ฒฝ์ฐ @MohammedAl-Mahdawi์ ์๋ฃจ์ ์์ ์ญ์ ํ๊ณ ์ถ์ง ์์ ์ ํค๊ฐ ๊ทธ ์๊ฐ์ ์ถ๊ฐ๋๋ฉด ์ค์บ ๋ฐ ์ญ์ ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฃจ์ ์คํฌ๋ฆฝํธ๋ ์ด๋ป์ต๋๊น?
์ด ์๋ฃจ์ ์ด ๋งค์ฐ ๊ฐ๋จํ 1 ์ธ์คํด์ค ElastiCache ์๋ฒ์์๋ ์๋ํ์ง ์์ง๋ง ๋ก์ปฌ์์๋ ์๋ํ๋ ์ด์ ๋ฅผ ์๋ ์ฌ๋์ด ์์ต๋๊น? ์ ์์ ์ผ๋ก ํค๋ฅผ ์ง์ธ ์ ์์ง๋ง ์คํธ๋ฆผ ๊ตฌํ์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ElastiCache์์ ํค๋ฅผ ๋ฐํํ์ง ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฐ๋ฆฌ๊ฐ ์ง๊ธ๊น์ง ๋๋ฌํ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ์ฐพ๊ณ ๊ทธ๊ฒ์ด ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ๋ฏฟ๋ ์ฌ๋์ ์ํด ๋ค์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ ์ฝ๋๋ ioredis์ฉ ์ ๋๋ค.
๋ ๋์ ๋ฐฉ๋ฒ์ ์๊ณ ๊ณ์ ๋ถ์ด ๊ณ์๋ค๋ฉด ์ฃผ์ ํ์ง ๋ง๊ณ ๊ณต์ ํด ์ฃผ์ญ์์ค.