Redis中随机属性的命令的注意事项

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

1. Redis命令属性介绍


Redis的不同命令拥有不同的属性,如是否是只读命令,是否是管理员命令等,一个命令可以拥有多个属性。在一些特殊情况下不同属性的命令会有不同的表现。


下表归纳了一些常见的属性及其含义:

wKiom1lEg27SVHwEAAEDXKTCz80141.png




2.REDIS_CMD_SORT_FOR_SCRIPT命令的特点


为了对随机属性有更直观的理解,我们以KEYS为例:

在我们加入一个key之前,先查看Redis当前key*:

1) "DIK.2"

2) "VOL_my_t2"

3) "volume.47"

4) "DISK.18"

………….

73) "chap.2"

74) "CLONE_ID_NEXT"

75) "INITGRP_ID"

76) "snapshot.t1.1448"

77) "initGrp.4"


紧接着,加入一个key,再看看它的位置:

127.0.0.1:6379> set ALIBABA 1

127.0.0.1:6379> keys *

1) "DISK.2"

2) "VOLUMEINFO_my_t2"

3) "volume.47"

4) "DISK.18"

………….

74) "CLONE_ID_NEXT"

75) "ALIBABA"

76) "INITGRP_ID"

77) "snapshot.t1.1448"

78) "initGrp.4"



通过上面的示例,可以看大插入一个key之后,Redis会根据内部顺序把新插入的key放入到数据库里面,但用户不能根据任何顺序假定它的位置。


3.示例

理解了上面对REDIS_CMD_SORT_FOR_SCRIPT的特殊属性之后,就不难看出下面一段程序的问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
     reply
= redis_read(alert_con,  "HVALS %s" , id_string);
   if
(reply == NULL) {
       LOGLIB_ERROR("%s:
Redis run HVALS error!\n", __FUNCTION__);
       ret
= -2;
   }
else  {
       ret
= reply->elements;
       if
(ret != MEMBER_ITEM_CNT - 1) {
           /*
not sure whther this checki is correct */
           printf
               ("%s:
HVLAS %s  return  %d fields, less than expection!\n",
                __FUNCTION__,
id_string, ret);
           ret
= -3;
       }
else  {
           ret
= 0;
 
           /*
step 1.1: check whether returned value is number of field */
 
           /*
step 1.2: Init the alert content with the returned value of above cmd
*/
           alert->timestamp.tv_sec
=
               strtoul (( const
char  *) (reply->element[0]->str), &pstr, 0);
           alert->id
atoi (reply->element[1]->str);
           alert->op
atoi (reply->element[2]->str);
           alert->severity
atoi (reply->element[3]->str);
           memcpy (alert->description,
reply->element[4]->str,
                  strlen (reply->element[4]->str)
+ 1);
           alert->category
atoi (reply->element[5]->str);
           alert->comp
atoi (reply->element[6]->str);
           alert->comp_id
atoi (reply->element[7]->str);
           alert->type.val
atoi (reply->element[8]->str);
 
           sscanf (reply->element[9]->str,
"%d" , &alert->data[0]);
           sscanf (reply->element[10]->str,
"%d" , &alert->data[1]);
 
           strcpy (alert->name,
reply->element[11]->str);
       }
   }


上面的代码中Redis命令“HVALS”的属性是REDIS_CMD_SORT_FOR_SCRIPT,取到的键值对的顺序是随机的,需要用 “HMGET”来替代。


4.总结

在程序或者脚本中调用Redis一些命令的时候,务必注意所调用命令的属性,特别是像上面HVALS例子所显示的,否则可能出现非常奇怪但又不便检查和调试的现象。















本文转自存储之厨51CTO博客,原文链接:http://blog.51cto.com/xiamachao/1939241,如需转载请自行联系原作者


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
NoSQL Redis 数据库
10- 你们用过Redis的事务吗 ? 事务的命令有哪些 ?
```markdown Redis事务包括MULTI、EXEC、DISCARD、WATCH四个命令。虽具备事务功能,但在实际开发中使用较少。 ```
41 7
|
1月前
|
NoSQL Redis 数据库
Redis的全局命令及相关误区
Redis的全局命令及相关误区
24 0
|
1月前
|
存储 缓存 NoSQL
深入了解Redis键管理:探索Redis键命令及其功能与应用场景
深入了解Redis键管理:探索Redis键命令及其功能与应用场景
|
1天前
|
存储 NoSQL Redis
Redis基础命令集详解
Redis基础命令集详解
8 1
|
1天前
|
存储 NoSQL Redis
Redis 常用命令
Redis 常用命令
8 0
|
2天前
|
存储 NoSQL Redis
深入浅出Redis(零):Redis常用命令的使用
深入浅出Redis(零):Redis常用命令的使用
|
2天前
|
存储 NoSQL 关系型数据库
深入浅出Redis(十二):Redis的排序命令Sort
深入浅出Redis(十二):Redis的排序命令Sort
|
3天前
|
NoSQL Linux Redis
Redis的介绍,以及Redis的安装(本机windows版,虚拟机Linux版)和Redis常用命令的介绍
Redis的介绍,以及Redis的安装(本机windows版,虚拟机Linux版)和Redis常用命令的介绍
17 0
|
6天前
|
存储 NoSQL 定位技术
Redis常用数据类型及常用命令
这些是Redis中常用的数据类型和命令。Redis还提供了许多其他命令和功能,用于数据存储、操作和查询。你可以根据需要选择适当的数据类型和命令来满足你的应用程序需求。
21 4
|
9天前
|
监控 NoSQL 算法
探秘Redis分布式锁:实战与注意事项
本文介绍了Redis分区容错中的分布式锁概念,包括利用Watch实现乐观锁和使用setnx防止库存超卖。乐观锁通过Watch命令监控键值变化,在事务中执行修改,若键值被改变则事务失败。Java代码示例展示了具体实现。setnx命令用于库存操作,确保无超卖,通过设置锁并检查库存来更新。文章还讨论了分布式锁存在的问题,如客户端阻塞、时钟漂移和单点故障,并提出了RedLock算法来提高可靠性。Redisson作为生产环境的分布式锁实现,提供了可重入锁、读写锁等高级功能。最后,文章对比了Redis、Zookeeper和etcd的分布式锁特性。
111 16
探秘Redis分布式锁:实战与注意事项