saugata
saugata

Reputation: 2863

Redis increment several fields in several hsets

I have data of several users in redis e.g.

hset - user111; field - dayssincelogin .....

I want to periodically update dayssincelogin for all users, one way to do it is

KEYS user*
HINCRBY ${key from above} dayssincelogin 1

Is it possible to do this in a single call? If not what's the most optimal way? I'm using using redis cluster and java client.

Upvotes: 1

Views: 2733

Answers (1)

Basit Anwer
Basit Anwer

Reputation: 6870

You can't do multiple increments in one command but you can bulk your commands together for performance gains.

Use Redis Pipe-lining or Scripting.

In Jedis I dont thing LUA is supported (If someone could answer that :) )

As @mp911de suggested; Use Exec for LUA Scripting and you can also use pipelining to execute your bulk methods faster.

Have a Pipelining readup here for more information

And here is the sample code to use Jedis Pipelining.

Pipeline p = jedis.pipelined();
p.multi();
Response<Long> r1 = p.hincrBy("a", "f1", -1);
Response<Long> r2 = p.hincrBy("a", "f1", -2);
Response<List<Object>> r3 = p.exec();
List<Object> result = p.syncAndReturnAll();

Edit: Redis allows multi key operations only when they are present in the same shard. You should arrange your keys in such a way to ensure data affinity. like key1.{foo} and key5678.{foo} will reside in the same server

Upvotes: 6

Related Questions