Redis字符串
Redis Mget 命令
Redis Mget 命令返回所有(一个或多个)给定 key 的值。 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。
语法
redis Mget 命令基本语法如下:
redis 127.0.0.1:6379> MGET KEY1 KEY2 .. KEYN
可用版本
>= 1.0.0
返回值
一个包含所有给定 key 的值的列表。
实例
redis 127.0.0.1:6379> SET key1 "hello"
OK
redis 127.0.0.1:6379> SET key2 "world"
OK
redis 127.0.0.1:6379> MGET key1 key2 someOtherKey
1) "Hello"
2) "World"
3) (nil)
代码如下:
@Autowired
private RedisClusterCmds<String, String> redisClusterCmds;
/**
* 批量获取key对应的value值
* cacheKeys:key值集合
* cacheData:返回值,当对应的key值不存在时,value为""或null
*/
String[] cacheKeys = new String[]{"key1,key2"};
List<KeyValue<String, String>> cacheData = redisClusterCmds.mget(cacheKeys);
if(CollectionUtils.isNotEmpty(cacheData)) {
cacheData.stream().forEach(e -> {
String val = e.getValueOrElse("");
String key = e.getKey();
});
}
Redis Mset 命令
Redis Mset 命令用于同时设置一个或多个 key-value 对。
语法
redis Mset 命令基本语法如下:
redis 127.0.0.1:6379> MSET key1 value1 key2 value2 .. keyN valueN
可用版本
>= 1.0.1
返回值
总是返回 OK 。
实例
redis 127.0.0.1:6379> MSET key1 "Hello" key2 "World"
OK
redis 127.0.0.1:6379> GET key1
"Hello"
redis 127.0.0.1:6379> GET key2
1) "World"
代码如下:
Map<String, String> cacheMap = new HashMap<>();
cacheMap.put("key1","value1");
cacheMap.put("key2","value2");
/**
* mset:批量设置key-value,等同于多次执行set语句。
* 此次使用pipeline来操作redis
*/
redisClusterCmds.pipeline4List(command -> {
log.info("set cache:{},{}", cacheMap, redisClusterCmds.mset(cacheMap));
for (String key : cacheMap.keySet()) {
try {
command.expire(key, EXPIRE_SEC);
} catch (Exception e) {
log.error("设置redis缓存失效时间异常err,key:{}", key, e);
}
}
return new ArrayList<>();
});
Redis Incr 命令
Redis Incr 命令将 key 中储存的数字值增一。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
语法
redis Incr 命令基本语法如下:
redis 127.0.0.1:6379> INCR KEY_NAME
可用版本
>= 1.0.0
返回值
执行 INCR 命令之后 key 的值。
实例
redis> SET page_view 20
OK
redis> INCR page_view
(integer) 21
redis> GET page_view # 数字值在 Redis 中以字符串的形式保存
"21"
Redis Incrby 命令
Redis Incrby 命令将 key 中储存的数字加上指定的增量值。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
语法
redis Incrby 命令基本语法如下:
redis 127.0.0.1:6379> INCRBY KEY_NAME INCR_AMOUNT
可用版本
>= 1.0.0
返回值
加上指定的增量值之后, key 的值。
实例
# key 存在且是数字值
redis> SET rank 50
OK
redis> INCRBY rank 20
(integer) 70
redis> GET rank
"70"
# key 不存在时
redis> EXISTS counter
(integer) 0
redis> INCRBY counter 30
(integer) 30
redis> GET counter
"30"
# key 不是数字值时
redis> SET book "long long ago..."
OK
redis> INCRBY book 200
(error) ERR value is not an integer or out of range
Redis哈希
Redis Hmget 命令
Redis Hmget 命令用于返回哈希表中,一个或多个给定字段的值。
如果指定的字段不存在于哈希表,那么返回一个 nil 值。
语法
redis Hmget 命令基本语法如下:
redis 127.0.0.1:6379> HMGET KEY_NAME FIELD1...FIELDN
可用版本
>= 2.0.0
返回值
一个包含多个给定字段关联值的表,表值的排列顺序和指定字段的请求顺序一样。
实例
redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HSET myhash field2 "bar"
(integer) 1
redis 127.0.0.1:6379> HMGET myhash field1 field2 nofield
1) "foo"
2) "bar"
3) (nil)
代码如下:
public void test() {
// hmget命令:获取所有键值对
String redisKey = VIP_WHILTE_USE;
List<KeyValue<String, String>> valuesAll = vipDataSzMaster.hmget(redisKey);
for (KeyValue<String, String> keyValue : valuesAll) {
String value = keyValue.getValue();
String key = keyValue.getKey();
}
// hmget命令:获取指定键值对
List<KeyValue<String, String>> values = vipDataSzMaster.hmget(redisKey,"key1","key2");
for (KeyValue<String, String> keyValue : valuesAll) {
String value = keyValue.getValue();
String key = keyValue.getKey();
}
// hget命令:获取单个key的value值
String value1 = vipDataSzMaster.hget(redisKey, "key1");
}
Redis Hmset 命令
Redis Hmset 命令用于同时将多个 field-value (字段-值)对设置到哈希表中。
此命令会覆盖哈希表中已存在的字段。
如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。
语法
redis Hmset 命令基本语法如下:
redis 127.0.0.1:6379> HMSET KEY_NAME FIELD1 VALUE1 ...FIELDN VALUEN
可用版本
>= 2.0.0
返回值
如果命令执行成功,返回 OK 。
实例
redis 127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World"
OK
redis 127.0.0.1:6379> HGET myhash field1
"Hello"
redis 127.0.0.1:6379> HGET myhash field2
"World"
代码如下:
public void test() {
// hmset命令:设置所有键值对
String redisKey = VIP_WHILTE_USE;
Map<String,String> hashMap = new HashMap<>();
hashMap.put("key1","value1");
hashMap.put("key2","value2");
String ok = vipDataSzMaster.hmset(redisKey, hashMap);
// hget命令:设置指定key的value值
Boolean flag = vipDataSzMaster.hset(redisKey, "key1", "value1");
}
Redis有序集合
Redis Zscan 命令
Redis Zscan 命令用于迭代有序集合中的元素(包括元素成员和元素分值)
语法
redis Zscan 命令基本语法如下:
redis 127.0.0.1:6379> ZSCAN key cursor [MATCH pattern] [COUNT count]
- cursor - 游标。
- pattern - 匹配的模式。
- count - 指定从数据集里返回多少元素,默认值为 10 。
可用版本
>= 2.8.0
返回值
返回的每个元素都是一个有序集合元素,一个有序集合元素由一个成员(member)和一个分值(score)组成。
实例
> ZADD site 1 "Google" 2 "Runoob" 3 "Taobao" 4 "Weibo"
(integer) 4
> ZSCAN site 0 match "R*"
1) "0"
2) 1) "Runoob"
2) 2.0
代码如下:
public void test() {
// 设置游标
String cursor = "0";
ScanCursor scanCursor = new ScanCursor();
scanCursor.setCursor(cursor);
// 设置查询范围(每次查询100条数据)
ScanArgs scanArgs = new ScanArgs();
scanArgs.limit(100);
scanArgs.match("*");
while (true){
ScoredValueScanCursor<String> zscan = vipRankSlavePoolRedisCommands.zscan(key,scanCursor,scanArgs);
for (ScoredValue<String> valueScored : zscan.getValues()) {
String value = valueScored.getValue();
double score = valueScored.getScore();
// todo 业务操作
}
cursor = zscan.getCursor();
if ("0".equals(cursor) || CollectionUtils.isEmpty(zscan.getValues())) {
break;
}
}
}
Redis Zadd 命令
Redis Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中。
如果某个成员已经是有序集的成员,那么更新这个成员的分数值,并通过重新插入这个成员元素,来保证该成员在正确的位置上。
分数值可以是整数值或双精度浮点数。
如果有序集合 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
当 key 存在但不是有序集类型时,返回一个错误。
注意: 在 Redis 2.4 版本以前, ZADD 每次只能添加一个元素。
语法
redis Zadd 命令基本语法如下:
redis 127.0.0.1:6379> ZADD KEY_NAME SCORE1 VALUE1.. SCOREN VALUEN
可用版本
>= 1.2.0
返回值
被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。
实例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 1 "uno"
(integer) 1
redis> ZADD myzset 2 "two" 3 "three"
(integer) 2
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "uno"
4) "1"
5) "two"
6) "2"
7) "three"
8) "3"
redis>
具体请查看redis官网内容:https://www.runoob.com/redis/redis-strings.html