redis学习之redis命令01
APPEND命令
时间复杂度及开始版本
版本:2.0.0
时间复杂度:O(1)。均摊时间复杂度是O(1), 因为redis用的动态字符串的库在每次分配空间的时候会增加一倍的可用空闲空间,所以在添加的value较小而且已经存在的 value是任意大小的情况下,均摊时间复杂度是O(1)。命令描述
如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作,这种情况 APPEND 将类似于 SET 操作。返回值
Integer reply:返回append后字符串值(value)的长度。例子
127.0.0.1:6379> exists mykey (integer) 0 127.0.0.1:6379> append mykey hello (integer) 5 127.0.0.1:6379> append mykey " world." (integer) 12 127.0.0.1:6379> get mykey "hello world." 127.0.0.1:6379>
auth命令
描述
为redis服务请求设置一个密码。redis可以设置在客户端执行commands请求前需要通过密码验证。通过修改配置文件的requirepass就可以设置密码。 如果密码与配置文件里面设置的密码一致,服务端就会发会一个OK的状态码,接受客户端发送其他的请求命令,否则服务端会返回一个错误码,客户端需要尝试使用新的密码来进行连接。注意: 因为redis的高性能能在短时间接受非常多的尝试性密码,所以请务必设置一个足够复杂的密码以防止可能的攻击。
bitcount命令
时间复杂度及开始版本
起始版本:2.6.0
时间复杂度:O(N)描述
统计字符串被设置为1的bit数.
一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行。start 和 end 参数的设置和 GETRANGE 命令类似,都可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,以此类推。
不存在的 key 被当成是空字符串来处理,因此对一个不存在的 key 进行 BITCOUNT 操作,结果为 0 。
例子
127.0.0.1:6379> bitcount mykey (integer) 0 127.0.0.1:6379> set mykey "foobar" OK 127.0.0.1:6379> bitcount mykey 0 0 (integer) 4 127.0.0.1:6379> bitcount mykey 1 1 (integer) 6 127.0.0.1:6379> bitcount mykey 2 2\ (error) ERR value is not an integer or out of range 127.0.0.1:6379> bitcount mykey 2 2 (integer) 6 127.0.0.1:6379>
setbit命令
使用 bitmap 实现用户上线次数统计Bitmap 对于一些特定类型的计算非常有效。假设现在我们希望记录自己网站上的用户的上线频率,比如说,计算用户 A 上线了多少天,用户 B 上线了多少天,诸如此类,以此作为数据,从而决定让哪些用户参加 beta 测试等活动 —— 这个模式可以使用 SETBIT 和 BITCOUNT 来实现。
比如说,每当用户在某一天上线的时候,我们就使用 SETBIT ,以用户名作为 key ,将那天所代表的网站的上线日作为 offset 参数,并将这个 offset 上的为设置为 1 。
举个例子,如果今天是网站上线的第 100 天,而用户 peter 在今天阅览过网站,那么执行命令 SETBIT peter 100 1 ;如果明天 peter 也继续阅览网站,那么执行命令 SETBIT peter 101 1 ,以此类推。
当要计算 peter 总共以来的上线次数时,就使用 BITCOUNT 命令:执行 BITCOUNT peter ,得出的结果就是 peter 上线的总天数。更详细的实现可以参考博文 Fast, easy, realtime metrics using Redis bitmaps (需要翻墙)
性能前面的上线次数统计例子,即使运行 10 年,占用的空间也只是每个用户 10*365 比特位(bit),也即是每个用户 456 字节。对于这种大小的数据来说, BITCOUNT 的处理速度就像 GET 和 INCR 这种 O(1) 复杂度的操作一样快。
如果你的 bitmap 数据非常大,那么可以考虑使用以下两种方法:将一个大的 bitmap 分散到不同的 key 中,作为小的 bitmap 来处理。使用 Lua 脚本可以很方便地完成这一工作。
使用 BITCOUNT 的 start 和 end 参数,每次只对所需的部分位进行计算,将位的累积工作(accumulating)放到客户端进行,并且对结果进行缓存 (caching)。127.0.0.1:6379> setbit cls 100 0 (integer) 0 127.0.0.1:6379> setbit cls 101 1 (integer) 0 127.0.0.1:6379> bitcount cls (integer) 1 127.0.0.1:6379>
bittop命令
开始版本和时间复杂度
起始版本:2.6.0
时间复杂度:O(N)描述
对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。
BITOP 命令支持 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种参数:
BITOP AND destkey srckey1 srckey2 srckey3 … srckeyN ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。
BITOP OR destkey srckey1 srckey2 srckey3 … srckeyN,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。
BITOP XOR destkey srckey1 srckey2 srckey3 … srckeyN,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。BITOP NOT destkey srckey,对给定 key 求逻辑非,并将结果保存到 destkey 。
除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入。
执行结果将始终保持到destkey里面。处理不同长度的字符串
当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0 。
空的 key 也被看作是包含 0 的字符串序列。返回值
Integer reply
保存到 destkey 的字符串的长度,和输入 key 中最长的字符串长度相等。例子
127.0.0.1:6379> set key1 foobar OK 127.0.0.1:6379> set key2 abcdef OK 127.0.0.1:6379> bitop and dest key1 key2 (integer) 6 127.0.0.1:6379> get dest "`bc`ab" 127.0.0.1:6379>
扩展
使用 bitop 实现用户上线次数统计BITOP是对BITCOUNT命令一个很好的补充。不同的bitmaps进行组合操作可以获得目标bitmap以进行人口统计操作。Fast easy realtime metrics using Redis bitmaps这篇文章介绍了一个有趣的用例。性能
BITOP可能是一个缓慢的命令,它的时间复杂度是O(N)。 在处理长字符串时应注意一下效率问题。对于实时的指标和统计,涉及大输入一个很好的方法是 使用bit-wise操作以避免阻塞主实例。