μλ νμΈμ μ¬λ¬λΆ,
νλ‘κ·Έλλ° λ°©μμΌλ‘ node_redisμμ νμ΄νλΌμ΄λμ νμ±ννλ λ°©λ²μ 무μμ λκΉ?
λλΆλΆμ κ²½μ° μλμΌλ‘ λ°μνλ€λ μ€λͺ μλ₯Ό 보μκ³ node_redisμμ νλ‘κ·Έλλ° λ°©μμΌλ‘ μμ© νλ‘κ·Έλ¨ μ½λμμ κ°μ λ‘ μ€ννλ λ°©λ²μ΄ μλμ§ μκ³ μΆμ΅λλ€.
[ ec2-user@devops ~]$ redis-benchmark -n 100000 -t set, get -P 16 -q -h 10.0.1.10
SET: μ΄λΉ 199600.80 μμ²
GET: μ΄λΉ 193050.19 μμ²
[ ec2-user@devops ~]$ redis-benchmark -n 100000 -t set, get -q -h 10.0.1.12
SET: μ΄λΉ 14098.41 μμ²
GET: μ΄λΉ 13743.82 μμ²
Redis λ Έλμμ 10λ°° μ΄μ μ°¨μ΄κ° λ©λλ€.
κ°μ¬ ν΄μ,
λλ―ΈνΈλ¦¬
client.multi λ° multi.exec λͺ λ Ήμ ν΅ν΄ μνλ©λκΉ?
μλ νμΈμ @saritasa -- νμ΄νλΌμ΄λμ μλμ λλ€. νμ ν΄λΌμ΄μΈνΈ λ΄λΆμμ λ°μν©λλ€. νμ±ννκΈ° μν΄ multi λλ execλ₯Ό μ¬μ©ν νμκ° μμ΅λλ€.
μλ νμΈμ λΈλΌμ΄μ€,
κ°μ¬ ν΄μ,
λλ―ΈνΈλ¦¬
λ€μ€ μμ μ Redis νλ‘ν μ½ μ¬μμμ κ°μ ΈμμΌλ©° νμ΄νλΌμ΄λ μΈλΆμ νΈλμμ λͺ©μ μ΄ μμ΅λλ€ .
νμ΄νλΌμ΄λ μλ λ°©μ: http://redis.io/topics/pipelining μ΄κ²μ ν΄λΌμ΄μΈνΈκ° λ€μ λͺ λ Ήμ μμ±νκΈ° μ μ μλ΅μ κΈ°λ€λ¦¬μ§ μκ³ λ³΄λ΄λ λ§νΌ λΉ λ₯΄κ² Redisμ λͺ λ Ήμ μμ±νλ λ¬Έμ μΌ λΏμ λλ€. ν΄λΌμ΄μΈνΈλ μ μ‘λ λͺ λ Ήμ μΆμ ν λ€μ Redisκ° μλ΅νλ©΄ μ μ‘λ λͺ λ ΉμΌλ‘ μλ΅μ μ¬μ λ ¬ν©λλ€.
Bryceμκ² κ°μ¬ν©λλ€. http://redis.io/topics/pipeliningμ΄ μλνλ λ°©μμ μ΄ν΄ν©λλ€. node.js μ ν리μΌμ΄μ μμ - μμ²μ΄ νμ΄νλΌμΈλλλ‘ μ½λλ₯Ό μ΄λ»κ² ꡬμ±ν΄μΌ ν©λκΉ?
κ·Έλμ μλ μμμ
hgetall λ° λ§λ£ - νμ΄νλΌμΈμ΄ λμ΄ μμ΅λκΉ? νΈμΆ μ€ νλκ° μ½λ°± λ΄λΆμ μμ΅λλ€.
ν¨μ getByID(ν
μ΄λΈ, ID, λ€μ) {
if (!success) return setTimeout(ν¨μ() {
getByID(ν
μ΄λΈ, μμ΄λ, λ€μ);
}, 2000);
var end = utils.getEndTime(),
base = getBase(),
client = getClient(PK2str(table, id)),
key = getHashID(table, id);
base.sismember(table, key, function (err, val) {
if (err || !val) return next();
client.hgetall(key, function (err, val) {
if (err || !val) return next(new Error('Expired'), id);
val = arrays_parse(table, val);
next(null, val);
client.expire(key, cfg.ttl.shards);
if (!exports.silent) {
profiler.log('cache', {
'table': table,
'id': key,
'method': 'getByID',
'data': val,
'time': end()
});
}
});
});
}
λͺ¨λ λͺ λ Ήμ "νμ΄νλΌμΈ"μΌλ‘ μ μ‘λμ§λ§ λ€μ μ€ νλ λλ λ κ°μ§ μ΄μ λ‘ μΈν΄ λμΌν νμ΄νλΌμΈ μ°κΈ° νλ μμΌλ‘ μ μ‘λμ§ μμ΅λλ€.
base
λ° client
κ° λ€λ₯Έ Redis ν΄λΌμ΄μΈνΈμΈ κ²½μ° λμΌν νμ΄νλΌμΈμ _μ λ_ 곡μ ν μ μμ΅λλ€.νμ΄νλΌμ΄λμ μ΄μ μ λ³΄λ €λ©΄ λμΌν 컨ν μ€νΈ*μμ λͺ λ Ήμ μ€νν΄μΌ ν©λλ€. μλ₯Ό λ€μ΄ redis νμ΄νλΌμ΄λ λ¬Έμμ PING μμ μ μ μ¬ν©λλ€.
// These commands will all be pipelined together:
client.ping()
client.ping()
client.ping()
client.ping(function () {
// This would *NEVER* be in the same pipeline frame as the other four because it requires a reply to be received first
client.ping()
})
* λλ Redisκ° μλ΅νλ κ²λ³΄λ€ λΉ λ₯΄κ² μ μ‘λ κ²½μ° λ³λμ 컨ν μ€νΈμμ μ μ‘λμ§λ§ μ’ μ 컨ν μ€νΈμλ μλ΅νμ§ μμ΅λλ€.
μ΄μ μμμ΅λλ€ - κ°μ¬ν©λλ€! μ΄κ²μ λ§€μ° κ·μ€ν μ견μ λλ€!
node_redis "μλ νμ΄νλΌμ΄λ"μ 곡μ redisμμ μ°Έμ‘°νλ νμ΄νλΌμ΄λμ΄ μλλΌκ³ μκ°ν©λλ€.
μ΄ μκ°μ RTT(μ볡 μκ°)λΌκ³ ν©λλ€. ν΄λΌμ΄μΈνΈκ° μ°μμ μΌλ‘ λ§μ μμ²μ μνν΄μΌ νλ κ²½μ°(μ: λμΌν λͺ©λ‘μ λ§μ μμλ₯Ό μΆκ°νκ±°λ λ§μ ν€λ‘ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ±μ°λ κ²½μ°) μ΄κ²μ΄ μ±λ₯μ μ΄λ€ μν₯μ λ―ΈμΉ μ μλμ§ λ§€μ° μ½κ² μ μ μμ΅λλ€. μλ₯Ό λ€μ΄ RTT μκ°μ΄ 250λ°λ¦¬μ΄(μΈν°λ·μ ν΅ν λ§€μ° λλ¦° λ§ν¬μ κ²½μ°)μΈ κ²½μ° μλ²κ° μ΄λΉ 100,000κ°μ μμ²μ μ²λ¦¬ν μ μλλΌλ μ΄λΉ μ΅λ 4κ°μ μμ²μ μ²λ¦¬ν μ μμ΅λλ€.
μ¬μ©λ μΈν°νμ΄μ€κ° 루νλ°± μΈν°νμ΄μ€μΈ κ²½μ° RTTλ ν¨μ¬ λ 짧μ§λ§(μλ₯Ό λ€μ΄ λ΄ νΈμ€νΈκ° 127.0.0.1μ ννλ 0,044λ°λ¦¬μ΄λ₯Ό λ³΄κ³ ν¨) μ°μμΌλ‘ λ§μ μ°κΈ°λ₯Ό μνν΄μΌ νλ κ²½μ° μ¬μ ν λ§μ΅λλ€.
곡μ redisμ μν νμ΄νλΌμ΄λμ΄ μλ―Ένλ κ²μ μ¬λ¬ λͺ λ Ήμ κ²°ν©νκ³ node_redisμμ μ²λ¦¬λμ§ μλ RTTλ‘ μΈν λκΈ° μκ°μ λμνκΈ° μν΄ ν λ²λ§ 보λ΄λ κ²μ λλ€. κ·Έλ¦¬κ³ node_redisμ "automatica pipelining"μ μ€μ λ‘ Nodeμ λΉλκΈ° νλ‘κ·Έλλ° λͺ¨λΈμ μ¬μ©νμ¬ λμμ κ°λ₯ν ν λ§μ λͺ λ Ήμ 보λ΄λ κ²μ λλ€.
λ€μμ μ΄ λ¬Έμ λ₯Ό λ Όμνλ μ’μ κΈ°μ¬μ λλ€. http://informatikr.com/2012/redis-pipelining.html
@Vizwind @saritasa .multiμ
κ°μ₯ μ μ©ν λκΈ
λͺ¨λ λͺ λ Ήμ "νμ΄νλΌμΈ"μΌλ‘ μ μ‘λμ§λ§ λ€μ μ€ νλ λλ λ κ°μ§ μ΄μ λ‘ μΈν΄ λμΌν νμ΄νλΌμΈ μ°κΈ° νλ μμΌλ‘ μ μ‘λμ§ μμ΅λλ€.
base
λ°client
κ° λ€λ₯Έ Redis ν΄λΌμ΄μΈνΈμΈ κ²½μ° λμΌν νμ΄νλΌμΈμ _μ λ_ 곡μ ν μ μμ΅λλ€.νμ΄νλΌμ΄λμ μ΄μ μ λ³΄λ €λ©΄ λμΌν 컨ν μ€νΈ*μμ λͺ λ Ήμ μ€νν΄μΌ ν©λλ€. μλ₯Ό λ€μ΄ redis νμ΄νλΌμ΄λ λ¬Έμμ PING μμ μ μ μ¬ν©λλ€.
* λλ Redisκ° μλ΅νλ κ²λ³΄λ€ λΉ λ₯΄κ² μ μ‘λ κ²½μ° λ³λμ 컨ν μ€νΈμμ μ μ‘λμ§λ§ μ’ μ 컨ν μ€νΈμλ μλ΅νμ§ μμ΅λλ€.