redis学习笔记
redis
版本为2.8.9
字符串类型
字符串类型是redis
中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。一个字符串类型键允许存储的数据的最大容量为512MB。
set key value
:赋值get key
:取值append key value
:向键值的末尾追加value
,如果键不存在,则将该键的值设置为value
,返回值是追加后的字符串的总长度strlen key
:返回键值的长度mget key1 key2 key3...
:返回多个键的值mset key1 val1 key2 val2...
:设置多个键值
使用get key
键不存在时会报错:(error) ERR unknown command 'key'
递增与递减
incr key
:默认递增为1incrby key num
:递增为指定的num
值decr key
默认递减1decrby key num
递减为指定的num
值incrbyfloat key num
递增为指定的num
值,num
为float
类型可以是负数
位操作
getbit key offset
:获取一个字符串类型键指定位置的二进制的值,索引从0开始,如果获取的二进制的索引超出了键值的二进制实际长度则默认位值是0setbit key offset value
:设置字符串类型键值指定位置的二进制位的值,返回值是该位置的旧值。如果要设置的位置超过了键值二进制的长度,setbit命令会自动将中间的二进制位设置为0,同理,设置一个不存在的键的指定二进制位的值会自动将前面的位赋值为0bitcount key [start] [end]
:获得字符串类型键中值是1的二进制为的个数bitop operation destkey key
:对多个字符串类型键进行运算,并将结果存储在destkey
参数指定的键中。bitop
命令支持的运算操作有and
、or
、xor
、not
散列类型
散列类型是一种字典结构,其存储了字段和字段值的映射,但是字段值只能是字符窜,不支持其他数据类型,也就是说散列类型不能嵌套其他的数据类型,一个散列类型键可以包含至多232-1个字段。
散列类型适合存储对象:使用对象类别和id
构成键名,使用字段表示对象的属性名,字段存储属性值。
hset key field value
:给字段赋值hget key field
:获取字段的值hmset key field1 val1 field2 val2...
:给多个字段赋值gmget key field1 field2...
:取出多个字段的值hgetall key
:返回字段和字段值组成的列表hexists key field
:判断一个字段是否存在,存在返回1,不存在返回0,键不存在也会返回0hsetnx key field value
:当字段不存在时赋值,若字段已存在则不做任何改变hincrby key field increment
:增加指定的increment
的值hdel key field [field ...]
:删除一个或多个字段,返回值为删除字段的个数hkeys key
:只获取字段名hvals key
:只获取字段值hlen key
:获取字段个数
列表类型
列表类型可以储存一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段
lpush key value [value... ]
:向列表左边添加一个或多个元素,返回值表示增加元素后的列表长度rpush key value [value...]
:向列表右边添加一个或多个元素,返回值表示增加元素后的列表长度lpop key
:从列表左端弹出一个元素rpop key
:从列表右端弹出一个元素llen key
:获取列表中元素的个数lrange key start top
:获取从start
到top
之间的所有元素,包含两端元素。redis
起始索引为0。lrange
在获取列表片段的同时不会像lpop
和rpop
一样删除元素。lrange
也支持负数索引,-1
表示最右边第一个元素,依次类推lrem key count value
:删除列表中前count
个值为value
的元素,返回值是实际删除元素的个数- 当
count > 0
时,lrem
命令会从左边开始删除 - 当
count < 0
时,lrem
命令会从右边开始删除前count
个值为value
的元素 - 当
count = 0
时,lrem
命令会删除所有值为value
的元素
- 当
lindex key index
:获得指定索引的元素值lset key index value
:设置指定索引的元素值ltrim key start end
:删除指定范围之外的所有元素linsert key before|after pivot value
:linsert
命令会先在列表中查找值为pivot
的元素,然后根据第二个参数是before
还是after
来决定将value
插入到该元素的后面还是前面rpoplpush source destination
:将元素从一个列表转移到另一个列表
集合类型
集合中的每个元素都是不同的,且没有顺序。一个集合类型键可以储存至多232-1个字符串
sadd key member [member...]
:增加一个或多个元素,如果键不存在会自动创建,返回值是成功加入的元素数量srem key member [member...]
:删除一个或多个元素smembers key
:返回集合中所有元素sismember key member
:判断元素是否在集合中,存在返回1,不存在返回0sdiff key [key...]
:对多个集合执行差集运算。集合A与集合B的差集表示为A-B
,代表所有属于A且不属于B的元素构成的集合。当传入多个键时,sdiff
命令会先计算前面两个集合的差集,然后用所得的结果去计算与下一个集合的差集sinter key [key...]
:该命令用来对多个集合执行交集运算sunion key [key...]
:该命令用来对多个集合执行并集运算scard key
:获取集合中元素个数sdiffstore destination key [key...]
、sinterstore destination key [key...]
、sunionstore destination key [key...]
:将运算结果存储在destination
中srandmember key [count]
:随机从集合中获取一个或count
个元素,根据count
正负不同,具体表现也不同:- 当
count > 0
时,该命令会随机从集合中获得count
个不重复的元素。如果大于集合中元素个数,则返回集合中所有元素 - 当
count < 0
时,该命令会随机从集合中获取|count|
个元素,这些元素可能会相同 spop key
:从集合中随机弹出一个元素
- 当
有序集合
在集合类型的基础上有序集合为集合中的每个元素都关联了一个分数。集合中的每个元素不同,但是它的分数可以相同
zadd key score member [score member...]
:向集合中添加一个或多个元素及它的分数,如果该元素已存在则用新的分数替换原来的分数,返回值是新加入集合的个数zscore key member
:获得元素的分数zscore key start stop [withscores]
:按照元素分数从小到大的顺序返回索引从start
到stop
之间的所有元素,包含两端。如果要显示分数则在命令尾部加上withscores
zrevrange key start stop [withscores]
:按照元素从大到小输出结果zrangebyscore key min max [withscores] [limt offset count]
:返回指定分数范围的元素zincrby key increment member
:给member
元素的分数增加increment
分,返回更改后的分数zcard key
:获取元素中集合的数量zcount key min max
:获取指定分数范围内的元素个数zrem key member [member...]
:删除一个或多个元素,返回值是成功删除的元素的数量zremrangebyrank key start stop
:按照排名范围删除元素,返回值是成功删除的元素的数量zremrangebyscore key min max
:按照分数范围删除元素,返回值是成功删除的元素的数量zrank key member
:获得元素的排名zinterstore destination numkeys key [key...] [weights weight [weight...]] [aggregate sum|min|max]
:计算有序集合的交集,并将结果储存在destination
键中,返回值为destination
键中的元素个数
事务
redis
的事务是是一组命令的集合。一个事务中的命令要么都执行,要么都不执行。
multi
:开启事务exec
:执行事务队列中的命令watch
:监控一个或多个键,一旦其中有一个键被修改,之后的事务就不会再执行
执行multi
开启事务之后,再执行其他命令,如果没有报错,就会返回QUEUED
,表示已经将这些命令放入等待执行的事务队列中了,当我们把所有需要执行的命令都发给了redis
之后,再执行exec
,redis
就会执行事务队列中的命令,返回值就是这些命令的返回值列表。如果执行命令时出现语法错误,及时是语法正确的命令也不会执行;如果出现运行错误,比如使用散列类型的命令操作集合类型的键,即使执行命令报错,之后的命令也会继续执行(redis
不支持回滚功能)。
过期时间
expire key seconds
:设置一个键的有效期,单位为秒,返回值为1表示设置成功,0表示键不存在或设置失败pexpire key millisecond
:单位为毫秒ttl key
:返回一个键的剩余时间,当键不存在时返回-2,如果键没有设置过过期时间,返回-1persist key
:取消键的过期时间设置,成功返回1,失败返回0
除了persist
命令之外,使用set
或get
命令为键赋值的同时也会取消键的过期时间
排序
sort key [alpha] [desc] [limit offset count]
:可以对列表类型、集合类型、和有序集合类型键进行排序,并且可以完成与数据库中的连接查询类似的任务;除了数字以外,还可以通过alpha
参数按照字典顺序排列非数字元素by
:by
参数的语法为by key
,key
是一个参考键,它可以是一个字符串类型键或散列类型的某个字段(表示为键名->字段名)get
:不在返回元素自身的值,而是get
参数中指定的键值。支持字符串类型和散列类型的键,规则和by
参数一样store
:将排序的结果保存在指定的键中
如果使用了by
参考键,sort
命令将不会依据自身元素的值进行排序,而是对每个元素使用元素的值替换参考键中的第一个"*"并获取其值,然后依据该值对元素排序。
当参考键名为一个常量键时,sort
命令将不会执行排序操作;如果几个参考键值相同,sort
命令会再比较元素本身的值来决定元素的顺序
一个sort
命令中可以有多个get
参数,by
参数只能有一个
消息通知
使用redis
实现任务队列
队列可以使用redis
的列表类型的lpush
和rpop
命令来实现。生产者将任务使用lpush
命令加入到某个键中,消费者使用rpop
命令从改键中去除任务
brpop key [key...] timeout
命令
brpop
命令与rpop
命令相似,区别是当列表中没有元素时brpop
会一直阻塞,直到有新的元素加入。timeout
单位为秒,当参数为0时,表示不显示超时时间,如果没有新的元素加入列表就会永远阻塞
队列优先级
brpop
可以传递多个键,如果所有键都没有元素则阻塞,如果有一个键有元素则会从该键弹出该元素,如果多个键都有元素,按照从左到右的顺序取第一个键中的一个元素。借次特性可以实现区分优先级的任务队列
“发布/订阅”模式
“发布/订阅”模式中包含两种角色,分别是发布者和订阅者。订阅者可以订阅一个或若干个频道(channel),而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都回收到此消息。
publish channel message
:想channel
频道发送消息
publish
命令的返回值表示接受这条消息的订阅者数量。发出去的消息不能持久化subscribe channel [channel...]
:订阅频道
执行此命令后客户端会进入订阅状态,此状态下客户端只能使用subscribe
、unsubscribe
、psubscribe
和punsubscribe
这四个属于“发布\订阅”模式的命令。
消息类型取值:subscribe
:表示订阅成功的反馈信息,第二个值是订阅成功的频道,第三个值是当前客户端订阅的频道数量message
:表示接收到的消息,第二个值是产生消息的频道名称,第三个值是消息内容unsubscrie
:表示成功取消订阅某个频道,第二个值是对应的频道名称,第三个值是当前客户端订阅的频道数量,如果该值为0,客户端就会退出订阅状态
按照规则订阅
psubscribe
:订阅指定规则的频道,如psubscribe channel.?*
可以匹配channel.1
和channel.10
,但不会匹配channel.
该命令的第一个返回值表示这条消息是通过psubscribe
命令订阅频道而收到的,第二个值表示订阅时使用的通配符,第三个之表示实际收到的频道命令,第四个值表示消息内容
该命令可以重复订阅一个频道,向该频道发送消息时,订阅了几次,就发送几次
punsubscribe
:退订指定的规则