zoukankan      html  css  js  c++  java
  • 三、数据类型

    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来说,回滚无法解决编程错误带来的问题,因此还不如更简单、更快速地无回滚处理事务。

  • 相关阅读:
    CentOs7-替换下载源
    CentOs7-常用命令
    Django Nginx+uwsgi 安装配置
    Linux操作系统下文件作用
    U盘创建macOS安装盘
    国内开源镜像站点汇总
    gcd常见用法
    mac rvm 升级 ruby 安装cocoapod 指定版本
    confluence 搭建 wiki 并破解
    homebrew 安装 java 指定版本
  • 原文地址:https://www.cnblogs.com/jdy1022/p/13846677.html
Copyright © 2011-2022 走看看