}
/**
获取到key对应的value的长度
注: 长度等于{@link String#length}
注: 若redis中不存在对应的key-value,则返回值为0.
@param key 定位value的key
@return value的长度
*/
public static long size(String key) {
log.info(“size(…) => key -> {}”, key);
Long result = redisTemplate.opsForValue().size(key);
log.info(“size(…) => result -> {}”, result);
if (result == null) {
throw new RedisOpsResultIsNullException();
}
return result;
}
/**
批量设置 key-value
注: 若存在相同的key,则原来的key-value会被丢弃
@param maps key-value 集
*/
public static void multiSet(Map
log.info(“multiSet(…) => maps -> {}”, maps);
redisTemplate.opsForValue().multiSet(maps);
}
/**
当redis中,不存在任何一个keys时,才批量设置 key-value,并返回成功/失败.
否者,不进行任何操作,并返回false
即: 假设调用此方法时传入的参数map是这样的: {k1=v1,k2=v2,k3=v3}
那么redis中,k1、k2、k3都不存在时,才会批量设置key-value;
否则不会设置任何key-value
注: 若存在相同的key,则原来的key-value会被丢弃
注:
@param maps key-value 集
@return 操作是否成功
*/
public static boolean multiSetIfAbsent(Map
log.info(“multiSetIfAbsent(…) => maps -> {}”, maps);
Boolean result = redisTemplate.opsForValue().multiSetIfAbsent(maps);
log.info(“multiSetIfAbsent(…) => result -> {}”, result);
if (result == null) {
throw new RedisOpsResultIsNullException();
}
return result;
}
/**
增/减 整数
注: 负数则为减
注: 若key对应的value值不支持增/减操作(即: value不是数字),那么会
抛出org.springframework.data.redis.RedisSystemException
@param key 用于定位value的key
@param increment 增加多少
@return 增加后的总值
@throws RedisSystemException key对应的value值不支持增/减操作时
*/
public static long incrBy(String key, long increment) {
log.info(“incrBy(…) => key -> {},increment -> {}”, key, increment);
Long result = redisTemplate.opsForValue().increment(key, increment);
log.info(“incrBy(…) => result -> {}”, result);
if (result == null) {
throw new RedisOpsResultIsNullException();
}
return result;
}
/**
增/减 浮点数
注: 慎用浮点数,会有精度问题
如: 先 RedisUtil.StringOps.set(“ds”,“123”);
然后再RedisUtil.StringOps.incrByFloat(“ds”,100.6);
就会看到精度问题
注: 负数则为减
注: 若key对应的value值不支持增/减操作(即: value不是数字),那么会
抛出org.springframework.data.redis.RedisSystemException
@param key 用于定位value的key
@param increment 增加多少
@return 增加后的总值
@throws RedisSystemException key对应的value值不支持增/减操作时
*/
public static double incrByFloat(String key, double increment) {
log.info(“incrByFloat(…) => key -> {},increment -> {}”, key, increment);
Double result = redisTemplate.opsForValue().increment(key, increment);
log.info(“incrByFloat(…) => result -> {}”, result);
if (result == null) {
throw new RedisOpsResultIsNullException();
}
return result;
}
/**
追加值到末尾
注: 当redis中原本不存在key时,那么(从效果上来看)此方法就等价于{@link this#set(String, String)}
@param key 定位value的key
@param value 要追加的value值
@return 追加后, 整个value的长度
*/
public static int append(String key, String value) {
log.info(“append(…) => key -> {},value -> {}”, key, value);
Integer result = redisTemplate.opsForValue().append(key, value);
log.info(“append(…) => result -> {}”, result);
if (result == null) {
throw new RedisOpsResultIsNullException();
}
return result;
}
/**
根据key,获取到对应的value值
@param key key-value对应的key
@return 该key对应的值
注: 若key不存在,则返回null
*/
public static String get(String key) {
log.info(“get(…) => key -> {}”, key);
String result = redisTemplate.opsForValue().get(key);
log.info("get(…) => result -> {} ", result);
return result;
}
/**
对(key对应的)value进行截取,截取范围为[start,end]
注: 若[start,end]的范围不在value的范围中,那么返回的是空字符串 “”
注: 若value只有一部分在[start,end]的范围中,那么返回的是value对应部分的内容(即:不足的地方,并不会以空来填充)
@param key 定位value的key
@param start 起始位置 (从0开始)
@param end 结尾位置 (从0开始)
@return 截取后的字符串
*/
public static String getRange(String key, long start, long end) {
log.info(“getRange(…) => kry -> {}”, key);
String result = redisTemplate.opsForValue().get(key, start, end);
log.info("getRange(…) => result -> {} ", result);
return result;
}
/**
给指定key设置新的value,并返回旧的value
注: 若redis中不存在key,那么此操作仍然可以成功,不过返回的旧值是null
@param key 定位value的key
@param newValue 要为该key设置的新的value值
@return 旧的value值
*/
public static String getAndSet(String key, String newValue) {
log.info(“getAndSet(…) => key -> {},value -> {}”, key, newValue);
String oldValue = redisTemplate.opsForValue().getAndSet(key, newValue);
log.info(“getAndSet(…) => oldValue -> {}”, oldValue);
return oldValue;
}
/**
获取(key对应的)value在二进制下,offset位置的bit值
注: 当offset的值在(二进制下的value的)索引范围外时,返回的也是false
示例:
RedisUtil.StringOps.set(“akey”,“a”);
字符串a,转换为二进制为01100001
那么getBit(“akey”,6)获取到的结果为false
@param key 定位value的key
@param offset 定位bit的索引
@return offset位置对应的bit的值(true - 1, false - 0)
*/
public static boolean getBit(String key, long offset) {
log.info(“getBit(…) => key -> {},offset -> {}”, key, offset);
Boolean result = redisTemplate.opsForValue().getBit(key, offset);
log.info(“getBit(…) => result -> {}”, result);
if (result == null) {
throw new RedisOpsResultIsNullException();
}
return result;
}
/**
批量获取value值
注: 若redis中,对应的key不存在,那么该key对应的返回的value值为null
@param keys key集
@return value值集合
*/
public static List multiGet(Collection keys) {
log.info(“multiGet(…) => keys -> {}”, keys);
List result = redisTemplate.opsForValue().multiGet(keys);
log.info(“multiGet(…) => result -> {}”, result);
return result;
}
}
/**
hash相关操作
提示: 简单的,可以将redis中hash的数据结构看作是 Map
*/
public static class HashOps {
/**
向key对应的hash中,增加一个键值对entryKey-entryValue
注: 同一个hash里面,若已存在相同的entryKey,那么此操作将丢弃原来的entryKey-entryValue,
而使用新的entryKey-entryValue
@param key 定位hash的key
@param entryKey 要向hash中增加的键值对里的 键
@param entryValue 要向hash中增加的键值对里的 值
*/
public static void hPut(String key, String entryKey, String entryValue) {
log.info(“hPut(…) => key -> {},entryKey -> {},entryValue -> {}”, key, entryKey, entryValue);
redisTemplate.opsForHash().put(key, entryKey, entryValue);
}
/**
向key对应的hash中,增加maps(即: 批量增加entry集)
注: 同一个hash里面,若已存在相同的entryKey,那么此操作将丢弃原来的entryKey-entryValue,
而使用新的entryKey-entryValue
@param key 定位hash的key
@param maps 要向hash中增加的键值对集
*/
public static void hPutAll(String key, Map
log.info(“hPutAll(…) => key -> {},maps -> {}”, key, maps);
redisTemplate.opsForHash().putAll(key, maps);
}
/**
当key对应的hash中,不存在entryKey时,才(向key对应的hash中,)增加entryKey-entryValue
否则,不进行任何操作
@param key 定位hash的key
@param entryKey 要向hash中增加的键值对里的 键
@param entryValue 要向hash中增加的键值对里的 值
@return 操作是否成功
*/
public static boolean hPutIfAbsent(String key, String entryKey, String entryValue) {
log.info(“hPutIfAbsent(…) => key -> {},entryKey -> {},entryValue -> {}”,
key, entryKey, entryValue);
Boolean result = redisTemplate.opsForHash().putIfAbsent(key, entryKey, entryValue);
log.info(“hPutIfAbsent(…) => result -> {}”, result);
if (result != null) {
throw new RedisOpsResultIsNullException();
}
return result;
}
/**
获取到key对应的hash里面的对应字段的值
注: 若redis中不存在对应的key,则返回null
若key对应的hash中不存在对应的entryKey,也会返回null
@param key 定位hash的key
@param entryKey 定位hash里面的entryValue的entryKey
@return key对应的hash里的entryKey对应的entryValue值
*/
public static Object hGet(String key, String entryKey) {
log.info(“hGet(…) => key -> {},entryKey -> {}”, key, entryKey);
Object entryValue = redisTemplate.opsForHash().get(key, entryKey);
log.info(“hGet(…) => entryValue -> {}”, entryValue);
return entryValue;
}
/**
获取到key对应的hash(即: 获取到key对应的Map
注: 若redis中不存在对应的key,则返回一个没有任何entry的空的Map(,而不是返回null)
@param key 定位hash的key
@return key对应的hash
*/
public static Map
log.info(“hGetAll(…) => key -> {}”, key);
Map
log.info(“hGetAll(…) => result -> {}”, result);
return result;
}
/**
批量获取(key对应的)hash中的entryKey的entryValue
注: 若hash中对应的entryKey不存在,那么返回的对应的entryValue值为null
注: redis中key不存在,那么返回的List中,每个元素都为null
追注: 这个List本身不为null,size也不为0,只是每个list中的每个元素为null而已
@param key 定位hash的key
@param entryKeys 需要获取的hash中的字段集
@return hash中对应entryKeys的对应entryValue集
*/
public static List hMultiGet(String key, Collection entryKeys) {
log.info(“hMultiGet(…) => key -> {},entryKeys -> {}”, key, entryKeys);
List entryValues = redisTemplate.opsForHash().multiGet(key, entryKeys);
log.info(“hMultiGet(…) => entryValues -> {}”, entryValues);
return entryValues;
}
/**
(批量)删除(key对应的)hash中的对应entryKey-entryValue
注: 1、若redis中不存在对应的key,则返回0;
2、若要删除的entryKey,在key对应的hash中不存在,在count不会+1,如:
RedisUtil.HashOps.hPut(“ds”,“name”,“邓沙利文”);
RedisUtil.HashOps.hPut(“ds”,“birthday”,“1994-02-05”);
RedisUtil.HashOps.hPut(“ds”,“hobby”,“女”);
则调用RedisUtil.HashOps.hDelete(“ds”,“name”,“birthday”,“hobby”,“non-exist-entryKey”)
的返回结果为3
注: 若(key对应的)hash中的所有entry都被删除了,那么该key也会被删除
@param key 定位hash的key
@param entryKeys 定位要删除的entryKey-entryValue的entryKey
@return 删除了对应hash中多少个entry
*/
public static long hDelete(String key, Object… entryKeys) {
log.info(“hDelete(…) => key -> {},entryKeys -> {}”, key, entryKeys);
Long count = redisTemplate.opsForHash().delete(key, entryKeys);
log.info(“hDelete(…) => count -> {}”, count);
if (count == null) {
throw new RedisOpsResultIsNullException();
}
return count;
}
/**
查看(key对应的)hash中,是否存在entryKey对应的entry
注: 若redis中不存在key,则返回false
注: 若key对应的hash中不存在对应的entryKey,也会返回false
@param key 定位hash的key
@param entryKey 定位hash中entry的entryKey
@return hash中是否存在entryKey对应的entry.
*/
public static boolean hExists(String key, String entryKey) {
log.info(“hDelete(…) => key -> {},entryKeys -> {}”, key, entryKey);
Boolean exist = redisTemplate.opsForHash().hasKey(key, entryKey);
log.info(“hDelete(…) => exist -> {}”, exist);
return exist;
}
/**
增/减(hash中的某个entryValue值) 整数
注: 负数则为减
注: 若key不存在,那么会自动创建对应的hash,并创建对应的entryKey、entryValue,entryValue的初始值为increment
注: 若entryKey不存在,那么会自动创建对应的entryValue,entryValue的初始值为increment
注: 若key对应的value值不支持增/减操作(即: value不是数字),那么会
抛出org.springframework.data.redis.RedisSystemException
@param key 用于定位hash的key
@param entryKey 用于定位entryValue的entryKey
@param increment 增加多少
@return 增加后的总值
@throws RedisSystemException key对应的value值不支持增/减操作时
*/
public static long hIncrBy(String key, Object entryKey, long increment) {
log.info(“hIncrBy(…) => key -> {},entryKey -> {},increment -> {}”,
key, entryKey, increment);
Long result = redisTemplate.opsForHash().increment(key, entryKey, increment);
log.info(“hIncrBy(…) => result -> {}”, result);
if (result == null) {
throw new RedisOpsResultIsNullException();
}
return result;
}
/**
增/减(hash中的某个entryValue值) 浮点数
注: 负数则为减
注: 若key不存在,那么会自动创建对应的hash,并创建对应的entryKey、entryValue,entryValue的初始值为increment
注: 若entryKey不存在,那么会自动创建对应的entryValue,entryValue的初始值为increment
注: 若key对应的value值不支持增/减操作(即: value不是数字),那么会
抛出org.springframework.data.redis.RedisSystemException
注: 因为是浮点数,所以可能会和{@link StringOps#incrByFloat(String, double)}一样,出现精度问题
追注: 本人简单测试了几组数据,暂未出现精度问题
@param key 用于定位hash的key
@param entryKey 用于定位entryValue的entryKey
@param increment 增加多少
@return 增加后的总值
@throws RedisSystemException key对应的value值不支持增/减操作时
*/
public static double hIncrByFloat(String key, Object entryKey, double increment) {
log.info(“hIncrByFloat(…) => key -> {},entryKey -> {},increment -> {}”,
key, entryKey, increment);
Double result = redisTemplate.opsForHash().increment(key, entryKey, increment);
log.info(“hIncrByFloat(…) => result -> {}”, result);
if (result == null) {
throw new