3.1、String类型类型在 Redis 中的相关命令
-
将字符串值value关联到key
-
key已关联则覆盖,无视类型
-
原本key带有生存时间TTL,那么TTL被清除
-
SET key value [EX seconds] [PX milliseconds] [NX|XX]
GET
-
返回key关联的字符串值
-
Key不存在返回nil
-
Key存储的不是字符串,返回错误,因为GET只用于处理字符串
-
GET key
MSET
-
同时设置一个或多个Key-Value键值对。
-
某个给定Key已经存在,那么MSET新值会覆盖旧值。
-
如果上面的覆盖不是希望的,那么使用
MSETNX
命令,所有Key都不存在才会进行覆盖。 -
MSET是一个原子性操作
,所有Key都会在同一时间被设置,不会存在有些更新有些没更新的情况
-
MSET key value [key value ...]
MGET
-
返回一个或多个给定Key对应的Value
-
某个Key不存在那么这个Key返回nil
-
MGET key [key ...]
SETEX
-
将Value关联到Key
-
设置Key生存时间为seconds,单位为秒
-
如果Key对应的Value已经存在,则覆盖旧值
-
SET也可以设置失效时间,但是不同在于SETNX是一个原子操作,即关联值与设置生存时间同一时间完成
-
SETEX key seconds value
SETNX
-
将Key的值设置为Value,当且仅当Key不存在
-
若给定的Key已经存在,SEXNX不做任何动作
-
SETNX key value
前面介绍的是基本的Key-Value操作,下面介绍一种特殊的Key-Value操作即INCR/DECR,可以利用Redis自动帮助我们对一个Key对应的Value进行加减,用表格看一下相关命令:
INCR
-
Key中存储的数字值+1,返回增加之后的值
-
Key不存在,那么Key的值被初始化为0再执行INCR
-
如果值包含错误类型或者字符串不能被表示为数字,那么返回错误
-
值限制在64位有符号数字表示之内,即-9223372036854775808~9223372036854775807
-
INCR key
DECR
-
Key中存储的数字值-1
-
其余同INCR
-
DECR key
INCRBY
-
将key所存储的值加上增量返回增加之后的值
-
其余同INCR
-
INCRBY key increment
DECRBY
-
将key所存储的值减去减量decrement
-
其余同INCR
-
DECRBY key decrement
Hash本质上和String是一样的,无非String是纯粹的Key-Value,Hash是外面套了一层东西,里面还是Key-Value,接着我们用表格看一下Hash数据结构的相关命令:(可以理解key为字符串,value是一个Map)
HSET
-
将哈希表Key中的域field的值设为value
-
key不存在,一个新的Hash表被创建
-
field已经存在,旧的值被覆盖
-
HSET key field value
HGET:
返回哈希表key中给定域field的值
HGET key field
HDEL
-
删除哈希表key中的一个或多个指定域
-
不存在的域将被忽略
-
HDEL key filed [field ...]
HEXISTS
-
查看哈希表key中,给定域field是否存在,存在返回1,不存在返回0
-
HEXISTS key field
HGETALL
-
返回哈希表key中,所有的域和值
-
HGETALL key
HINCRBY
-
为哈希表key中的域field加上增量increment
-
其余同INCR命令
-
HINCRYBY key filed incremen
HKEYS
-
返回哈希表key中的所有域
-
HKEYS key
HLEN
-
返回哈希表key中域的数量
-
HLEN key
HMGET
-
返回哈希表key中,一个或多个给定域的值
-
如果给定的域不存在于哈希表,那么返回一个nil值
-
HMGET key field [field ...]
HMSET
-
同时将多个field-value对设置到哈希表key中
-
会覆盖哈希表中已存在的域
-
key不存在,那么一个空哈希表会被创建并执行HMSET操作
-
HMSET key field value [field value ...]
HVALS
-
返回哈希表key中所有的域和值
-
HVALS key
3.3、List数据结构相关操作
LPUSH
-
将一个或多个值value插入到列表key的表头
-
如果有多个value值,那么各个value值按从左到右的顺序依次插入表头
-
key不存在,一个空列表会被创建并执行LPUSH操作
-
key存在但不是列表类型,返回错误
-
LPUSH key value [value ...]
LPUSHX
-
将值value插入到列表key的表头,当且晋档key存在且为一个列表
-
key不存在时,LPUSHX命令什么都不做
-
LPUSHX key value
LPOP
-
移除并返回列表key的头元素
-
LPOP key
LRANGE
-
返回列表key中指定区间内的元素,区间以偏移量start和stop指定
-
start和stop都以0位底
-
可使用负数下标,-1表示列表最后一个元素,-2表示列表倒数第二个元素,以此类推
-
start大于列表最大下标,返回空列表
-
stop大于列表最大下标,stop=列表最大下标
-
LRANGE key start stop
LREM
-
根据count的值,移除列表中与value相等的元素
-
count>0表示从头到尾搜索,移除与value相等的元素,数量为count
-
count<0表示从从尾到头搜索,移除与value相等的元素,数量为count
-
count=0表示移除表中所有与value相等的元素
-
LREM key count value
LSET
-
将列表key下标为index的元素值设为value
-
index参数超出范围,或对一个空列表进行LSET时,返回错误
-
LSET key index value
LINDEX
-
返回列表key中,下标为index的元素
-
LINDEX key index
LINSERT
-
将值value插入列表key中,位于pivot前面或者后面
-
pivot不存在于列表key时,不执行任何操作
-
key不存在,不执行任何操作
-
LINSERT key BEFORE|AFTER pivot value
LLEN
-
返回列表key的长度
-
key不存在,返回
-
LLEN key
LTRIM
-
对一个列表进行修剪,让列表只返回指定区间内的元素
-
不存在指定区间内的都将被移除
-
LTRIM key start stop
RPOP
-
移除并返回列表key的尾元素
-
RPOP key
RPOPLPUSH
-
在一个原子时间内,执行两个动作:
-
将列表source中最后一个元素弹出并返回给客户端
-
将sourcedesinationdestination
-
RPOPLPUSH source destination
RPUSH
-
将一个或多个值value插入到列表key的表尾
-
RPUSH key value [value ...]
RPUSHX
-
将value插入到列表key的表尾,当且仅当key存在并且是一个列表
-
key不存在,什么都不做
-
RPUSHX key value
3.4、SET数据结构相关操作
SADD
-
将一个或多个member元素加入到key中,已存在在集合的member将被忽略
-
假如key不存在,则只创建一个只包含member元素做成员的集合
-
当key不是集合类型时,将返回一个错误
-
SADD key number [member ...]
SCARD
-
返回key对应的集合中的元素数量
-
SCARD key
SDIFF
-
返回一个集合的全部成员,该集合是第一个Key对应的集合和后面key对应的集合的差集
-
SDIFF key [key ...]
SDIFFSTORE
-
和SDIFF类似,但结果保存到destination集合而不是简单返回结果集
-
destination如果已存在,则覆盖
-
SDIFFSTORE destionation key [key ...]
SINTER
-
返回一个集合的全部成员,该集合是所有给定集合的交集
-
不存在的key
-
SINTER key [key ...]
SINTERSTORE
-
和SINTER类似,但结果保存早destination集合而不是简单返回结果集
-
如果destination已存在,则覆盖 destination可以是key本身
-
INTERSTORE destination key [key ...]
SISMEMBER
-
判断member元素是否key的成员,0表示不是,1表示是
-
SISMEMBER key member
SMEMBERS
-
返回集合key中的所有成员
-
不存在的key被视为空集
-
SMEMBERS key
SMOVE
-
SMOVE 原子性地将member元素从source集合移动到destination集合
-
source集合中不包含member元素,SMOVE命令不执行任何操作,仅返回0
-
destination中已包含member元素,SMOVE命令只是简单做source集合的member元素移除
-
SMOVE source desination member
SPOP
-
移除并返回集合中的一个随机元素,如果count不指定那么随机返回一个随机元素
-
count为正数且小于集合元素数量,那么返回一个count个元素的数组且数组中的元素各不相同
-
count为正数且大于等于集合元素数量,那么返回整个集合
-
count为负数那么命令返回一个数组,数组中的,数量为的绝对值
-
SPOP key [count]
SRANDMEMBER
-
如果count不指定,那么返回集合中的一个随机元素
-
count同上
-
SRANDMEMBER key [count]
SREM
-
移除集合key中的一个或多个member元素,不存在的member将被忽略
-
SREM key member [member ...]
SUNION
-
返回一个集合的全部成员,该集合是所有给定集合的并集
-
不存在的key被视为空集
-
SUNION key [key ...]
SUNIONSTORE
-
类似SUNION,但结果保存到destination集合而不是简
-
单返回结果集
-
destination已存在,覆盖旧值
-
destination可以是本身
-
SUNION destination key [key ...]
3.5、SortedSet数据结构相关操作
数据结构最后说一下SortedSet相关操作,最近有一个场景需要实现Redis分页+高效移除数据,一下子没找到好的数据结构,后来想起了SortedSet才解决了问题,看来积累与储备还是非常有用的, SortedSet顾名思义,即有序的Set,看下相关命令:
ZADD
-
将一个或多个member元素及其score值加入有序集key中
-
如果member已经是有序集的成员,那么更新member对应的score并重新插入member保证member在正确的位置上
-
score可以是整数值或双精度浮点数
-
ZADD key score member [[score member] [score member] ...]
ZCARD
-
返回有序集key的元素个数
-
ZCARD key
ZCOUNT
-
返回有序集key中,score值>=min且<=max的成员的数量
-
ZCOUNT key min max
- ZRANGE
-
返回有序集key中指定区间内的成员,成员位置按score从小到大排序
-
具有相同score值的成员按字典序排列
-
需要成员按score从大到小排列,使用ZREVRANGE命令
-
下标参数start和stop都以0为底,也可以用负数,-1表示最后一个成员,-2表示倒数第二个成员
-
可通过WITHSCORESscore
-
ZRANGE key start stop [WITHSCORES]
ZRANK
-
返回有序集key中成员member的排名,有序集成员按score值从小到大排列
-
排名以0为底,即score最小的成员排名为0
-
ZREVRANK命令可将成员按score值从大到小排名
-
ZRANK key number
ZREM
-
移除有序集key中的一个或多个成员,不存在的成员将被忽略
-
当key存在但不是有序集时,返回错误
-
ZREM key member [member ...]
ZREMRANGEBYRANK
-
移除有序集key中指定排名区间内的所有成员
-
ZREMRANGEBYRANK key start stop
ZREMRANGEBYSCORE
-
移除有序集key中,所有score值>=min且<=max之间的成员
-
ZREMRANGEBYSCORE key min max
3.6、Redis的Key相关操作
DEL
-
删除给定的一个或多个key
-
不存在的Key将被忽略
-
DEL key [key ...]
EXISTS
-
检查给定key是否存在
-
EXISTS key
EXPIRE
-
为给定key设置生存时间,key过期时它会被自动删除
-
对一个已经指定生存时间的KeyEXPIRE
-
EXPIRE key seconds
EXPIREAT
-
同EXPIRE,但此命令指定的是UNIX时间戳,单位为秒
-
EXPIRE key timestamp
KEYS
-
查找所有符合给定模式pattern的key,下面举一下例子
-
KEYS *匹配所有key
-
KEYS h?llo匹配hello、hallo、hxllo等
-
KEYS h*llo匹配hllo、heeeeello等
-
KEYS h[ae]llo匹配hello和hallo
-
特殊符号想当做查找内容经的使用
-
KEYS pattern
MIGRATE
-
原子性地将key从当前实例传送到目标实例指定的数据库上
-
原数据库Key删除,新数据库Key增加
-
阻塞进行迁移的两个实例,直到迁移成功、迁移失败、等待超时三个之一发生
-
MIGRATE host port key destination-db timeout [COPY] [REPLACE]
MOVE
-
将当前数据库的key移动到给定数据库的db中
-
执行成功的条件为当前数据库有keykey
-
MOVE key db
PERSIST
-
移除给定key的生存时间,将key变为持久的
-
PERSIST key
RANDOMKEY
-
从当前数据库随机返回且不删除一个key.
-
RANDOMKEY
RENAME
-
将key改名为newkey 当key和newkey相同或key不存在,报错 newkey已存在,RENAME将覆盖旧值 。
-
RENAME key newkey
TTL
-
以秒为单位,返回给定的key剩余生存时间
-
TTL key
PTTL
-
以毫秒为单位,返回给定的key剩余生存时间
-
PTTL key
TYPE
-
返回key锁存储的值的类型
-
TYPE key
这里特别注意KEYS命令,虽然KEYS命令速度非常快,但是当Redis中百万、千万甚至过亿数据的时候,扫描所有Redis的Key,速度仍然会下降,由于Redis是单线程模型,这将导致后面的命令阻塞直到KEYS命令执行完。
因此当Redis中存储的数据达到了一定量级(经验值从10W开始就值得注意了)的时候,必须警惕KEYS造成Redis整体性能下降。
3.7、系统相关命令
BGREWRITEAOF
-
手动触发AOF重写操作,用于减小AOF文件体积
-
BGREWRITEAOF
BGSAVE
-
后台异步保存当前数据库的数据到磁盘
-
BGSAVE
CLIENT KILL
- 关闭地址为ip:port的客户端
- 由于Redis为单线程设计,因此当当前命令执行完之后才会关闭客户端
CLIENT KILL ip:port
CLIENT LIST
- 以可读的格式,返回所有连接到服务器的客户端信息和统计数据
CLIENT LIST
CONFIG GET
-
取得运行中的Redis服务器配置参数
-
支持*
-
CONFIG GET parameter
CONFIG RESETSTAT
-
重置INFO命令中的某些统计数据,例如Keyspace hits、Keyspace misses等
-
CONFIG RESETSTAT
CONFIG REWRITE
-
对启动Redis时指定的redis.conf文件进行改写
-
CONFIG REWRITE
CONFIG SET
-
动态调整Redis服务器的配置而无需重启
-
修改后的配置立即生效
-
CONFIG SET parameter value
SELECT
-
切换到指定数据库,数据库索引index用数字指定,以0作为起始索引值
-
默认使用0号数据库
-
SELECT index
DBSIZE
-
返回当前数据库的Key的数量
-
DBSIZE
DEBUG OBJECT
-
这是一个调试命令,不应当被客户端使用
-
key存在时返回有关信息,不存在时返回错误
-
DEBUG OBJECT key
FLUSHALL
-
清空整个Redis服务器的数据
-
FLUSHALL
FLUSHDB
-
清空当前数据库中的所有数据
-
FLUSHDB
INFO
-
以一种易于解释且易于阅读的格式,返回Redis服务器的各种信息和统计数值
-
通过给定可选参数section,可以让命令只返回某一部分信息
-
INFO [section]
LASTSAVE
-
返回最近一次Redis成功将数据保存到磁盘上的时间,以UNIX时间戳格式表示。
-
LASTSAVE
MONITOR
-
实时打印出Redis服务器接收到的命令,调试用
-
MONITOR
SHUTDOWN
-
停止所有客户端
-
如果至少有一个保存点在等待,执行SAVE命令
-
如果AOF选项被打开,更新AOF文件
-
关闭Redis服务器
-
SHUTDOWN [SAVE|NOSAVE]
3.8、Redis的事务
Redis的事务是由DISCARD、EXEC、MULTI、UNWATCH、WATCH五个命令来保证的:
DISCARD
-
取消事务如果正在使用WATCH命令监视某个/某些key,那么取消所有监视,等同于执行UNWATCH
-
DISCARD
EXEC
-
执行所有事务块内的命令
-
如果某个/某些key正处于WATCH命令监视之下且事务块中有和这个/这些key相关的命令,那么EXEC命令只在这个/这些key没有被其他命令改动的情况下才会执行并生效,否则该事务被打断。
-
EXEC
MULTI
-
标记一个事务块的开始
-
事务块内的多条命令会按照先后顺序被放入一个队列中,最后由EXEC命令原子性地执行
-
MULTI
UNWATCH
-
取消WATCH命令对所有key的监视
-
如果WATCH之后,EXEC/DISCARD命令先被执行了,UNWATCH命令就没必要执行了
-
UNWATCH
WATCH
-
监视一个/多个key,如果在事务执行之前这个/这些key被其他命令改动,那么事务将被打断
-
WATCH key [key ...]
- 看到开启事务之后,所有的命令返回的都是QUEUED,即放入队列,而不是直接执行。
- 接着模拟一下事务被打断的情况,WATCH一下Number这个Key,我另外起了一个Redis客户端INCR了一下Number,结果为: 看到,并没有命令被执行,返回nil即事务被打断。
- 接着简单说一下事务,和数据库类似的,事务保证的是两点:
隔离,所有命令序列化、按顺序执行,事务执行过程中不会被其他客户端发来的命令打断原子性,事务中的命令要么全部执行,要么全部不执行 另外,Redis的事务并不支持回滚,大致上是两个原因:
Redis命令只会因为语法而失败(且这些问题不能再入队时被发现),或是命令用在了错误类型的键上面,也就是说,从实用性角度来说,失败的命令是由于编程错误造成的,而这些错误应该在开发的过程中被发现而不应该出现在生产环境中 Redis内部可以保持简单且快速,因为不需要对回滚进行支持