package com.easyooo.framework.support.redis;
import java.util.List;
import java.util.Map;
import java.util.Set;
import redis.clients.jedis.Tuple;
/**
* 定义Redis操作接口, 接口方法取自REDIS命令的小部分
*
* @see 请参考 http://www.redisdoc.com/en/latest/
*
* @author Killer
*/
public interface RedisOperation {
/**
* 当 key 不存在时,返回 nil ,否则,返回 key 的值。
* 如果 key 不是字符串类型,那么返回一个错误。
*/
String get(String key);
/**
* 返回所有(一个或多个)给定 key 的值。
* 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。
* 因此,该命令永不失败。
*/
List<String> gets(String ...keys);
/**
* 同时设置一个或多个 key-value 对。
* 如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不是你所希望的效果,
* 请考虑使用 MSETNX 命令:它只会在所有给定 key 都不存在的情况下进行设置操作。
* MSET 是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,
* 某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。
*/
String sets(String ...keyvalues);
/**
* 将字符串值 value 关联到 key 。
* 如果 key 已经持有其他值, SET 就覆写旧值,无视类型。
* 对于某个原本带有生存时间(TTL)的键来说, 当 SET 命令成功在这个键上执行时, 这个键原有的 TTL 将被清除。
*/
String set(String key, int seconds, String value);
/**
* 将字符串值 value 关联到 key
* 该方法不存在失效的问题
* {@link #set(String, int, String)}
*/
String set(String key, String value);
/**
* 删除给定的一个或多个 key 。
* 不存在的 key 会被忽略。
* 返回被删除 key 的数量
*/
Long del(String ... keys);
/**
* 检查给定 key 是否存在。
*/
boolean exists(String key);
/**
* 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。
* 可以对一个已经带有生存时间的 key 执行 EXPIRE 命令,新指定的生存时间会取代旧的生存时间。
*/
Long expire(String key, Integer seconds);
/**
* EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置生存时间。
* 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
*/
Long expireAt(final String key, final long unixTime);
/**
* 移除给定 key 的生存时间,将这个 key 从『易失的』
* (带生存时间 key )转换成『持久的』(一个不带生存时间、永不过期的 key )。
*/
Long persist(String key);
/**
* 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
* @param key
* @return
*/
Long ttl(String key);
/**
* 将 key 中储存的数字值增一。
* 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
* 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
* 本操作的值限制在 64 位(bit)有符号数字表示之内。
*/
Long incr(String key);
/**
* 将 key 所储存的值加上增量 increment 。
* 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。
* 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
* 本操作的值限制在 64 位(bit)有符号数字表示之内。
*/
Long incrby(String key, Long increment);
/**
* 将 key 中储存的数字值减一
*/
Long decr(String key);
/**
* 将 key 所储存的值减去减量 decrement
*/
Long decrby(String key, Long decrement);
/**
* 根据参数 count 的值,移除列表中与参数 value 相等的元素。
* count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
* count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值
* count = 0 : 移除表中所有与 value 相等的值。
*/
Long lrem(String key, Long count , String value);
/**
* 将一个或多个值 value 插入到列表 key 的表尾(最右边)。
* 如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。
* 如果 key 不存在,一个空列表会被创建并执行 RPUSH 操作。
* 当 key 存在但不是列表类型时,返回一个错误。
*/
Long rpush(String key, String ...values);
/**
* 将一个或多个值 value 插入到列表 key 的表头
* 如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头:
* 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,
* 这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。
* 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。
* 当 key 存在但不是列表类型时,返回一个错误
*/
Long lpush(String key, String ...values);
/**
* 移除并返回列表 key 的头元素。
* 列表的头元素。当 key 不存在时,返回 nil 。
*/
String lpop(String key);
/**
* 移除并返回列表 key 的尾元素
* 列表的尾元素。当 key 不存在时,返回 nil 。
*/
String rpop(String key);
/**
* 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
* 下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
* 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
* 返回列表包括stop下标
*/
List<String> lrange(String key, Long start, Long stop);
/**
* 将列表 key 下标为 index 的元素的值设置为 value 。
* 当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。
*/
String lset(String key, Long index, String value);
/**
* 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
* 举个例子,执行命令 LTRIM list 0 2 ,表示只保留列表 list 的前三个元素,其余元素全部删除。
* 下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
* 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
* 当 key 不是列表类型时,返回一个错误
*/
String ltrim(String key, Long start, Long stop);
/**
* 返回列表 key 的长度。
* 如果 key 不存在,则 key 被解释为一个空列表,返回 0 .
* 如果 key 不是列表类型,返回一个错误。
*/
Long llen(String key);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// hash command
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* 为哈希表 key 中的域 field 的值加上增量 increment 。
* 增量也可以为负数,相当于对给定域进行减法操作。如果 key 不存在,
* 一个新的哈希表被创建并执行 HINCRBY 命令。
* 如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。
* 对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。
*/
Long hincrBy(String key, String field, Long increment);
/**
* 同时将多个 field-value (域-值)对设置到哈希表 key 中。
* 此命令会覆盖哈希表中已存在的域。
* 如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。
*/
String hmset(String key, Map<String ,String> fieldValues);
/**
* 返回哈希表 key 中,一个或多个给定域的值。
* 如果给定的域不存在于哈希表,那么返回一个 nil 值。
* 因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。
*/
List<String> hmget(String key, String ...fields);
/**
* 返回哈希表 key 中,所有的域和值。
* 在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。
*/
Map<String,String> hgetAll(String key);
/**
* 返回哈希表 key 中的所有域。
* 一个包含哈希表中所有域的表。当 key 不存在时,返回一个空表。
*/
Set<String> hkeys(String key);
/**
* 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
* @return 被成功移除的域的数量,不包括被忽略的域。
*/
Long hdel(String key, String ...fields);
/**
* 将哈希表 key 中的域 field 的值设为 value 。
* 如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。
* 如果域 field 已经存在于哈希表中,旧值将被覆盖。
*
* @return boolean
* 如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1 。
* 如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回 0 。
*/
boolean hset(String key, String field, String value);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// set command
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
* 假如 key 不存在,则创建一个只包含 member 元素作成员的集合。
* 当 key 不是集合类型时,返回一个错误。
* @return 被添加到集合中的新元素的数量,不包括被忽略的元素。
*/
Long sadd(String key, String...members);
/**
* 返回集合 key 的基数(集合中元素的数量)。
* @return 集合的基数。当 key 不存在时,返回 0 。
*/
Long scard(String key);
/**
* 返回集合 key 中的所有成员。 不存在的 key 被视为空集合
*/
Set<String> smembers(String key);
/**
* 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。
* 当 key 不是集合类型,返回一个错误。
* @return 被成功移除的元素的数量,不包括被忽略的元素。
*/
Long srem(String key, String ...values);
/**
* 如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。
* 从 Redis 2.6 版本开始, SRANDMEMBER 命令接受可选的 count 参数:
* 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
* 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
* SRANDMEMBER 则仅仅返回随机元素,而不对集合进行任何改动。
*/
List<String> srandmember(String key, Integer count);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// zadd command
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
* 如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
* score 值可以是整数值或双精度浮点数。
* 如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
* 当 key 存在但不是有序集类型时,返回一个错误。
* @param key
* @param score 比分(排序值)
* @param member 实际值
* @return
*/
Long zadd(final String key, final Double score, final String member);
/**
* @see #zadd(String, Double, String)
* @param key
* @param scoreMember
* @return
*/
Long zadd(final String key, Map<String, Double> scoreMember);
/**
* 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
* 当 key 存在但不是有序集类型时,返回一个错误。
* @param key
* @param member
* @return
*/
Long zrem(String key, String... member);
/**
* 为有序集 key 的成员 member 的 score 值加上增量 increment 。
* 可以通过传递一个负数值 increment ,让 score 减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。
* 当 key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。
* 当 key 不是有序集类型时,返回一个错误。
* score 值可以是整数值或双精度浮点数。
* @param key
* @param score
* @param member
* @return
*/
Double zincrby(String key, double score, String member);
/**
* 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
* 排名以 0 为底,也就是说, score 值最小的成员排名为 0 。
* 使用 ZREVRANK 命令可以获得成员按 score 值递减(从大到小)排列的排名。
* @param key
* @param member
* @return
*/
Long zrank(String key, String member);
/**
* 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。
* 排名以 0 为底,也就是说, score 值最大的成员排名为 0 。
* 使用 ZRANK 命令可以获得成员按 score 值递增(从小到大)排列的排名
* @param key
* @param member
* @return
*/
Long zrevrank(String key, String member);
/**
* 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
* @return
*/
Long zcount(String key, double min, double max);
/**
* 返回有序集 key 中,成员 member 的 score 值。
* 如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。
*/
Double zscore(String key, String member);
/**
* 返回有序集 key 中,指定区间内的成员。
* 其中成员的位置按 score 值递增(从小到大)来排序。
* 具有相同 score 值的成员按字典序(lexicographical order )来排列。
* 如果你需要成员按 score 值递减(从大到小)来排列,请使用 ZREVRANGE 命令。
* 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
* 你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
* 超出范围的下标并不会引起错误。比如说,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, ZRANGE 命令只是简单地返回一个空列表。
* 另一方面,假如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。
* 可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。
* 客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。
* @return
*/
Set<String> zrangeByIndex(String key, long start, long end);
/**
* 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
* 具有相同 score 值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。
* @return
*/
Set<String> zrangeByScore(String key, double min, double max);
/**
* 除了成员按 score 值递减的次序排列这一点外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一样。
* {@link #zrangeByIndex(String, long, long)}
*/
Set<String> zrevrangeByIndex(String key, long start, long end);
/**
* 除了成员按 score 值递减的次序排列这一点外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一样。
* {@link #zrangeByScore(String, double, double)}
* @param key
* @param max
* @param min
* @return
*/
Set<String> zrevrangeByScore(String key, double max, double min);
/**
* 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
* 有序集成员按 score 值递增(从小到大)次序排列。
* LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count ),
* 注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集
*/
Set<String> zrangeByScore(String key, double min, double max, int offset,
int count);
/**
* {@link #zrangeByScore(String, double, double, int, int)}
*/
Set<String> zrevrangeByScore(String key, double max, double min,
int offset, int count);
/**
* {@link #zrangeByIndex(String, long, long)
*/
Set<Tuple> zrangeWithScores(String key, long start, long end);
/**
* {@link #zrevrangeByIndex(String, long, long)}
*/
Set<Tuple> zrevrangeWithScores(String key, long start, long end);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// other command
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* 确保在一个事务块中执行redis操作
* @param callback 所有的操作写在callback中
*/
List<Object> transaction(final TransactionCallback callback);
/**
* 批量执行多条命令
* @param callback 所有的操作卸载该回调函数中
*/
void pipelined(final PiplineCallback callback);
}