Redis--常用命令(1)
Redis命令
Redis根据操作对象的不同,命令可分为三大类:
- 对Redis进行基础性操作的命令
- 对key的操作命令
- 对value的操作命令
基本命令
先通过redis-cli 命令进入到Redis命令行客户端,然后再运行下面的命令。
心跳命令ping
输入ping命令,会看到PONG响应,表名客户端与Redis连接正常,改命令也称为心跳命令。

读写键值命令
set key vlaue 会将指定的key-value写入到db。
get key 会读取指定key的值。
DB切换select
select 5 :切换到5号数据库
查看key数量:dbsize
删除当前库中的数据:flushdb
删除所有库中的数据:flushall
退出客户端命令:exit 或quit
Key操作命令
Redis中存储的数据整体是一个Map。key是String类型,而value则可以是String、Hash表、List、Set等类型。
- keys :查找所有符合给定命令pattern的key,pattern为正则表达式。
格式:keys pattern
keys的速度非常块,但在一个大的数据库中使用它可能会阻塞当前服务器的服务。所以生产环境中一般不使用该命令,而使用scan命令代替。
- exists : 检查给定的key是否存在,如果存在返回1,否则返回0
格式:exists key
- del : 删除给定的一个或多个key。不存在的key会被忽略。返回被删除key的数量。
格式:del key[key...]
举例:del hill head name
- rename: 重命名key。
格式:rename key newkey
当key和newkey 相同,或者key不存在时,返回一个错误。当newkey已经存在时,rename命令将覆盖旧值。改名成功返回ok,失败则返回错误。
- move: 将当前数据库的key移动到指定的数据库中
格式: move key db
如果当前数据库和指定数据库有相同名字的key,或者key不存在当前数据库,那么move没有任何效果。成功返回1,失败则返回0。
-
type :返回key 所存储的值的类型。
格式:type key
返回值有六种:none(key不存在)、string(字符串)、list(列表)、set(集合)、zset(有序集合)、hash(哈希表)。
- expire 和 pexpire
格式:expire key seconds
功能:为给定的key设置生存时间,当key过期(生存时间为0),它会被自动删除。expire 的时间单位为秒,pexpire 的时间单位为毫秒。在Redis中,带有生存时间的key被称为“易失的”(volatile)。
生存时间设置成功返回1,如果key不存在就返回0。rename操作不会改变key的生存时间。
- ttl和pttl :ttl(time to live),返回给定key的剩余生存时间。
格式:ttl key
返回值有三种:当key不存在时返回 -2 ;
当key存在,但没有设置生存时间时,返回-1;
否则,返回key的剩余生存时间。ttl命令返回的时间单位为秒。pttl命令返回的时间单位为毫秒。
- persist : 去除key的生存时间,将这个key从“易失的”转为“持久的”。
格式:persist key
当生存时间移除成功,返回1;如果key不存在或者key没有设置生存时间,则返回0。
- randomkey: 从当前数据库中随机返回一个key
格式:randomkey
当数据库不为空时,返回一个key;如果数据库为空,返回nil。
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:用于遍历当前db中指定hash表的所有field-value对。
- sscan:用于遍历当前db中指定set集合的所有元素。
- zscan:用于遍历当前db中指定Zset集合的所有元素。


String类型的value操作命令
String类型的value可以存放任意数据,包括数值型,甚至是二进制的图片、音频、视频、序列化对象等。
一个String类型的value最大是512M。
- set:给key 设置指定的值。
格式:set key value 【EX seconds | PX milliseconds】【NX|XX】
EX seconds:为当前key设置过期时间,单位秒,等价于setex命令
PX milliseconds:为当前key设置过期时间,单位毫秒,等价于psetex命令
NX:指定的key不存在才会设置成功,用于添加指定的key。等价于setnx命令
XX:指定的key必须存在才会设置成功,用于更新指定key的value
注意:如果value字符串中带有空格,则该字符串必须使用双引号或者单引号引起来,否则会认为set命令的参数数量不正确,报错。
- setex 和 psetex
格式:setex/psetex key seconds value
功能:set expire,其不仅为key指定value。还设置了生存时间。setex时间单位是秒,psetex的单位是毫秒。
注意:如果key存在,则覆盖旧值。该命令类似于以下两个目录。不同之处在于,setex是一个原子性操作,关联值和设置生存时间这两个动作会在同一时间完成,该命令在Redis用作缓存时,非常实用。
set key value
expire key seconds
- setnx : set in not exists ,给key设置value,仅当key不存在时生效。若key已经存在,则setnx不做任何动作,成功返回1,否则返回0
格式:setnx key value
该命令等价于:set key value nx
- getset:给key设置新的value,并返回旧value。当key存在但不是字符串类型时,返回一个错误;当key不存在时,返回nil。
格式:getset key value
- mset与msetnx : 同时设置一个或多个key-value对。
格式:mset/msetnx key value 【key value】
注意:某个某个key已经存在,那么mset会用新值覆盖旧值,如果不想覆盖,请使用msetnx 。
msetnx 命令只会在所给的key都不存在的情况下进行设置操作。
mset/msetnx 是一个原子性操作,所给定的key都会在同一时间内被设置,要么都设置成功,要么都设置失败。
- mget: 返回一个或多个key的值。
格式:mget key 【key...】
注意:如果这些key里面,有某个key不存在,那么这个key返回特殊值nil。该命令永不失败。
- append:如果key已存在,该命令将value追加到原来值得末尾。如果key不存在,就设置value。
格式:append key value
注意:追加value后,key中字符串的长度。
- incr 和decr
格式:incr/decr key
功能:increment ,自动递增,将key中存储的数字+1.
decrement,自动递减,将key中存储的数字-1.
注意:如果key不存在,那么key的值会先被初始化为0,然后再执行+/- 1操作。
如果值不是数字,那么返回一个错误。
如果执行正确,返回计算后的结果。
- incrby 和 decrby :将key中存储的数字+/- 指定的数,这个数只能是整数,可以是负数,但不能是小数。
格式 incrby key increment 或 decrby key decrement
注意:如果key不存在,那么key的值会先被初始化为0,然后再执行+/- 1操作。
如果值不是数字,那么返回一个错误。
如果执行正确,返回计算后的结果。
- incrbyfloat:为key的值加上浮点数增量 increment。与之前的说明相同,但是没有decrbyfloat,但increment为负数可以实现减操作。
格式 :incrbyfloat key increment
举例:incrbyfloat age 2.5
- strlen:返回给定key的value的字符串长度
格式:strlen key
- getrange:返回key中字符串的子字符串,字符串的截取范围由start和end两个偏移量决定,包含start和end在内。
格式:getrange key start end
注意:end必须要比start 大。支持负数偏移量,表示从字符串最后开始计数,-1表示最后一个字符,-2表示倒数第二个,以此类推。
注意:getrange name 0 -1 # 这个命令是正确的,返回的是完成的str.
- setrange: 替换指定key的字符串值str,从偏移量offset开始。当offset大于str的长度,中间使用零字节\x00填充,即0000 0000字节 填充;对于不存在的key,当作空串处理。
格式:setrange key offset value
- 位操作命令
名称中包含bit的命令,都是对二进制位的操作命令,比如setbit、getbit、bitcount、bittop、bitfield,这些命令不常用。
典型应用场景
数据缓存
从MySQL中获取数据后先存入缓存,再返回给应用服务器。
计数器
在Redis 中写入一个value 为数值型的key作为平台计数器等。每个客户端访问一次,就增加Redis中的计数器,然后再以一部方式持久化到其他数据源中,比如MySQL。
共享session
在分布式系统中,如果用户身份信息这样的session数据保存在登录服务中,那么用户再次提交收藏、支付这样需要验证身份的请求可能会出现问题:因为支付服务中并没有保存用户的session,从而需要用户重新登录。这对用户来说不可接受。
此时可以把session保存在redis中,用户在提交请求时,可以从Redis中获取session数据,再进行相关操作,这样就不会引发“重新登录”的问题。
限速器
很多平台为了防止DoS 拒绝服务攻击,一般会限制一个IP不能在一秒内访问超过n次。而Redis可以结合key的过期时间与incr命令来完成限速功能,充当限速器。
set 192.168.132.33 1 ex 60 nx # 192.168.132.33 是key;1是value 。
Boolean isExists = redis.set(192.168.132.33,1,"EX 60","NX");
if(isExists != null || redis.incr(192.168.132.33,1)<=5){
// 通过
}else{
// 限流
}
但是无法防止DDoS 分布式拒绝服务攻击
本文来自博客园,作者:NE_STOP,转载请注明原文链接:https://www.cnblogs.com/alineverstop/p/19924595
浙公网安备 33010602011771号