Springboot之项目技术集成,Java常用笔试题

}

/**

  • 获取到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<String, String> maps) {

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<String, String> maps) {

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<String,Map<HK,HV>>

*/

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<String, String> maps) {

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<HK,HV>)

  • 注: 若redis中不存在对应的key,则返回一个没有任何entry的空的Map(,而不是返回null)

  • @param key 定位hash的key

  • @return key对应的hash

*/

public static Map<Object, Object> hGetAll(String key) {

log.info(“hGetAll(…) => key -> {}”, key);

Map<Object, Object> result = redisTemplate.opsForHash().entries(key);

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 RedisOp

  • 26
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值