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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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
目录
打赏
0
0
0
0
143
分享
相关文章
|
13天前
|
Redis如何优化频繁命令往返造成的性能瓶颈?
频繁的命令往返是Redis性能优化中需要重点关注的问题。通过使用Pipeline、Lua脚本、事务、合并命令、连接池以及合理设置网络超时,可以有效减少网络往返次数,优化Redis的性能。这些优化措施不仅提升了Redis的处理能力,还能确保系统在高并发情况下的稳定性和可靠性。
37 14
Redis是如何建立连接和处理命令的
本文主要讲述 Redis 是如何监听客户端发出的set、get等命令的。
1305 160
java连接redis和基础操作命令
通过以上内容,您可以掌握在Java中连接Redis以及进行基础操作的基本方法,进而在实际项目中灵活应用。
129 30
|
5月前
|
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
93 5
|
6月前
|
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
135 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
Redis如何解决频繁的命令往返造成的性能瓶颈!
Redis如何解决频繁的命令往返造成的性能瓶颈!
|
5月前
|
Redis命令:列表模糊删除详解
通过本文的介绍,我们详细探讨了如何在Redis中实现列表的模糊删除。虽然Redis没有直接提供模糊删除命令,但可以通过组合使用 `LRANGE`和 `LREM`命令,并在客户端代码中进行模糊匹配,来实现这一功能。希望本文能帮助你在实际应用中更有效地操作Redis列表。
176 0
|
6月前
|
Redis命令:列表模糊删除详解
Redis命令:列表模糊删除详解
150 3
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
799 0
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
Redis 命令
10月更文挑战第15天
69 0