不忘初心,砥砺前行
作者 | 陌无崖
转载请联系授权
Nosql 基本概念
为了解决高并发、高可用、高可扩展,大数据存储等一系列问题而产生的数据库解决方案,就是NoSql。
NoSql,叫非关系型数据库,它的全名Not only sql。它不能替代关系型数据库,只能作为关系型数据库的一个良好补充。
基本数据类型
字符串
SET
如果值存在,将会被新值覆盖;
SET key value
SETTNX
如果只存在,将不会有任何改动;命令在设置成功时返回 1
, 设置失败时返回 0
。
SETTNX key value
SETEX
将键 key
的值设置为 value
, 并将键 key
的生存时间设置为 seconds
秒钟。命令在设置成功时返回 OK
。当 seconds
参数不合法时, 命令将返回一个错误。
SETEX
和以上两个命令的不同之处在于 SETEX
是一个原子(atomic)操作, 它可以在同一时间内完成设置值和设置过期时间这两个操作, 因此 SETEX
命令在储存缓存的时候非常实用。
SETEX key seconds value
PSETEX
这个命令和 SETEX
命令相似, 但它以毫秒为单位设置 key
的生存时间, 而不是像 SETEX
命令那样以秒为单位进行设置。
PSETEX key milliseconds value
GET
如果键 key
不存在, 那么返回特殊值 nil
;否则, 返回键 key
的值。
如果键 key
的值并非字符串类型, 那么返回一个错误, 因为 GET
命令只能用于字符串值。
GET key
GETSET
将键 key
的值设为 value
, 并返回键 key
在被设置之前的旧值,如果键 key
没有旧值, 也即是说, 键 key
在被设置之前并不存在, 那么命令返回 nil
,当键 key
存在但不是字符串类型时, 命令返回一个错误。
GETSET key value
STRLEN
返回键 key
储存的字符串值的长度。当键 key
不存在时, 命令返回 0
,当 key
储存的不是字符串值时, 返回一个错误。
STRLEN key
APPEND
如果键 key
已经存在并且它的值是一个字符串, APPEND
命令将把 value
追加到键 key
现有值的末尾。
如果 key
不存在, APPEND
就简单地将键 key
的值设为 value
, 就像执行 SET key value
一样.
APPEND key value
SETRANGE
从偏移量 offset
开始, 用 value
参数覆写(overwrite)键 key
储存的字符串值。不存在的键 key
当作空白字符串处理。如果偏移量超过原有的字符串的长度,则在原有的字符串基础上用零字节(zerobytes, "\x00"
)进行填充。
SETRANGE key offset value
代码示例:
redis> EXISTS empty_string
(integer) 0
redis> SETRANGE empty_string 5 "Redis!" # 对不存在的 key 使用 SETRANGE
(integer) 11
redis> GET empty_string # 空白处被"\x00"填充
"\x00\x00\x00\x00\x00Redis!"
GETRANGE
返回键 key
储存的字符串值的指定部分, 字符串的截取范围由 start
和 end
两个偏移量决定 (包括 start
和 end
在内)。
GETRANGE key start end
INCR
为键 key
储存的数字值加上一。如果键 key
不存在, 那么它的值会先被初始化为 0
, 然后再执行 INCR
命令。如果键 key
储存的值不能被解释为数字, 那么 INCR
命令将返回一个错误。
INCR key
INCRBY
为键 key
储存的数字值加上增量 increment
。相比较INCR,更加的灵活;如果键 key
不存在, 那么键 key
的值会先被初始化为 0
, 然后再执行 INCRBY
命令。
INCRBY key increment
INCRBYFLOAT
为键 key
储存的值加上浮点数增量 increment
。如果键 key
不存在, 那么 INCRBYFLOAT
会先将键 key
的值设为 0
, 然后再执行加法操作。
INCRBYFLOAT key increment
DECR
为键 key
储存的数字值减去一。同理 DECRBY可以设置减去的数字
DECR key
MSET
同时为多个键设置值。
MSET key value [key value …]
代码示例
redis> MSET date "2012.3.30" time "11:00 a.m." weather "sunny"
OK
redis> MGET date time weather
1) "2012.3.30"
2) "11:00 a.m."
3) "sunny"
MSETNX
当且仅当所有给定键都不存在时, 为所有给定键设置值。MSETNX
是一个原子性(atomic)操作, 所有给定键要么就全部都被设置, 要么就全部都不设置, 不可能出现第三种状态。
MSETNX key value [key value …]
代码示例
对不存在的键执行 MSETNX
命令:
redis> MSETNX rmdbs "MySQL" nosql "MongoDB" key-value-store "redis"
(integer) 1
redis> MGET rmdbs nosql key-value-store
1) "MySQL"
2) "MongoDB"
3) "redis"
对某个已经存在的键进行设置:
redis> MSETNX rmdbs "Sqlite" language "python" # rmdbs 键已经存在,操作失败
(integer) 0
redis> EXISTS language # 因为 MSETNX 命令没有成功执行
(integer) 0 # 所以 language 键没有被设置
redis> GET rmdbs # rmdbs 键也没有被修改
"MySQL"
MGET
返回给定的一个或多个字符串键的值。MGET
命令将返回一个列表, 列表中包含了所有给定键的值。如果给定的字符串键里面, 有某个键不存在, 那么这个键的值将以特殊值 nil
表示。
MGET key [key …]
哈希表
HSET
将哈希表中hash(键)中域field的值设置为value。如果已经存在会被覆盖;类比string,使用HSETNX命令,即使域存在,也不会对原有的值造成影响。命令在设置成功时返回 1
, 设置失败时返回 0
。类比字符串HMSET命令会同时将多个feild-value设置到哈希表key中。
HSET hash field value
HGET
返回哈希表中给定域的值,如果给定域不存在于哈希表中, 又或者给定的哈希表并不存在, 那么命令返回 nil
。类比字符串中MGET命令。在哈希表中也存在HMGET。
HGET hash field
HEXISTS
检查给定域 field
是否存在于哈希表 hash
当中。HEXISTS
命令在给定域存在时返回 1
, 在给定域不存在时返回 0
HEXISTS hash field
HDEL
删除哈希表 key
中的一个或多个指定域,不存在的域将被忽略。返回值是被成功移除的域的数量,不包括被忽略的域。
HDEL key field [field …]
HLEN
返回哈希表中key中域的数量,当key不存在时,返回0;
HLEN key
HSTRLEN
返回哈希表 key
中, 与给定域 field
相关联的值的字符串长度(string length)。
如果给定的键或者域不存在, 那么命令返回 0
。
HSTRLEN key field
HINCRBY
为哈希表 key
中的域 field
的值加上增量 increment
。
增量也可以为负数,相当于对给定域进行减法操作。
如果 key
不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
如果域 field
不存在,那么在执行命令前,域的值被初始化为 0
。
HINCRBY key field increment
HINCRBYFLOAT
为哈希表 key
中的域 field
加上浮点数增量 increment
。
如果哈希表中没有域 field
,那么 HINCRBYFLOAT 会先将域 field
的值设为 0
,然后再执行加法操作。
如果键 key
不存在,那么 HINCRBYFLOAT 会先创建一个哈希表,再创建域 field
,最后再执行加法操作。
HINCRBYFLOAT key field increment
HKEYS
返回哈希表 key
中的所有域。
HKEYS key
HVALS
返回哈希表 key
中所有域的值。
HVALS key
HGETALL
返回哈希表 key
中,所有的域和值。
在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。
HGETALL key
列表
LPUSH和RPUSH
LPUSH将一个或多个值 value
插入到列表 key
的表头;
RPUSH将一个或多个值 value
插入到列表 key
的表尾(最右边)。
LPUSH key value [value …]
RPUSH key value [value …]
LPUSHX和RPUSHX
LRPUSHX将值 value
插入到列表 key
的表头,当且仅当 key
存在并且是一个列表。
RPUSHX将值 value
插入到列表 key
的表尾,当且仅当 key
存在并且是一个列表。
返回值为表的长度
LPUSHX key value
RPUSHX key value
LPOP和RPOP
LPOP移除并返回列表 key
的头元素。
RPOP移除并返回列表 key
的尾元素。
列表的头元素。当 key
不存在时,返回 nil
。
LPOP key
RPOP key
RPOPLPUSH
将列表source中最后一个元素(尾元素)弹出,并返回给客户端,同时插入到列表destination中。是一个原子操作。如果 source
不存在,值 nil
被返回,并且不执行其他动作。
RPOPLPUSH source destination
LREM
根据参数 count
的值,移除列表中与参数 value
相等的元素。返回值为被移除元素的数量。
count
的值可以是以下几种:
count > 0
: 从表头开始向表尾搜索,移除与value
相等的元素,数量为count
count < 0
: 从表尾开始向表头搜索,移除与value
相等的元素,数量为count
的绝对值。count = 0
: 移除表中所有与value
相等的值。
代码示例:
redis> LPUSH greet "morning"
(integer) 1
redis> LPUSH greet "hello"
(integer) 2
redis> LPUSH greet "morning"
(integer) 3
redis> LPUSH greet "hello"
(integer) 4
redis> LPUSH greet "morning"
(integer) 5
redis> LRANGE greet 0 4 # 查看所有元素
1) "morning"
2) "hello"
3) "morning"
4) "hello"
5) "morning"
redis> LREM greet 2 morning # 移除从表头到表尾,最先发现的两个 morning
(integer) 2 # 两个元素被移除
LLEN
返回列表 key
的长度。如果 key
不存在,则 key
被解释为一个空列表,返回 0
.
如果 key
不是列表类型,返回一个错误。
LLEN key
LINDEX
返回列表 key
中,下标为 index
的元素。
LINDEX key index
LINSERT
将值 value
插入到列表 key
当中,位于值 pivot
之前或之后。当 pivot
不存在于列表 key
时,不执行任何操作。如果命令执行成功,返回插入操作完成之后,列表的长度。如果没有找到 pivot
,返回 -1
。如果 key
不存在或为空列表,返回 0
。
LINSERT key BEFORE|AFTER pivot value
LSET
将列表 key
下标为 index
的元素的值设置为 value
。
LSET key index value
LRANGE
返回列表 key
中指定区间内的元素,区间以偏移量 start
和 stop
指定。
LRANGE key start stop
LTRIM
对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
LTRIM key start stop
BLPOP和BRPOP
它是 LPOP key 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP命令阻塞,直到等待超时或发现可弹出元素为止。
当给定多个 key
参数时,按参数 key
的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。
如果列表为空,返回一个 nil
。否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key
,第二个元素是被弹出元素的值。
BLPOP key [key …] timeout
BRPOP key [key …] timeout
假设现在有 job
、 command
和 request
三个列表,其中 job
不存在, command
和 request
都持有非空列表。考虑以下命令:BLPOP job command request 0
BLPOP 保证返回的元素来自 command
,因为它是按”查找 job
-> 查找 command
-> 查找 request
“这样的顺序,第一个找到的非空列表。
redis> DEL job command request # 确保key都被删除
(integer) 0
redis> LPUSH command "update system..." # 为command列表增加一个值
(integer) 1
redis> LPUSH request "visit page" # 为request列表增加一个值
(integer) 1
redis> BLPOP job command request 0 # job 列表为空,被跳过,紧接着 command 列表的第一个元素被弹出。
1) "command" # 弹出元素所属的列表
2) "update system..." # 弹出元素所属的值
如果所有给定 key
都不存在或包含空列表,那么 BLPOP 命令将阻塞连接,直到等待超时,或有另一个客户端对给定 key
的任意一个执行 LPUSH key value [value …] 或 RPUSH key value [value …] 命令为止。
redis> EXISTS job # 确保两个 key 都不存在
(integer) 0
redis> EXISTS command
(integer) 0
redis> BLPOP job command 300 # 因为key一开始不存在,所以操作会被阻塞,直到另一客户端对 job 或者 command 列表进行 PUSH 操作。
1) "job" # 这里被 push 的是 job
2) "do my home work" # 被弹出的值
(26.26s) # 等待的秒数
redis> BLPOP job command 5 # 等待超时的情况
(nil)
(5.66s) # 等待的秒数
BRPOPLPUSH
当列表 source
为空时, BRPOPLPUSH 命令将阻塞连接,直到等待超时,或有另一个客户端对 source
执行 LPUSH key value [value …] 或 RPUSH key value [value …] 命令为止。
超时参数 timeout
接受一个以秒为单位的数字作为值。超时参数设为 0
表示阻塞时间可以无限期延长(block indefinitely) 。
BRPOPLPUSH source destination timeout
关注我试试回复以下关键词
go 微服务 ppt
大数据 书籍 资料
END
今日推荐阅读
RabbitMQ系列笔记广播模式和路由模式
RabbitMQ系列笔记入门篇
基于Nginx和Consul构建高可用及自动发现的Docker服务架构
▼关注我,一起成长
主要分享 学习心得、笔记、随笔▼