All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.vertx.tp.plugin.redis.cache.L1ChannelAsync Maven / Gradle / Ivy

The newest version!
package io.vertx.tp.plugin.redis.cache;

import io.horizon.eon.em.typed.ChangeFlag;
import io.vertx.core.Future;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.redis.client.Command;
import io.vertx.redis.client.Request;
import io.vertx.redis.client.Response;
import io.horizon.uca.log.Annal;
import io.vertx.up.util.Ut;

import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentMap;

/**
 * @author Lang
 */
class L1ChannelAsync {
    private final static Annal LOGGER = Annal.get(L1ChannelAsync.class);
    private final transient L1Redis redis = new L1Redis();

    L1ChannelAsync() {
    }

    void write(final ConcurrentMap dataMap, final ChangeFlag flag) {
        if (this.redis.enabled()) {
            /*
             * Write cache
             */
            final List requests = this.redis.requestData(dataMap, flag);
            this.redis.requestAsync(requests, response -> response).onComplete(response -> {
                if (Objects.nonNull(response) && !dataMap.keySet().isEmpty()) {
                    LOGGER.info(CacheMsg.DATA_REFRESHED, Ut.toJArray(dataMap.keySet()));
                }
            });
        }
    }

    void append(final ConcurrentMap dataMap) {
        if (this.redis.enabled()) {
            /*
             * Write cache ( APPEND )
             */
            final List requests = this.redis.requestDataAppend(dataMap);
            this.redis.requestAsync(requests, response -> response).onComplete(response -> {
                if (Objects.nonNull(response) && !dataMap.keySet().isEmpty()) {
                    LOGGER.info(CacheMsg.DATA_TREE, Ut.toJArray(dataMap.keySet()));
                }
            });
        }
    }

    void eraseTree(final String treeKey) {
        if (this.redis.enabled()) {
            final Request request = Request.cmd(Command.SMEMBERS);
            request.arg(treeKey);
            this.redis.requestAsync(request, response -> {
                final Set eraseKeys = new HashSet<>();
                /*
                 * Tree Major Key
                 */
                if (0 < response.size()) {
                    eraseKeys.add(treeKey);
                    response.stream().filter(Objects::nonNull).map(Response::toString).forEach(eraseKeys::add);
                }
                return eraseKeys;
            }).onComplete(completed -> {
                /*
                 * Collect all keys and remove all
                 * Command, DEL
                 */
                if (completed.succeeded()) {
                    final Set eraseKeys = completed.result();
                    if (Objects.nonNull(eraseKeys) && !eraseKeys.isEmpty()) {
                        /*
                         * Set
                         * Key is null, when it's not null here should execute
                         */
                        final List requests = this.redis.requestData(eraseKeys);
                        this.redis.requestAsync(requests, deletion -> deletion).onComplete(deletion -> {
                            if (Objects.nonNull(deletion) && deletion.succeeded()) {
                                LOGGER.info(CacheMsg.HIT_REMOVE, String.valueOf(eraseKeys.size()), Ut.toJArray(eraseKeys));
                            }
                        });
                    }
                }
            });
        }
    }

    @SuppressWarnings("all")
     Future readAsync(final String key) {
        final Request request = Request.cmd(Command.GET);
        request.arg(key);
        return this.redis.requestAsync(request, response -> {
            if (Objects.nonNull(response)) {
                final Buffer buffer = response.toBuffer();
                /*
                 * Whether it's refer
                 */
                if (Objects.isNull(buffer)) {
                    return null;
                } else {
                    final String literal = buffer.toString();
                    if (Ut.isJObject(literal)) {
                        /*
                         * Single Record
                         */
                        return new JsonObject(literal);
                    } else if (Ut.isJArray(literal)) {
                        /*
                         * Collection
                         */
                        return new JsonArray(literal);
                    } else {
                        /*
                         * Call self
                         */
                        return literal;
                    }
                }
            } else return null;
        }).compose(item -> {
            if (item instanceof String) {
                LOGGER.info(CacheMsg.HIT_SECONDARY, item, key);
                return this.readAsync(item.toString());
            } else {
                if (Objects.nonNull(item)) {
                    LOGGER.info(CacheMsg.HIT_DATA, key);
                    return Future.succeededFuture((T) item);
                } else {
                    LOGGER.info(CacheMsg.HIT_FAILURE, key);
                    return Future.succeededFuture();
                }
            }
        });
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy