# 基本操作指令

# 字符串

设置值 set key value

set number "10086"

redis数据库是无序的方式存放数据库键的,一个新加入的键可能会出现在数据库的任何位置上。

对一个已经存在的键设置值,会覆盖掉旧值。

set key value [NX|XX]

如果给定NX选项,set命令只会在键没值的情况下执行设置操作;如果键已经存在,那么set命令将放弃执行设置操作,并发挥空值nil表示设置失败。 如果给定XX选项,set命令只会在键有值的情况下执行设置操作;如果键没有值,那么set命令将放弃执行设置操作,并发挥空值nil表示设置失败。

获取键值

get key

get number "10086"

如果给定的键在数据库中没有与之相关联的值,那么get命令将返回一个空值: get date (nil)

# getset

getset首先获取字符串键目前已有的值,接着为键设置新值。最后把之前获取到的旧值返回给用户:

getset key new_value

get number "10086" getset number "123456" "10086" -- 返回旧值

如果被设置的键并不存在于数据库,那么getset命令将返回空值作为键的旧值。

# mset: 一次为多个字符串键设置值

mset key value [key value ...]

redis> mset message "hello" number "10086"  

mset命令可以有效地提高程序的效率。因为执行多条set命令需要客户端和服务器之间进行多次网络通信,并因此耗费大量的时间。而使用一条mset命令去代替多条set命令只需要一次网络通信,从而可以减少程序执行多个设置操作时的时间。

# mget:一次获取多个字符串建的值

mget key [key...]

mget返回一个列表作为结果,这个列表按照用户执行命令时给定键的顺序排列各个键的值。

> mget message number  
1) "hello"
2) "10086"

mget命令可以将多个获取操作所需的网络通信次数从原来的N次降至一次,从而有效地提高程序的运行效率.

# msetnx: 只在键不存在的情况下,一次为多个字符串设置值

msetnx命令与mset命令一样,都可以对多个字符串键进行设置:

msetnx key value [key value ...]

msetnx命令与mset的主要区别在于,msetnx只会在所有给定键不存在的情况下对键进行设置,而不会像mset那样直接覆盖已有的值. 如果在给定值当中,即使有一个键已经有值了,那么msetnx命令也会放弃对所有给定键的设置操作.

# strlen: 获取字符串值的字节长度

strlen key

> strlen number  
(integer) 5 

对于不存在的键,stelen命令将返回0.

# getrange: 获取字符串值指定索引范围上的内容

getrange key start end

getrange命令接受的是闭区间索引范围,也就是说,位于start索引和end索引上的值也会被包含在命令返回的内容当中.

> getrange message 0 4  
"hello" 

getrange message 6 10 
"world" 

# setrange: 对字符串值的指定索引范围进行设置

通过使用setrange命令,可以将字符串键的值从索引index开始的部门替换为指定的内容,被替换内容的长度取决于新内容的长度.

setrange key index substitute

> get message
"hello world"

> setrange message 6 "redis"
(integer) 11

> get message 
"hello redis"

# append: 追加新内容到值的末尾

将给定的内容追加到字符串键已有值的末尾: append key suffix 执行完追加操作之后,会返回字符串值当前的长度作为命令的返回值。

append description "is a database"

# 处理不存在的键

如果用户给定的键并不存在,那么append命令会将键的值初始化为空字符串,然后再执行追加操作。

使用场景: 存储日志

# INCRBY、DECRBY:对整数值执行加法操作和减法操作

当字符串键存储的值能够被Redis解释为整数时,用户就可以通过INCRBY命令和DECRBY命令对被存储的整数值执行加法或减法操作。INCRBY命令用于为整数值加上指定的整数增量,并返回键在执行加法操作之后的值:

incrby key increment   

与INCRBY命令的作用正好相反,DECRBY命令用于为整数值减去指定的整数减量,并返回键在执行减法操作之后的值:

decrby key increment   

另外需要注意的一点是,INCRBY和DECRBY的增量和减量也必须能够被Redis解释为整数,使用其他类型的值作为增量或减量将返回一个错误。

处理不存在的键当INCRBY命令或DECRBY命令遇到不存在的键时,命令会先将键的值初始化为0,然后再执行相应的加法操作或减法操作。

# INCR、DECR:对整数值执行加1操作和减1操作

因为对整数值执行加1操作或减1操作的场景经常会出现,所以为了能够更方便地执行这两个操作,Redis分别提供了用于执行加1操作的INCR命令以及用于执行减1操作的DECR命令。INCR命令的作用就是将字符串键存储的整数值加上1,效果相当于执行INCRBY key 1:

incr key

ECR命令的作用就是将字符串键存储的整数值减去1,效果相当于执行DECRBY key 1:

DECR key

使用场景 : 生成id,或者 计数器

# 散列---hash

把相关联的数据打包起来存储的数据结构,而这种数据结构就是散列(hash)键。

# 简介

Redis的散列键会将一个键和一个散列在数据库里关联起来,用户可以在散列中为任意多个字段(f ield)设置值。与字符串键一样,散列的字段和值既可以是文本数据,也可以是二进制数据。通过使用散列键,用户可以把相关联的多项数据存储到同一个散列里面,以便对这些数据进行管理,或者针对它们执行批量操作。

# HSET: 为字段设置值

HSET hash field value

  • 如果给定的字段并不存在于散列中,那么这次设置就是一次性创建操作,命令将在散列里面关联给定的字段和值。返回1
  • 如果给定的字段原本以及存在于散列里,那么这次设置就是一次更新操作,将覆盖旧值。返回0
127.0.0.1:6379> hset article::10086 title "helloworld"
(integer) 1
127.0.0.1:6379> hset article::10086 content "hello"
(integer) 1

散列中包含的字段就像数据库包含的键一样,在实际中都是以无序方式进行排列的。

# HSETNX: 只在字段不存在的情况下为他设置值

HSETNX hash field value HSETNX 命令在字段不存在并且成功为他设置值时返回1,在字段已经存在并导致设置操作未能成功执行时返回0.

# HGET: 获取字段的值

HGET hash field

127.0.0.1:6379> HGET article::10086 title
"helloworld"

如果用户给定的字段并不存在于散列当中或者不存在该散列,那么HGET命令将返回一个空值。

127.0.0.1:6379> HGET article::10086 location
(nil)

# HSTRLEN:获取字段值的字节长度

HSTRLEN hash field

127.0.0.1:6379> HSTRLEN article::10086 title
(integer) 10

如果用户给定的字段并不存在于散列当中或者不存在该散列,那么HGET命令将返回一个0.

# HEXISTS:检查字段是否存在于散列中

HEXISTS hash field 如果散列包含了给定的字段,那么命令返回1,否则命令返回0.

127.0.0.1:6379> HEXISTS article::10086 title
(integer) 1
127.0.0.1:6379> HEXISTS article::10086 author
(integer) 0

# HDEL:删除字段

HDEL命令用于删除散列中的指定字段及其相关联的值

HDEL hash field

当给定字段存在于散列中并且被成功删除时,命令返回1;如果给定字段并不存在于散列中,或者给定的散列并不存在,那么命令将返回0表示删除失败。

# HLEN:获取散列包含的字段数量

HLEN hash

127.0.0.1:6379> HLEN article::10086
(integer) 2

如果给定的散列不存在。那么返回0

# HMSET:一次为多个字段设置值

HMSET hash field value [field value ...]

HMSET article::10086 title "hello" content "helloredis" 

# HMGET:一次获取多个字段的值

HMGET hash field [field ...]

HMGET article::10086 title  content 

# HKEYS,HVALS,HGETALL: 获取所有字段,所有值,所有字段和值

HKEYS hash HVALS hash HGETALL hash

127.0.0.1:6379> HKEYS article::10086
1) "title"
2) "content"

# 列表

list时一种线性有序的结构,可以按照元素被推入到列表中的顺序来存储元素,列表中的元素可以重复。

# LPUSH: 将元素推入列表左端

LPUSH list item [item item ...]

127.0.0.1:6379> LPUSH todo "buy" "watch"
(integer) 2

# RPUSH: 将元素推入列表右端

RPUSH list item [item item ...]

127.0.0.1:6379> RPUSH todo "buy" "watch"
(integer) 2

# LPUSHX,RPUSHX: 只对已存在的列表执行推入操作

注意: 与LPUSH,RPUSH 命令不一样的地方,LPUSHX,RPUSHX命令每次只能推入一个元素。尝试向 LPUSHX或RPUSHX命令给定多个元素将引发错误。

# LPOP: 弹出/移除列表最左端的元素

返回值为被移除的元素。

LPOP list

127.0.0.1:6379> LPOP todo
"watch"

# RPOP: 弹出/移除列表最右端的元素

返回值为被移除的元素。

RPOP list

127.0.0.1:6379> RPOP todo
"buy"

# RPOPLPUSH: 将右端弹出的元素推入左端

RPOPLPUSH source target

RPOPLPUSH todo todo 

# LLEN:获取列表的长度

LLEN list

LLEN todo

# LINDEX: 获取指定索引上的元素

LINDEX list index

LINDEX todo 3 

# LRANGE: 获取指定索引范围上的元素

LRANGE list start end

LRANGE命令接受一个列表,一个开始索引和一个结束索引作为参数,然后依次返回列表从开始索引到结束索引范围内的所有元素,其中开始索引和结束索引对应的元素也会被包含在命令返回的元素当中。

LRANGE todo 1 2

获取列表包含的所有元素: LRANGE todo 0-1

该命令可以实现分页操作。

# LSET: 为指定索引设置新元素

LSET list index new_element

127.0.0.1:6379> LRANGE todo 0 -1
1) "slepp"
2) "watch"
3) "buy"
127.0.0.1:6379> LSET todo 1 "shop"
OK
127.0.0.1:6379> LRANGE todo 0 -1
1) "slepp"
2) "shop"
3) "buy"
127.0.0.1:6379> 

该命令只能针对列表中已存在的索引进行设置,如果用户给定的索引超出了列表的有效索引范围。则报错:

127.0.0.1:6379> LSET todo 4 "shop"
(error) ERR index out of range

# LINSERT: 将元素插入列表

LINSERT list BEFORE|AFTER target_element new_element

LINSERT命令第二个参数的值可以是BEFORE或AFTER,他们分别用于指示命令将新元素插入目标元素的前面或者后面。命令完成后返回列表当前的长度。

127.0.0.1:6379> LINSERT todo BEFORE "shop" "10086"
(integer) 4
127.0.0.1:6379> LRANGE todo 0 -1
1) "slepp"
2) "10086"
3) "shop"
4) "buy"

处理不存在的元素:LINSERT命令要求用户给定的目标元素必须已存在于列表当中。如果目标元素不存在于列表中,那么将返回-1表示插入失败。

# LTRIM:修剪列表

LTRIM命令接受一个列表和一个索引范围作为参数,并移除列表中位于给定索引范围之外的所有元素,只保留给定范围之内的元素:

LTRIM list start end

127.0.0.1:6379> LRANGE todo 0 -1
1) "slepp"
2) "10086"
3) "shop"
4) "buy"
127.0.0.1:6379> LTRIM todo 0 2
OK
127.0.0.1:6379> LRANGE todo 0 -1
1) "slepp"
2) "10086"
3) "shop

该命令可以处理负数索引

127.0.0.1:6379> LTRIM todo -5 -1
OK

# LREM: 从列表中移除指定元素

LREM list count element

count参数的值决定了LREM命令移除元素的方式:

  • 如果count参数的值等于0,那么LREM命令将移除列表中包含的所有指定元素。
  • 如果count参数的值大于0,那么LREM命令将从列表的左端开始向右进行检查,并移除最先发现的count个指定元素。
  • 如果count参数的值小于0,那么LREM命令将从列表的右端开始向左进行检查,并移除最先发现的abs(count)个指定元素(abs(count)即count的绝对值)。
127.0.0.1:6379> LPUSH sample "a" "a" "b" "c" "f" "a"
(integer) 6
127.0.0.1:6379> LRANGE sample 0 -1
1) "a"
2) "f"
3) "c"
4) "b"
5) "a"
6) "a"
127.0.0.1:6379> LREM sample 0 "a"
(integer) 3
127.0.0.1:6379> LRANGE sample 0 -1
1) "f"
2) "c"
3) "b"


127.0.0.1:6379> LREM sample 2 "b"
(integer) 1
127.0.0.1:6379> LRANGE sample 0 -1
1) "f"
2) "c"


# BLPOP : 阻塞式左端弹出操作

# BRPOP : 阻塞式右端弹出操作

# BRPOPLPUSH: 阻塞式弹出并推入操作

# 集合(set)

集合允许将任意多个不同的元素存储到集合中,这些元素既可以是文本数据,也可以是二进制数据.

集合与列表的区别:

  • 列表可以存储重复元素,而集合只会存储非重复元素,尝试将一个已存在的元素添加到集合将被忽略

  • 列表以有序方式存储元素,而集合则以无序方式存储元素

  • 在执行LINSERT LREM这样的列表命令时,即使命令只针对单个列表元素,程序有时也不得不遍历整个列表以确定指定的元素是否存在,因此这些命令的复杂度都为O(N).

  • 对于集合来说,因为所有针对单个元素的集合命令都不需要遍历整个集合,所以复杂度都为O(1).

当我们需要存储多个元素时,就可以考虑这些元素是否可以以无序的方式存储,并且是否不会重复,如果是,那么就可以使用集合来存储这些元素,从而有效地利用集合操作的效率优势.

# SADD: 将元素添加到集合

SADD set element [element...]

这个命令会返回成功添加的新元素数量作为返回值.

127.0.0.1:6379> SADD set "redis"
(integer) 1

忽略已存在元素,sadd命令会自动忽略已存在的元素,只将不存在于集合的新元素添加到集合中.

# SREM : 从集合中移除元素

通过SREM命令,用户可以从集合中移除一个或多个已存在的元素.返回被移除的元素数量.

SREM set element [element...]

移除的时候会忽略不存在的元素,只移除那些确实存在的元素.

# SMOVE: 将元素从一个集合移动到另一个集合

SMOVE source target element

在移动操作成功执行时返回1.如果指定的元素并不存在于源集合,那么SMOVE命令将返回0,表示移除操作执行失败.

SMOVE set nosql "redis"

如果想要移除的元素并不存在于源集合,那么SMOVE将放弃执行移动操作,并返回0表示移动操作执行失败.

覆盖已存在的元素:即使用户象要移动的元素已经存在于目标集合,SMOVE命令仍然会将指定的元素从源集合移动到目标集合,并覆盖目标集合中的相同元素.从结果来看,这种移动不会改变目标集合包含的元素,只会导致被移动的元素从源集合中消失.

# SMEMBERS: 获取集合包含的所有元素

SMEMBERS set

# SCARD: 获取集合包含的元素数量

用户可以获取给定集合的大小,即集合包含的元素数量:

SCARD set

# SISMEMBER: 检查给定元素是否存在于集合

SISMEMBER set element

返回1表示给定的元素存在于集合当中,返回0表示给定的元素不存在于集合中.

# SRANDMEMBER: 随机获取集合中指定数量的元素

SRANDMEMBER set [count]

可以指定count参数,即返回的元素数量.可以是正数也可以是负数.

当count参数的值大于集合包含的元素数量时,SRANDMEMBER命令将返回集合包含的所有元素.

使用场景: 抽奖

# SPOP: 随机的从集合中移除指定数量的元素

SPOP命令接收一个可选的count参数,用于指定需要被移除的元素数量.如果用户没有给定这个参数,那么SPOP默认值移除一个元素.

SPOP key [count]

# SINTER,SINTERSTORE: 对集合执行交集操作

SINTER命令可以计算出用户给定的所有集合的元素,然后返回这个交集包含的所有元素:

SINTER set [set...]

SINTER set1 set2 

SINTERSTORE命令可以把给定集合的交集计算结果存储到指定的键里面.

SINTERSTORE destination_key set [set...]

# SUNION,SUNIONSTORE: 对集合执行并集计算

SUNION命令可以计算出用户给定的所有集合的并集,然后返回这个并集包含的所有元素:

SUNION set [set ...]

SUNIONSTORE命令可以吧给定集合的并集计算结果存储到指定的键中,并在键已经存在的情况下自动覆盖已有的键:

SUNIONSTORE destination_key set [set...]

SUNIONSTORE命令再执行完毕之后,将返回并集元素的数量作为返回值.

# SDIFF,SDIFFSTORE:对集合执行差集计算

SDIFF命令可以计算出给定集合之间的差集,并返回差集包含的所有元素:

SDIFF set [set...]

SDIFF命令会按照用户给定的集合顺序,从左到右依次对给定的集合执行差集计算.

SDIFF s1 s2 s3

SDIFFSTORE命令可以把给定集合之间的差集计算结果存储到指定的键中,并在键已存在的情况下自动覆盖已有的键.

SDIFFSTORE destination_key set [set...]

# 有序集合

关于评论

评论前请填好“昵称”、“邮箱”这两栏内容,否则不会收到回复,谢谢!