007.Redis中的数据类型及相关的操作

字符串

  1. Redis中得自增命令和自减命令

INCR:
DECR:
INCRBY:
DECRBY:
INCRBYFLOAT:

确实没有DECRBYFLOAT这个指令,而且好像执行了INCRBYFLOAT后,值的类型就会变成字符串。实际上执行INCR等指令值类型也是字符串,之所以会让我误判是因为使用redis-cli工具执行INCRBYFLOAT后,返回的结果带有字符串。

当用户将一个值存储到Redis字符串里面的时候,如果这个值可以被解释为十进制整数或者浮点数,那么Redis会察觉到这一点,并允许用户对这个字符串执行各种INCR*DECR*操作。

如果用户对一个不存在的键或者一个保存了空串的键执行自增或者自减操作,那么Redis在执行操作时会将这个键的值当作是0来处理。

如果用户尝试对一个值无法被解释为整数或者浮点数的字符串键执行自增或者自减操作,那么Redis将向用户返回一个错误。

  1. 针对字符串的一部分进行操作

APPEND:

append keyName value
将value追加到keyName当前存储的值的末尾

GETRANGE:

getrange keyName start end
获取一个由偏移量start至偏移量end范围内所有字符组成的字串,包括start和end在内

SETRANGE:

setrange keyName offset value
将从start偏移量开始的字串设置为给定值

GETBIT:

getbit keyName offset
将字节串看作成二进制位串,并返回位串中偏移量位offset的二进制位的值

SETBIT:

setbit keyName offset value
将字节串看作成二进制位串,将位串中偏移量位offset的二进制位的值设置为value

BITCOUNT:

bitcount keyName [start end]
统计二进制位串里面值为1的二进制的数量,如果给定了可选的start和end,那么只对偏移量指定范围内的二进制位进行统计。

BITOP:

bitop operation destKey keyName [keyName keyName …]
对一个或多个二进制位串执行并、或、异或、非在内的任意一种位运算,并将结果保存在destKey中

(可能需要了解Redis采用什么方案编码,否则针对一些非英文字符的话,变现会有点怪异。)

在使用SETRANGE或者SETBIT命令对字符串进行写入的时候,如果字符串当前的长度不能满足写入的要求,那么Redis会自动地使用空字节来将字符串扩展至所需的长度,然后才执行写入或者更新操作。

在使用GETRANGE读取字符串的时候,超出字符串末尾的数据会被视为是空串,而在使用GETBIT读取二进制位串的时候,超出字符串末尾的二进制位会被视为是0。

通过使用子串操作和二进制位操作,配合WATCH命令、MULTI命令和EXEC命令,用户甚至可以自己动手去构建任何他们想要的数据结构。(我对这部分内容很感兴趣)

列表

  1. 常用的列表命令:

RPUSH
LPUSH
RPOP
LPOP
LINDEX

lindex keyName offset
返回列表中偏移量位offset的元素

LRANGE

lrange keyName start end
返回列表从start偏移量到end偏移量范围内的所有元素,其中偏移量为start和偏移量为end的元素也会包含在被返回的元素之内

LTRIM

ltrim keyName start end
对列表进行修剪,只保留从start偏移量到end偏移量范围内的元素,其中偏移量为start和偏移量为end的元素也会保留

需要注意,没有RINDEXRRANGERTRIM指令。

可以组合使用LTRIMLRANGE指令构建出一个在功能上类似LPOP和RPOP,但是却能够一次返回多个元素的操作。(需要原子性执行多个命令的方法)

  1. 将元素从一个列表移动到另一个列表,或者阻塞执行命令的客户端

BLPOP

blpop keyName [keyName …] timeout
从第一个非空列表中弹出位于最左端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现。

BRPOP

RPOPLPUSH

bpoplpush sourceKey destKey
从sourceKey列表中弹出位于最右端的元素,然后将这个元素推入destKey列表的最左端,并向用户返回这个元素。

BRPOPLPUSH

brpoplpush sourceKey destKey timeout
从sourceKey列表弹出位于最右端的元素,然后将这个元素推入到destKey列表的最左端,并向用户返回这个元素;如果sourceKey为空,那么在timeout秒之内阻塞并等待可弹出的元素出现。

对于阻塞弹出命令和弹出并推入命令,最常见的用例就是消息传递和任务队列。

集合

  1. 常用的集合指令列表

SADD
SREM
SISMEMBER

SCARD(set cardinality)

scard keyName
返回集合包含的元素的数量

SMEMBERS

smembers keyName
返回集合包含的所有元素

SRANDMEMBER

srandmember keyName [count ]
从集合里面随机返回一个或多个元素。当count为正数时,命令返回的随机元素不会重复;当count为负数时,命令返回的随机元素可能会出现重复。

SPOP

spop keyName
随机地移除集合中得一个元素,并返回被移除的元素。

SMOVE

smove sourceKey destKey item
如果集合sourceKey包含元素item,那么从集合sourceKey里面移除元素item,并将元素item添加到集合destKey中。如果item被成功移除,那么命令返回1,否则返回0。

  1. 组合和关联多个集合

SDIFF

sdiff keyName [keyName …]
返回那些存在于第一个集合,但是不存在于其他集合中得元素(数学中的差集运算)

SDIFFSTORE

sdiffstore destKey keyName [keyName …]
将那些存在于第一个集合,但是不存在于其他集合中得元素(数学中的差集运算)存储到destKey键里面

SINTER

sinter keyName [keyName …]
返回那些同时存在于所有集合中的元素(数学上的交集运算)

SINTERSTORE

SUNION

sunion keyName [keyName …]
返回那些至少存在于一个集合中得元素(数学中得并集运算)(对这个描述表示怀疑)

SUNIONSTORE

散列

  1. 散列常用命令

HMGET

hmget keyName key [key …]
从散列里获取一个或多个键的值

HMSET

hmset keyName key value [key value …]
为散列里面的一个或多个键设置值

HDEL

hdel keyName key [key …]
删除散列里面的一个或多个键值对,返回成功找到并删除的键值对数量

HLEN

hlen keyName
返回散列包含的键值对数量

  1. 常用批量处理命令

HEXISTS

hexists keyName key
检查给定键是否存在散列中

HKEYS

hkeys keyName
获取散列包含的所有键

HVALS

hvals keyName
获取散列包含的所有值

HGETALL

hgetall keyName
获取散列包含的所有键值对

HINCRBY

hincrby keyName key increment
将键key存储的值加上整数increment

HINCRBYFLOAT

hincrebyfloat keyName key increment
将键key存储的值加上浮点数increment

尽管有hgetall,但hkeys和hvals也是非常有用的:如果散列的值非常大,那么用户可以先使用hkeys取出散列包含的所有键,然后再使用hget一个接一个地取出键值,从而避免因为一次获取多个大体积的值而导致服务器阻塞。

有序集合

  1. 有序集合常用命令

ZDD
ZREM
ZCARD

zcard
返回有序集合包含的成员数量

ZINCRBY

zincrby keyName member increment
将member成员的分值加上increment。

ZCOUNT

zcount keyName min max
返回分值介于min和max之间的成员数量。

ZRANK

zrank keyName member
返回成员member在有序集合中的排名

ZSCORE

zscore keyName member
返回成员member的分值。

ZRANGE

zrange keyName start stop [WITHSCORES ]
返回有序集合中排序介于start和stop之间的成员,如果给定了可选的WITHSCORE选项,那么米宁会将成员的分值一并返回。

  1. 有序集合中的另外一些用法

REV reversal的缩写

ZREVRANK

zrevrank keyName member
返回有序集合里成员member的排名,成员按照分值从大到小排列。

ZREVRANGE

ZRANGEBYSCORE

zrangebyscore keyName min max [WITHSCORES ] [LIMIT offset count]
返回有序集合中,分值介于min和max之间的所有成员。

ZREVRANGEBYSCORE

zrevrangebyscore keyName max min [WITHSCORES ] [LIMIT offset count]
返回有序集合中,分值介于min和max之间的所有成员,并按照分值从大到小的顺序来返回它们。

ZREMRANGEBYRANK

zremrangebyrank keyName start stop
移除有序集合中排名介于start和stop之间的所有成员。

ZREMRANGEBYSCORE

zremrangebyscore keyName min max
移除有序集合中分数介于min和max之间的所有成员。

ZINTERSTORE

zinterstore destKey keyCount key [key …] [WEIGHTS weight [weight …]] [aggregate SUM|MIN|MAX]
对给定的有序集合执行类似于集合的交集运算。

ZUNIONSTORE

zunionstore destKey keyCount key [key …] [weights weight [weight …]] [aggregate SUM|MIN|MAX]
对给定的有序集合执行类似于集合的并集运算。