【动力节点】Redis入门到高级教程,全网最新最全redis缓存教程,redis百科大全
3 Redis命令
Redis根据命令所操作对象的不同,可以分为三大类:对Redis进行基础性操作的命令,对Key的操作命令,对Value的操作命令。
3.1 Redis基本命令
首先通过redis-cli命令进入到Redis命令行客户端,然后再运行下面的命令。
3.1.1 心跳命令 ping
键入ping命令,会看到PONG响应,则说明该客户端与Redis的连接是正常的。该命令亦称为心跳命令。
3.1.2 读写键值命令
set key value会将指定key-value写入到DB。get key则会读取指定key的value值。关于更多set与get命令格式,后面会详细学习。
3.1.3 DB切换select
Redis默认有16个数据库。这个在Redis Desktop Manager(RDM)图形客户端中可以直观地看到。
默认使用的是0号DB,可以通过select db索引来切换DB。例如,如下命令会切换到DB3,并会将age-23写入到DB3中。
并且这个结果在RDM中是可以直观地看到的。
3.1.4 查看key数量dbsize
dbsize命令可以查看当前数据库中key的数量。
从以上查看情况看,DB0中有2个key,DB1中没有key,DB3中有1个key。
3.1.5 删除当前库中数据flushdb
flushdb命令仅仅删除的是当前数据库中的数据,不影响其它库。
3.1.6 删除所有库中数据命令flushall
flushall命令可以删除所有库中的所有数据。所以该命令的使用一定要慎重。
3.1.7 退出客户端命令
使用exit或quit命令均可退出Redis命令行客户端。
3.2 Key操作命令
Redis中存储的数据整体是一个Map,其key为String类型,而value则可以是String、Hash表、List、Set等类型。
3.2.1 keys
- 格式:KEYS pattern
- 功能:查找所有符合给定模式 pattern 的 key,pattern为正则表达式。
- 说明:KEYS的速度非常快,但在一个大的数据库中使用它可能会阻塞当前服务器的服务。所以生产环境中一般不使用该命令,而使用scan命令代替。
3.2.2 exists
- 格式:EXISTS key
- 功能:检查给定 key 是否存在。
- 说明:若 key 存在,返回 1 ,否则返回 0 。
3.2.3 del
- 格式:DEL key [key …]
- 功能:删除给定的一个或多个 key 。不存在的 key 会被忽略。
- 说明:返回被删除 key 的数量。
3.2.4 rename
- 格式:RENAME key newkey
- 功能:将 key 改名为 newkey。
- 说明:当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。当 newkey 已经存在时, RENAME命令将覆盖旧值。改名成功时提示 OK ,失败时候返回一个错误。
3.2.5 move
- 格式:MOVE key db
- 功能:将当前数据库的 key 移动到给定的数据库 db 当中。
- 说明:如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。移动成功返回 1 ,失败则返回 0 。
3.2.6 type
- 格式:TYPE key
- 功能:返回 key 所储存的值的类型。
- 说明:返回值有以下六种
- none (key不存在)
- string (字符串)
- list (列表)
- set (集合)
- zset (有序集)
- hash (哈希表)
3.2.7 expire与pexpire
- 格式:EXPIRE key seconds
- 功能:为给定 key 设置生存时间。当 key 过期时(生存时间为 0),它会被自动删除。expire的时间单位为秒,pexpire的时间单位为毫秒。在 Redis 中,带有生存时间的 key 被称为“易失的”(volatile)。
- 说明:生存时间设置成功返回 1。若 key 不存在时返回 0 。rename操作不会改变key的生存时间。
3.2.8 ttl与pttl
- 格式:TTL key
- 功能:TTL, time to live,返回给定 key 的剩余生存时间。
- 说明:其返回值存在三种可能:
- 当 key 不存在时,返回 -2 。
- 当 key 存在但没有设置剩余生存时间时,返回 -1 。
- 否则,返回 key 的剩余生存时间。ttl命令返回的时间单位为秒,而pttl命令返回的时间单位为毫秒。
3.2.9 persist
- 格式:PERSIST key
- 功能:去除给定 key 的生存时间,将这个 key 从“易失的”转换成“持久的”。
- 说明:当生存时间移除成功时,返回 1;若 key 不存在或 key 没有设置生存时间,则返回 0。
3.2.10 randomkey
- 格式:RANDOMKEY
- 功能:从当前数据库中随机返回(不删除)一个key。
- 说明:当数据库不为空时,返回一个key。当数据库为空时,返回nil。
3.2.11 scan
- 格式:SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
- 功能:用于迭代数据库中的数据库键。其各个选项的意义为:
- cursor:本次迭代开始的游标。
- pattern :本次迭代要匹配的key的模式。
- count :本次迭代要从数据集里返回多少元素,默认值为 10 。
- type:本次迭代要返回的value的类型,默认为所有类型。
SCAN命令是一个基于游标cursor的迭代器:SCAN命令每次被调用之后,都会向用户返回返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。用户在下次迭代时需要使用这个新游标作为SCAN命令的游标参数,以此来延续之前的迭代过程。当SCAN命令的游标参数被设置为0时,服务器将开始一次新的迭代。如果新游标返回 0 表示迭代已结束。
- 说明:使用间断的、负数、超出范围或者其他非正常的游标来执行增量式迭代不会造成服务器崩溃。
当数据量很大时,count的数量的指定可能会不起作用,Redis会自动调整每次的遍历数目。由于scan命令每次执行都只会返回少量元素,所以该命令可以用于生产环境,而不会出现像 KEYS 命令带来的服务器阻塞问题。
增量式迭代命令所使用的算法只保证在数据集的大小有界的情况下迭代才会停止,换句话说,如果被迭代数据集的大小不断地增长的话,增量式迭代命令可能永远也无法完成一次完整迭代。即当一个数据集不断地变大时,想要访问这个数据集中的所有元素就需要做越来越多的工作, 能否结束一个迭代取决于用户执行迭代的速度是否比数据集增长的速度更快。
- 相关命令:另外还有3个scan命令用于对三种类型的value进行遍历。
- hscan:属于Hash型Value操作命令集合,用于遍历当前db中指定Hash表的所有field-value对。
- sscan:属于Set型Value操作命令集合,用于遍历当前db中指定set集合的所有元素
- zscan:属于ZSet型Value操作命令集合,用于遍历当前db中指定有序集合的所有元素(数值与元素值)
3.3 String型Value操作命令
Redis存储数据的Value可以是一个String类型数据。String类型的Value是Redis中最基本,最常见的类型。String类型的Value中可以存放任意数据,包括数值型,甚至是二进制的图片、音频、视频、序列化对象等。一个String类型的Value最大是512M大小。
3.3.1 set
- 格式:SET key value [EX seconds | PX milliseconds] [NX|XX]
- 功能:SET除了可以直接将key 的值设为 value外,还可以指定一些参数。
- EX seconds:为当前key设置过期时间,单位秒。等价于SETEX命令。
- PX milliseconds:为当前key设置过期时间,单位毫秒。等价于PSETEX命令。
- NX:指定的key不存在才会设置成功,用于添加指定的key。等价于SETNX命令。
- XX:指定的key必须存在才会设置成功,用于更新指定key的value。
- 说明:如果value字符串中带有空格,则该字符串需要使用双引号或单引号引起来,否则会认为set命令的参数数量不正确,报错。
3.3.2 setex与psetex
- 格式:SETEX/PSETEX key seconds value
- 功能:set expire,其不仅为key指定了value,还为其设置了生存时间。setex的单位为秒,psetex的单位为毫秒。
- 说明:如果 key 已经存在, 则覆写旧值。该命令类似于以下两个命令,不同之处是, SETEX 是一个原子性操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。
SET key value
EXPIRE key seconds # 设置生存时间
3.3.3 setnx
- 格式:SETNX key value
- 功能:SET if Not eXists,将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。成功,返回1,否则,返回0。
- 说明:该命令等价于set key value nx
3.3.4 getset
- 格式:GETSET key value
- 功能:将给定 key 的值设为 value ,并返回 key 的旧值。
- 说明:当 key 存在但不是字符串类型时,返回一个错误;当 key 不存在时,返回 nil 。
3.3.5 mset与msetnx
- 格式:MSET/MSETNX key value [key value …]
- 功能:同时设置一个或多个 key-value 对。
- 说明:如果某个给定 key 已经存在,那么 MSET会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用 MSETNX命令:它只会在所有给定 key 都不存在的情况下进行设置操作。MSET/MSETNX是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况不可能发生。该命令永不失败。
3.3.6 mget
- 格式:MGET key [key …]
- 功能:返回所有(一个或多个)给定 key 的值。
- 说明:如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。
3.3.7 append
- 格式:APPEND key value
- 功能:如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
- 说明:追加 value 之后, key 中字符串的长度。
3.3.8 incr与decr
-
格式:INCR key 或 DECR key
-
功能:increment,自动递增。将 key 中存储的数字值增一。
decrement,自动递减。将key中存储的数字值减一。
-
说明:如果 key 不存在,那么 key 的值会先被初始化为0,然后再执行增一/减一操作。如果值不能表示为数字,那么返回一个错误提示。如果执行正确,则返回增一/减一后的值。
3.3.9 incrby与decrby
- 格式:INCRBY key increment 或 DECRBY key decrement
- 功能:将key中存储的数字值增加/减少指定的数值,这个数值只能是整数,可以是负数,但不能是小数。
- 说明:如果 key 不存在,那么 key 的值会先被初始化为0,然后再执行增/减操作。如果值不能表示为数字,那么返回一个错误提示。如果执行正确,则返回增/减后的值。
3.3.10 incrbyfloat
- 格式:INCRBYFLOAT key increment
- 功能:为 key 中所储存的值加上浮点数增量 increment 。
- 说明:与之前的说明相同。没有decrbyfloat命令,但increment为负数可以实现减操作效果。
3.3.11 strlen
- 格式:STRLEN key
- 功能:返回 key 所储存的字符串值的长度。
- 说明:当 key 储存的不是字符串值时,返回一个错误;当 key 不存在时,返回 0 。
3.3.12 getrange
- 格式:GETRANGE key start end
- 功能:返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定,包括 start 和 end 在内。
- 说明:end必须要比start大。支持负数偏移量,表示从字符串最后开始计数,-1 表示最后一个字符,-2 表示倒数第二个,以此类推。
3.3.13 setrange
- 格式:SETRANGE key offset value
- 功能:用 value 参数替换给定 key 所储存的字符串值str,从偏移量 offset 开始。
- 说明:当offset值大于str长度时,中间使用零字节\x00填充,即0000 0000字节填充;对于不存在的 key 当作空串处理。
3.3.14 位操作命令
名称中包含BIT的命令,都是对二进制位的操作命令,例如,setbit、getbit、bitcount、bittop、bitfield,这些命令不常用。
3.3.15 典型应用场景
Value为String类型的应用场景很多,这里仅举这种典型应用场景的例子:
3.3.15.1 数据缓存
Redis作为数据缓存层,MySQL作为数据存储层。应用服务器首先从Redis中获取数据,如果缓存层中没有,则从MySQL中获取后先存入缓存层再返回给应用服务器。
3.3.15.2 计数器
在Redis中写入一个value为数值型的key作为平台计数器、视频播放计数器等。每个有效客户端访问一次,或视频每播放一次,都是直接修改Redis中的计数器,然后再以异步方式持久化到其它数据源中,例如持久化到MySQL。
3.3.15.3 共享Session
对于一个分布式应用系统,如果将类似用户登录信息这样的Session数据保存在提供登录服务的服务器中,那么如果用户再次提交像收藏、支付等请求时可能会出现问题:在提供收藏、支付等服务的服务器中并没有该用户的Session数据,从而导致该用户需要重新登录。对于用户来说,这是不能接受的。
此时,可以将系统中所有用户的Session数据全部保存到Redis中,用户在提交新的请求后,系统先从Redis中查找相应的Session数据,如果存在,则再进行相关操作,否则跳转到登录页面。这样就不会引发“重新登录”问题。
3.3.15.4 限速器
现在很多平台为了防止DoS(Denial of Service,拒绝服务)攻击,一般都会限制一个IP不能在一秒内访问超过n次。而Redis可以可以结合key的过期时间与incr命令来完成限速功能,充当限速器。
注意,其无法防止DDoS(Distributed Denial of Service,分布式拒绝服务)攻击。