/** * Executes the given action object within a connection, which can be exposed or not. * * @param <T> return type * @param action callback object that specifies the Redis action * @param exposeConnection whether to enforce exposure of the native Redis Connection to callback code * @return object returned by the action */ @Nullable public <T> T execute(RedisCallback<T> action, boolean exposeConnection) { return execute(action, exposeConnection, false); }
@Override @Nullable public <T> T execute(RedisCallback<T> action) { return execute(action, isExposeConnection()); }
@Override public void discard() { execute(connection -> { connection.discard(); return null; }, true); }
@Override public void slaveOfNoOne() { execute((RedisCallback<Void>) connection -> { connection.slaveOfNoOne(); return null; }); }
@Override public K randomKey() { byte[] rawKey = execute(RedisKeyCommands::randomKey, true); return deserializeKey(rawKey); }
@Override public void slaveOf(final String host, final int port) { execute((RedisCallback<Void>) connection -> { connection.slaveOf(host, port); return null; }); }
@Override public Boolean unlink(K key) { byte[] rawKey = rawKey(key); Long result = execute(connection -> connection.unlink(rawKey), true); return result != null && result.intValue() == 1; }
@Override public Boolean delete(K key) { byte[] rawKey = rawKey(key); Long result = execute(connection -> connection.del(rawKey), true); return result != null && result.intValue() == 1; }
@Override public Long delete(Collection<K> keys) { if (CollectionUtils.isEmpty(keys)) { return 0L; } byte[][] rawKeys = rawKeys(keys); return execute(connection -> connection.del(rawKeys), true); }
@Override public Long countExistingKeys(Collection<K> keys) { Assert.notNull(keys, "Keys must not be null!"); byte[][] rawKeys = rawKeys(keys); return execute(connection -> connection.exists(rawKeys), true); }
@Override public Boolean hasKey(K key) { byte[] rawKey = rawKey(key); return execute(connection -> connection.exists(rawKey), true); }
@Override public Long getExpire(K key) { byte[] rawKey = rawKey(key); return execute(connection -> connection.ttl(rawKey), true); }
@Override public Boolean persist(K key) { byte[] rawKey = rawKey(key); return execute(connection -> connection.persist(rawKey), true); }
@Override public Boolean move(K key, final int dbIndex) { byte[] rawKey = rawKey(key); return execute(connection -> connection.move(rawKey, dbIndex), true); }
@Override public DataType type(K key) { byte[] rawKey = rawKey(key); return execute(connection -> connection.type(rawKey), true); }
@Override public void convertAndSend(String channel, Object message) { Assert.hasText(channel, "a non-empty channel is required"); byte[] rawChannel = rawString(channel); byte[] rawMessage = rawValue(message); execute(connection -> { connection.publish(rawChannel, rawMessage); return null; }, true); }
@Override public Boolean renameIfAbsent(K oldKey, K newKey) { byte[] rawOldKey = rawKey(oldKey); byte[] rawNewKey = rawKey(newKey); return execute(connection -> connection.renameNX(rawOldKey, rawNewKey), true); }
@Override public Long getExpire(K key, final TimeUnit timeUnit) { byte[] rawKey = rawKey(key); return execute(connection -> { try { return connection.pTtl(rawKey, timeUnit); } catch (Exception e) { // Driver may not support pTtl or we may be running on Redis 2.4 return connection.ttl(rawKey, timeUnit); } }, true); }
@Override public void rename(K oldKey, K newKey) { byte[] rawOldKey = rawKey(oldKey); byte[] rawNewKey = rawKey(newKey); execute(connection -> { connection.rename(rawOldKey, rawNewKey); return null; }, true); }
@Override public <T> List<T> sort(SortQuery<K> query, @Nullable RedisSerializer<T> resultSerializer) { byte[] rawKey = rawKey(query.getKey()); SortParameters params = QueryUtils.convertQuery(query, stringSerializer); List<byte[]> vals = execute(connection -> connection.sort(rawKey, params), true); return SerializationUtils.deserialize(vals, resultSerializer); }