2.0.0版本以上时间复杂度:O(1)。平摊时间复杂度为O(1),假设附加的值很小,而且已经存在的现值是任意大小的,因为Redis使用的动态字符串库将使每次从新分配时可用的空闲空间增长一倍。web
若是键已经存在而且是一个字符串,这个命令将在字符串的末尾追加值,若是键不存在,它将被建立并设置为空字符串,所以APPEND
将相似于在这个特殊状况下SET
。redis
响应为整数:附加操做以后的字符串长度缓存
redis> EXISTS mykey (integer) 0 redis> APPEND mykey "Hello" (integer) 5 redis> APPEND mykey " World" (integer) 11 redis> GET mykey "Hello World" redis>
APPEND
命令可用于建立一个很是紧凑的固定大小样本列表的表示形式,一般称为时间序列。每次新的样本到达时,咱们均可以使用该命令存储它:性能
APPEND timeseries "fixed-size sample"
在时间序列中访问单个元素并不困难:code
这种模式的局限性是,咱们被迫进入仅附加的操做模式,因为Redis目前缺乏一个可以修饰字符串对象的命令,因此没法轻易地将时间序列缩减到给定的大小。然而,以这种方式存储的时间序列的空间效率是显著的。对象
提示:能够根据当前Unix时间切换到另外一个键,经过这种方式,每一个键可能只有相对少许的样本,为了不处理很是大的键,并使这个模式更友好地分布在许多Redis实例中。blog
使用固定大小的字符串温度传感器的示例(在实际实现中使用二进制格式更好)索引
redis> APPEND ts "0043" (integer) 4 redis> APPEND ts "0035" (integer) 8 redis> GETRANGE ts 0 3 "0043" redis> GETRANGE ts 4 7 "0035" redis>
2.6.0版本以上
时间复杂度:O(N)
计算字符串中设置的bits数(整体计数)。字符串
默认状况下,将检查字符串中包含的全部字节,能够只在经过附加参数开始和结束的间隔中指定计数操做。get
与GETRANGE命令同样,开始和结束能够包含负值,以便从字符串的末尾开始索引字节,-1是最后一个字节,-2是倒数第二个字节,以此类推。
不存在的键被视为空字符串,所以命令将返回0。
响应为整数:bits数被设置为1。
例如
redis> SET mykey "foobar" "OK" redis> BITCOUNT mykey (integer) 26 redis> BITCOUNT mykey 0 0 (integer) 4 redis> BITCOUNT mykey 1 1 (integer) 6 redis>
位图是对某些信息的一种很是节省空间的表示,例如须要用户访问历史记录的Web应用程序,这能够肯定哪些用户是beta特性的良好目标。
使用SETBIT命令完成这个任务很是简单,天天都用一个小的递增整数进行标识,例如第0天是应用程序上线的第一天,第1天是次日,以此类推。
每次用户执行页面视图时,应用程序均可以使用SETBIT命令设置与当前日期对应的位,在用户访问web站点的当天注册该页面。
稍后,只需根据位图调用BITCOUNT
命令,就能够知道用户访问web站点的天数,这是很简单的。
使用用户id而不是天数的相似模式在文章中被描述为“使用Redis位图的快速简单实时度量”
在上面的计很多天示例中,即便10年以后,咱们的应用程序仍然是在线的,每一个用户只有365*10字节的数据,每一个用户只有456字节,有了这些数据BITCOUNT
,仍然和其余O(1) Redis命令(如GET
或INCR
)同样快。
当位图较大时,有两种选择:
BITCOUNT
start和end可选参数递增地运行位图,在客户端积累结果,并可选地将结果缓存到一个键中。