您的位置:首页 > 数据库 > Redis

Redis使用lua脚本实现increase + expire 的原子操作

2018-01-11 14:20 816 查看
lua脚本:

local current = redis.call('incrBy',KEYS[1],ARGV[1]);" +
" if current == tonumber(ARGV[1]) then" +
" local t = redis.call('ttl',KEYS[1]);" +
" if t == -1 then " +
" redis.call('expire',KEYS[1],ARGV[2])" +
" end;" +
" end;" +
" return current";

JedisCluter
public Long incrBy(final String key, final long step, final int defaultExpire) {
return new JedisClusterCommand<Long>(connectionHandler, maxRedirections, Protocol.Command.INCR) {
@Override
public Long execute(Jedis connection) {
if (defaultExpire > 0) {
Object val = connection.eval(ScriptConstant.INCRBY_1_EXPIRE, 1, new String[]{key, String.valueOf(step), String.valueOf(defaultExpire)});
return Long.valueOf(val.toString());
} else {
return connection.incrBy(key, step);
}
}
}.run(key);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: