一、Redis全局命令
查看所有键
keys *
keys l*
dbsize
exists
del
expire
pexpire
pexpireat key
PEXPIREAT key milliseconds-timestamp
key
是你想要设置过期时间的键名。milliseconds-timestamp
是键应该过期的Unix时间戳(毫秒)。- 如果键存在并且成功设置了过期时间,返回
1
。 - 如果键不存在,返回
0
。
persist
type
Random
二、String数据类型
1. 设置和获取SET、GET
- SET key value:设置指定 key 的值。如果 key 已经存储其他值,则覆盖旧值。
- GET key:获取指定 key 的值。如果 key 不存在,则返回 nil。
2. 批量操作MSET、MGET
- MSET key1 value1 key2 value2 ...:同时设置一个或多个 key-value 对。当有一个 key 不成功时,操作会被全部取消。
- MGET key1 key2 ...:获取一个或多个给定 key 的值,如果 key 不存在,则返回 nil。
批量操作的优点:
批量操作命令可以有效提高效率,假如没有mget这样的命令,执行n次get命令具体耗时如下:
n次 get时间=n次网络时间+n次命令时间
使用mget命令后,要执行n次get命令操作具体耗时如下:
n次get时间=1次网络时间+n次命令时间
Redis可以支撑每秒数万的读写操作,但是这指的是Redis服务端的处理能力,对于客户端来说,一次命令除了命令时间还是有网络时间,假设网络时间为1毫秒,命令时间为0.1毫秒(按照每秒处理1万条命令算),那么执行1000次 get命令需要1.1秒(10001+10000.1=1100ms),1次mget命令的需要0.101秒(11+10000.1=101ms)。
3. 自增自减INCR、DECR、INCRBY、DECRBY
- INCR key:将 key 中储存的数字值增一。如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执行 INCR 操作。
- DECR key:将 key 中储存的数字值减一。如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执行 DECR 操作。
- INCRBY key increment:将 key 所储存的值加上给定的增量值(increment)。
- DECRBY key decrement:将 key 所储存的值减去给定的减量值(decrement)。
-
INCRBYFLOAT
4.SETNX和SETXX
setnx: 键必须不存在,才可以设置成功,若给定的 key 已经存在,则 SETNX 不做任何动作。用于添加(分布式锁常用)。
setxx: 与nx相反,键必须存在,才可以设置成功,用于更新。
5.GETSET
设置新值并返回原值,将给定 key 的值设为 value ,并返回 key 的旧值(old value)。当 key 存在但不是字符串类型时,返回一个错误。
6. 追加APPEND
- APPEND key value:如果 key 已经存在并且是一个字符串,APPEND 命令会将 value 追加到 key 原来的值的末尾。如果 key 不存在,APPEND 就相当于 SET key value。
7.字符串长度 STRLEN
- STRLEN key:返回存储在 key 的字符串值的长度。当 key 存储的不是字符串值时,返回一个错误。
8.SETRANGE
- setrange 设置指定位置的字符
9.GETRANGE
-
getrange 截取字符串,下标从0开始计算。
getrange 截取字符串中的一部分,形成一个子串,需要指明开始和结束的偏移量,截取的范围是个闭区间。
10.RENAME
键重命名
但是要注意,如果在rename之前,新键已经存在,那么它的值也将被覆盖。
为了防止被强行rename,Redis提供了renamenx命令,确保只有newKey不存在时候才被覆盖。
从上面我们可以看出,由于重命名键期间会执行del命令删除旧的键,如果键对应的值比较大,会存在阻塞Redis的可能性。
10.命令的时间复杂度
字符串这些命令中,除了del 、mset、 mget支持多个键的批量操作,时间复杂度和键的个数相关,为O(n),getrange和字符串长度相关,也是O(n),其余的命令基本上都是O(1)的时间复杂度,在速度上还是非常快的。
使用场景
字符串类型的使用场景很广泛:
缓存功能
Redis 作为缓存层,MySQL作为存储层,绝大部分请求的数据都是从Redis中获取。由于Redis具有支撑高并发的特性,所以缓存通常能起到加速读写和降低后端压力的作用。
计数
使用Redis 作为计数的基础工具,它可以实现快速计数、查询缓存的功能,同时数据可以异步落地到其他数据源。
共享Session
一个分布式Web服务将用户的Session信息(例如用户登录信息)保存在各自服务器中,这样会造成一个问题,出于负载均衡的考虑,分布式服务会将用户的访问均衡到不同服务器上,用户刷新一次访问可能会发现需要重新登录,这个问题是用户无法容忍的。
为了解决这个问题,可以使用Redis将用户的Session进行集中管理,,在这种模式下只要保证Redis是高可用和扩展性的,每次用户更新或者查询登录信息都直接从Redis中集中获取。
限速
比如,很多应用出于安全的考虑,会在每次进行登录时,让用户输入手机验证码,从而确定是否是用户本人。但是为了短信接口不被频繁访问,会限制用户每分钟获取验证码的频率,例如一分钟不能超过5次。一些网站限制一个IP地址不能在一秒钟之内方问超过n次也可以采用类似的思路。
三、Hash类型
1、hset、hget
2、hmset、hmget
hmset批量设值、hmget批量取值
3、hsetnx
4、hdel
hdel会删除一个或多个field,返回结果为成功删除field的个数。
5、hlen
计算field个数
6、hexists
hexists判断field是否存在,若存在返回1,不存在返回0
7、hkeys、hvals
hkeys获取所有field
它返回指定哈希键所有的field
hvals获取所有的值
8、hgetall
hgetall获取所有field与value
9、hincrby增加
四、Stirng和Hash的使用场景
从前面的操作可以看出,String和Hash的操作非常类似,那为什么要弄一个hash出来存储。
哈希类型比较适宜存放对象类型的数据,我们可以比较下,如果数据库中表记录user为:
1、使用String类型
需要一条条去插入获取。
set user:1:name lijin;
set user:1:age 18;
set user:2:name msb;
set user:2:age 20;
优点:简单直观,每个键对应一个值
缺点:键数过多,占用内存多,用户信息过于分散,不用于生产环境
2、将对象序列化存入redis
set user:1 serialize(userInfo);
优点:编程简单,若使用序列化合理内存使用率高
缺点:序列化与反序列化有一定开销,更新属性时需要把userInfo全取出来进行反序列化,更新后再序列化到redis
3、使用hash类型
hmset user:1 name lijin age 18
hmset user:2 name msb age 20
优点:简单直观,使用合理可减少内存空间消耗
缺点:要控制内部编码格式,不恰当的格式会消耗更多内存
五、List操作命令
列表( list)类型是用来存储多个有序的字符串,a、b、c、c、b四个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素(element),一个列表最多可以存储(2^32-1)个元素(4294967295)。
列表类型有两个特点:
第一、列表中的元素是有序的,这就意味着可以通过索引下标获取某个元素或者某个范围内的元素列表。
第二、列表中的元素可以是重复的。
1、rpush 向右插入
2、lpush 向左插入
3、lpop
从列表左侧弹出(会删除元素)
4、rpop
从列表右侧弹出
5、linsert
在某个元素前或后插入新元素
LINSERT key BEFORE|AFTER pivot value
key
是列表的键名。BEFORE|AFTER
指定了在pivot
元素之前还是之后插入新元素。pivot
是列表中的一个元素,LINSERT
会在这个元素之前或之后插入新元素。value
是要插入的新元素。
返回值
- 如果操作成功,返回列表的长度。
- 如果
pivot
不存在于列表中,返回-1
。
6、Irem
对指定元素进行删除
lrem命令会从列表中找到等于value的元素进行删除,根据count的不同分为三种情况:
count>0,从左到右,删除最多count个元素。
count<0,从右到左,删除最多count绝对值个元素。
count=0,删除所有。
7、Itirm
按照索引范围修剪列表
LTRIM key start stop
key
:列表的键名。start
:要保留的起始索引(包含)。索引可以是正数或负数,其中0表示列表的第一个元素,-1表示列表的最后一个元素,以此类推。stop
:要保留的结束索引(包含)。索引规则与start
相同。
返回值:
- 命令执行成功时,返回
OK
。
8、lindex
lindex 获取列表指定索引下标的元素
9、llen
获取列表长度
10、blpop和brpop
它们用于从列表的头部或尾部阻塞地弹出元素。这些命令在需要实现如消息队列或生产者-消费者模式时非常有用。
BLPOP key [key ...] timeout
key
:一个或多个列表的键。timeout
:阻塞的最大秒数。如果设置为 0,则无限期阻塞。
返回值:
- 如果列表不为空,返回一个包含两个元素的列表,第一个是弹出元素的键名,第二个是弹出的元素值。
- 如果列表为空且达到超时时间,则返回
nil
BRPOP
BRPOP
命令与 BLPOP
类似,但它是从列表的尾部阻塞地弹出元素。
BRPOP key [key ...] timeout
- 参数与
BLPOP
相同。
返回值:
- 如果列表不为空,返回一个包含两个元素的列表,第一个是弹出元素的键名,第二个是弹出的元素值。
- 如果列表为空且达到超时时间,则返回
nil
。
使用场景
- 消息队列:生产者可以将任务或消息推送到列表中,消费者可以使用
BLPOP
或BRPOP
从列表中取出任务进行处理。这种方式能够很好地实现生产者-消费者模式。 - 任务分发:在多任务处理系统中,可以将任务分发到不同的列表中,每个工作节点使用
BLPOP
或BRPOP
从各自的列表中取出任务进行处理。 - 数据同步:在某些场景下,可以使用列表作为数据同步的缓冲区,一端将数据推送到列表中,另一端通过
BLPOP
或BRPOP
拉取数据进行处理。
- 模拟栈
- 文章列表
每个用户有属于自己的文章列表,现需要分页展示文章列表。此时可以考虑使用列表,因为列表不但是有序的,同时支持按照索引范围获取元素。
- 实现其他数据结构
lpush+lpop =Stack(栈)
lpush +rpop =Queue(队列)
lpsh+ ltrim =Capped Collection(有限集合)
lpush+brpop=Message Queue(消息队列)
注意事项
- 使用
BLPOP
和BRPOP
时,需要注意超时时间的设置,以避免长时间阻塞导致的资源浪费。 - 在 Redis 集群环境中,由于
BLPOP
和BRPOP
是阻塞操作,它们只能在单个节点上执行,不支持跨节点的键操作。 - 在高并发场景下,大量客户端同时阻塞在
BLPOP
或BRPOP
上可能会对 Redis 服务器的性能产生影响,需要合理设计系统架构和使用场景。
六、Set操作命令
1、sadd 添加元素
允许添加多个,返回结果为添加成功的元素个数
2、srem 删除元素
允许删除多个,返回结果为成功删除元素个数
3、scard 计算元素个数
4、sismember 判断元素是否在集合中
5、srandmember 随机从集合返回指定个数元素
6、spop 从集合随机弹出元素
同样可以指定个数,如果不写默认为1
既然是弹出,spop命令执行后,元素会从集合中删除,
srandmember弹出不会删除
7、smembers 获取所有元素(不会弹出元素)
返回结果是无序的
8、集合间操作命令
sinter 求多个集合的交集
交集结果保存
suinon 求多个集合的并集
并集结果保存
sdiff 求多个集合的差集
差集结果保存
使用场景
集合类型比较典型的使用场景是标签(tag)。例如一个用户可能对娱乐、体育比较感兴趣,另一个用户可能对历史、新闻比较感兴趣,这些兴趣点就是标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于用户体验以及增强用户黏度比较重要。
例如一个电子商务的网站会对不同标签的用户做不同类型的推荐,比如对数码产品比较感兴趣的人,在各个页面或者通过邮件的形式给他们推荐最新的数码产品,通常会为网站带来更多的利益。
除此之外,集合还可以通过生成随机数进行比如抽奖活动,以及社交图谱等等。
七、Zset操作命令
有序集合相对于哈希、列表、集合来说会有一点点陌生,但既然叫有序集合,那么它和集合必然有着联系,它保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数( score)作为排序的依据。
有序集合中的元素不能重复,但是score可以重复,就和一个班里的同学学号不能重复,但是考试成绩可以相同。
有序集合提供了获取指定分数和元素范围查询、计算成员排名等功能,合理的利用有序集合,能帮助我们在实际开发中解决很多问题。
1、zadd添加成员
返回结果代表成功添加成员的个数
zadd命令还有四个选项nx、xx、ch、incr 四个选项
nx: member必须不存在,才可以设置成功,用于添加。
xx: member必须存在,才可以设置成功,用于更新。
ch: 返回此次操作后,有序集合元素和分数发生变化的个数
incr: 对score做增加,相当于后面介绍的zincrby
2、zcard 计算成员个数
3、zscore 计算某个成员的分数
4、zrank计算成员的排名
zrank是从分数从低到高返回排名
zrevrank反之
很明显,排名从0开始计算。
5、zrem删除成员
允许一次删除多个成员。
返回结果为成功删除的个数。
6、zincrby 增加成员的分数
7、zrange和zrevrange返回指定排名范围的成员
有序集合是按照分值排名的,zrange是从低到高返回,zrevrange反之。如果加上 withscores选项,同时会返回成员的分数
zrangebyscore返回指定分数范围的成员,其中zrangebyscore按照分数从低到高返回
查询分数80-60的人 zrevrangebyscore按照分数从高到低返回
同时min和max还支持开区间(小括号)和闭区间(中括号),-inf和+inf分别代表无限小和无限大:
zrevrangebyscore倒序
8、zcount 返回指定分数范围成员个数
9、zremrangebyrank 按升序删除指定排名内的元素
zremrangebyrank key start end
10、zremrangebyscore 删除指定分数范围的成员
zremrangebyscore key min max
11、zinterstore 交集
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
destination
:指定结果集保存的集合key。numkeys
:指定有多少个集合参与交集运算。key [key ...]
:指定参与交集运算的集合的key,数量要和numkeys
声明的数量相等。[WEIGHTS weight [weight ...]]
:可选参数,指定参与交集运算各集合score的权重参数。默认情况下,权重皆为1。[AGGREGATE SUM|MIN|MAX]
:可选参数,指定交集中元素的score的取值方式。默认为SUM
,即各集合中该元素的score乘以权重求和。也可以选择MIN
或MAX
,分别表示取最小值或最大值。
zinterstore zsetavg 2 zset66 zset67 WEIGHTS 0.5 0.5
这条命令的含义如下:
zinterstore
:这是 Redis 中用于计算交集并存储结果的命令。zsetavg
:这是新创建的有序集合的名称,用于存储交集的结果。2
:这指定了参与交集运算的有序集合的数量。在这个例子中,有两个集合参与运算。zset66
和zset67
:这是两个参与交集运算的有序集合的名称。WEIGHTS 0.5 0.5
:这是可选参数,用于指定每个集合中元素的分数(score)的权重。在这个例子中,zset66
和zset67
中元素的分数都将被乘以 0.5(即减半)。如果不指定WEIGHTS
,则默认权重为 1。
计算 zset66
和 zset67
这两个有序集合的交集,并将交集中的每个元素的分数都减半(乘以 0.5),然后将结果存储在名为 zsetavg
的新有序集合中。