字符串
设置值
SET key value [NX|XX]
[NX|XX]为可选。
NX:仅在键key不存在的情况下,才进行设置操作,如果键存在,那么将不做任何动作。
XX:仅在键key已经存在的情况下,才进行设置操作,如果键key不存在,那么不做任何动作
SET key value NX和SETNX key value效果一样
SET key value XX和SETXX key value效果一样
获取字符串的值
GET key
多个键值对
设置多个键值对
MSET key value [key value …]
获取多个键值对
MGET key [key …]
设置新值并返回旧值
GETSET key new-value
redis中存在 key value键值对,执行
GETSET key new-value
会将key的值设置为new-value,同时返回值为value
追加内容到字符串末尾
APPEND key value
示例:
SET key value
APPEND key -1
最后的值为value-1
返回值的长度
STRLEN key
字符串索引
正数索引
以hello字符串为例 索引值:0 1 2 3 4 字符串:h e l l o
负数索引
以hello字符串为例 索引值:-5 -4 -3 -2 -1 字符串: h e l l o
SETRANGE key index value
从索引index开始,用value覆写给定键key所储存的字符串值
例:
redis>SET msg "hello"
redis>SETRANGE msg 1 "appy"
redis>GET msg
"happy"
GETRANGE key start end
返回键 key 储存的字符串值中,位于 start 和 end 两个索引之间的内容(闭区间,start 和 end 会被包括在内)。和SETRANGE 只接受正数索引不同,GETRANGE的索引可以是正数或者负数。
数字操作
只要储存在字符串键里面的值可以被解释为 64 位整数,或者 IEEE-754 标准的 64 位浮点数,那么用户就可以对这个字符串键执行针对数字值的命令。
INCRBY key increment
将key的值增加increment
DECRBY key decrement
将key的值减少decrement
注意:键不存在时,键的值初始化为0,然后再执行加减操作
INCR key
将key的值加1
DECR key
将key的值减1
API
IdGenerator(name,client): 设置id生成器的名字和客户端
IdGenerator.gen(): 生成一个新的自增id
IdGenerator.init(n):保留前n个id,IdGenerator.init(10000),这样生成器创建的id就会从10001开始
INCRBYFLOAT key increment
increment为浮点数
当用户针对一个数字值执行APPEND、STRLEN、SETRANGE和GETRANGE命令时,Redis会先将数字值转换为字符串,然后再执行命令。
SETBIT key index value
将给定索引上的二进制位的值设置为value,命令返回被设置的位原来存储的旧值
例如将10110000设置第2位为1
SETBIT bits 2 1
10110000
变成
10110100
GETBIT key index
返回给定索引上的二进制位的值
BITCOUNT key [start][end]
计算并返回字符串键存储的值中,被设置为1的二进制位的数量
BITOP operation destkey key[key …]
对一个或者多个保存二进制位的字符串键执行位元操作,并将结果保存在destkey上。operation可以是AND、OR、NOT、XOR这四种操作中的任意一种:
逻辑操作
逻辑操作 | 描述 |
---|---|
BITOP AND destkey key [key1 …] | 对一个或者多个key求逻辑并,并将结果保存到destkey |
BITOP OR destkey key [key1 …] | 对一个或多个 key 求逻辑或,并将结果保存到 destkey 。 |
BITOP XOR destkey key [key1 …] | 对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。 |
BITOP NOT destkey key | 对给定 key 求逻辑非,并将结果保存到 destkey 。 |
在线用户统计应用示例
API | 说明 | 命令操作 |
---|---|---|
OnlineCount(when, client) | 记录给定时间内的在线用户数量。 | |
OnlineCount.inclue(user_id) | 将给定用户记录为在线。 | 调用SETBIT命令 |
OnlineCount.result() | 返回给定时间内的在线用户数量。 | 调用BITCOUNT命令 |
目前这个实现的优点:
- 将用户设置为在线的速度非常快, O(1) 。
- 即使用户数量非常大,占用的内存也不多:记录一百万用户仅需一百万位,也即是 0.125 MB;记录一千万用
户仅需一千万位,也即是 1.25 MB 。 - 可以在现有程序的基础上,做进一步的操作。举个例子,我们可以使用 BITOP AND 命令,将多个在线记录作
为输入,计算出全勤用户的数量(全勤指的是,用户在所有输入的在线统计记录中,都显示为在线)。
目前这个实现的缺点:
- 每次进行统计的复杂度为 O(N) 。
- 没办法轻易地获取所有在线用户的名单,只能遍历整个二进制值,复杂度为 O(N) ,其中 N 为二进制位数
量。
进一步的优化:
- 用户量不大并且需要获取在线用户名单的话,可以使用之后介绍的集合数据结构来实现。
- 不需要获取在线用户名单,并且不需要精确的在线统计数量,可以使用之后介绍的 HyperLogLog 来实现。
存储中文时的注意事项
STRLEN、SETRANGE 和 GETRANGE 不适用于中文