三、数据类型

3.1、String类型类型在 Redis 中的相关命令

  • SET
    • 将字符串值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 

3.2、Hash数据结构相关操作

  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内部可以保持简单且快速,因为不需要对回滚进行支持 总而言之,对Redis来说,回滚无法解决编程错误带来的问题,因此还不如更简单、更快速地无回滚处理事务。

posted @ 2020-10-20 15:23  jingdy  阅读(126)  评论(0编辑  收藏  举报