Search in sources :

Example 6 with ScanObjectEntry

use of org.redisson.client.protocol.decoder.ScanObjectEntry in project redisson by redisson.

the class RedissonMapCache method scanIteratorAsync.

public RFuture<MapScanResult<ScanObjectEntry, ScanObjectEntry>> scanIteratorAsync(final String name, InetSocketAddress client, long startPos) {
    RedisCommand<MapCacheScanResult<Object, Object>> EVAL_HSCAN = new RedisCommand<MapCacheScanResult<Object, Object>>("EVAL", new ListMultiDecoder(new LongMultiDecoder(), new ObjectMapDecoder(new MapScanCodec(codec)), new ObjectListDecoder(codec), new MapCacheScanResultReplayDecoder()), ValueType.MAP);
    RFuture<MapCacheScanResult<ScanObjectEntry, ScanObjectEntry>> f = commandExecutor.evalReadAsync(client, name, codec, EVAL_HSCAN, "local result = {}; " + "local idleKeys = {}; " + "local res = redis.call('hscan', KEYS[1], ARGV[2]); " + "local currentTime = tonumber(ARGV[1]); " + "for i, value in ipairs(res[2]) do " + "if i % 2 == 0 then " + "local key = res[2][i-1]; " + "local expireDate = 92233720368547758; " + "local expireDateScore = redis.call('zscore', KEYS[2], key); " + "if expireDateScore ~= false then " + "expireDate = tonumber(expireDateScore) " + "end; " + "local t, val = struct.unpack('dLc0', value); " + "if t ~= 0 then " + "local expireIdle = redis.call('zscore', KEYS[3], key); " + "if expireIdle ~= false then " + "if tonumber(expireIdle) > currentTime and expireDate > currentTime then " + "table.insert(idleKeys, key); " + "end; " + "expireDate = math.min(expireDate, tonumber(expireIdle)) " + "end; " + "end; " + "if expireDate > currentTime then " + "table.insert(result, key); " + "table.insert(result, val); " + "end; " + "end; " + "end;" + "return {res[1], result, idleKeys};", Arrays.<Object>asList(name, getTimeoutSetName(name), getIdleSetName(name)), System.currentTimeMillis(), startPos);
    f.addListener(new FutureListener<MapCacheScanResult<ScanObjectEntry, ScanObjectEntry>>() {

        @Override
        public void operationComplete(Future<MapCacheScanResult<ScanObjectEntry, ScanObjectEntry>> future) throws Exception {
            if (future.isSuccess()) {
                MapCacheScanResult<ScanObjectEntry, ScanObjectEntry> res = future.getNow();
                if (res.getIdleKeys().isEmpty()) {
                    return;
                }
                List<Object> args = new ArrayList<Object>(res.getIdleKeys().size() + 1);
                args.add(System.currentTimeMillis());
                args.addAll(res.getIdleKeys());
                commandExecutor.evalWriteAsync(name, codec, new RedisCommand<Map<Object, Object>>("EVAL", new MapGetAllDecoder(args, 1), 7, ValueType.MAP_KEY, ValueType.MAP_VALUE), // index is the first parameter
                "local currentTime = tonumber(table.remove(ARGV, 1)); " + "local map = redis.call('hmget', KEYS[1], unpack(ARGV)); " + "for i = #map, 1, -1 do " + "local value = map[i]; " + "if value ~= false then " + "local key = ARGV[i]; " + "local t, val = struct.unpack('dLc0', value); " + "if t ~= 0 then " + "local expireIdle = redis.call('zscore', KEYS[2], key); " + "if expireIdle ~= false then " + "if tonumber(expireIdle) > currentTime then " + "local value = struct.pack('dLc0', t, string.len(val), val); " + "redis.call('hset', KEYS[1], key, value); " + "redis.call('zadd', KEYS[2], t + currentTime, key); " + "end; " + "end; " + "end; " + "end; " + "end; ", Arrays.<Object>asList(name, getIdleSetName(name)), args.toArray());
            }
        }
    });
    return (RFuture<MapScanResult<ScanObjectEntry, ScanObjectEntry>>) (Object) f;
}
Also used : ObjectMapDecoder(org.redisson.client.protocol.decoder.ObjectMapDecoder) ListMultiDecoder(org.redisson.client.protocol.decoder.ListMultiDecoder) LongMultiDecoder(org.redisson.client.protocol.decoder.LongMultiDecoder) MapScanCodec(org.redisson.client.codec.MapScanCodec) RFuture(org.redisson.api.RFuture) ScanObjectEntry(org.redisson.client.protocol.decoder.ScanObjectEntry) MapCacheScanResult(org.redisson.client.protocol.decoder.MapCacheScanResult) MapCacheScanResultReplayDecoder(org.redisson.client.protocol.decoder.MapCacheScanResultReplayDecoder) RedisCommand(org.redisson.client.protocol.RedisCommand) MapGetAllDecoder(org.redisson.connection.decoder.MapGetAllDecoder) ArrayList(java.util.ArrayList) List(java.util.List) ObjectListDecoder(org.redisson.client.protocol.decoder.ObjectListDecoder)

Example 7 with ScanObjectEntry

use of org.redisson.client.protocol.decoder.ScanObjectEntry in project redisson by redisson.

the class ScanCodec method getValueDecoder.

@Override
public Decoder<Object> getValueDecoder() {
    return new Decoder<Object>() {

        @Override
        public Object decode(ByteBuf buf, State state) throws IOException {
            ByteBuf b = Unpooled.copiedBuffer(buf);
            Object val = delegate.getValueDecoder().decode(buf, state);
            return new ScanObjectEntry(b, val);
        }
    };
}
Also used : State(org.redisson.client.handler.State) Decoder(org.redisson.client.protocol.Decoder) ByteBuf(io.netty.buffer.ByteBuf) ScanObjectEntry(org.redisson.client.protocol.decoder.ScanObjectEntry)

Aggregations

ScanObjectEntry (org.redisson.client.protocol.decoder.ScanObjectEntry)7 ByteBuf (io.netty.buffer.ByteBuf)5 State (org.redisson.client.handler.State)3 Decoder (org.redisson.client.protocol.Decoder)3 InetSocketAddress (java.net.InetSocketAddress)2 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 List (java.util.List)2 Map (java.util.Map)2 Subscriber (org.reactivestreams.Subscriber)2 Subscription (org.reactivestreams.Subscription)2 ListScanResult (org.redisson.client.protocol.decoder.ListScanResult)2 MapScanResult (org.redisson.client.protocol.decoder.MapScanResult)2 ReactiveSubscription (reactor.rx.subscription.ReactiveSubscription)2 AbstractMap (java.util.AbstractMap)1 Entry (java.util.Map.Entry)1 RedissonReference (org.redisson.RedissonReference)1 RedissonShutdownException (org.redisson.RedissonShutdownException)1 RFuture (org.redisson.api.RFuture)1 RedisAskException (org.redisson.client.RedisAskException)1