Redis学习笔记

常用命令

字符串

  • 场景描述:存储简单的键值对,适用于需要单独存储、读取或修改单个值的场景。
  • 具体示例:
    • 存储用户信息(如user:100:name "张三")、商品价格(goods:100:price "99.9")等。
    • 实现计数器(通过incr/decr命令,如文章阅读量article:100:views,每访问一次执行incr)。
    • 分布式锁基础(setnx命令,仅当键不存在时设置,用于抢占锁资源)。

set:设置键值对

  • 用法:

    1
    set key value [nx|xx] [ex seconds|px milliseconds]
    • nx:仅当键不存在时设置(not exists)
    • xx:仅当键存在时设置(exists)
    • ex:设置过期时间(秒)
    • px:设置过期时间(毫秒)
  • 示例:

    • set name "redis" → 设置键name的值为"redis"
    • set age 20 ex 3600 → 设置键age的值为 20,1 小时后过期
  • 使用场景:存储用户信息、配置参数、临时令牌等,需设置过期时间时尤其适用。

get:获取键的值

  • 用法get key
  • 示例get name → 返回键name的值(如"redis"),若键不存在返回nil
  • 使用场景:查询已存储的字符串数据,如获取用户昵称、商品价格等。

incr:自增数字值(+1)

  • 用法incr key
  • 示例:
    • num当前值为3,执行incr num → 返回4num的值变为4
    • 若键不存在,先初始化为0再自增(返回1
  • 使用场景:计数器(如文章阅读量、订单编号生成、在线人数统计等)。

del:删除键(通用命令,字符串常用)

  • 用法del key
  • 示例del name → 删除name键,返回1(成功删除的数量)
  • 使用场景:主动清除不需要的数据(如用户注销后删除其相关信息)。

exists:检查键是否存在(通用命令,字符串常用)

  • 用法exists key
  • 示例exists name → 存在返回1,不存在返回0
  • 使用场景:判断数据是否已存储(如检查用户是否已注册)。

mset:批量设置键值对

  • 用法mset key1 value1 key2 value2 ...
  • 示例mset username "alice" email "alice@test.com" → 同时设置usernameemail的值
  • 使用场景:一次性存储多个关联数据,减少网络请求次数,提高效率(如批量保存用户的多项属性)。

mget:批量获取键的值

  • 用法mget key1 key2 ...
  • 示例mget username email → 返回数组["alice", "alice@test.com"](按输入键的顺序排列)
  • 使用场景:批量查询多个键的数据,如同时获取用户的用户名、邮箱、手机号等。

decr:自减数字值(-1)

  • 用法decr key
  • 示例:若stock当前值为10,执行decr stock → 返回9stock的值变为9
  • 使用场景:库存减少、剩余次数扣减等(如商品库存计数)。

setex:设置键值对并指定过期时间(秒)

  • 用法setex key seconds value
  • 示例setex token 300 "abc123" → 设置token的值为"abc123",5 分钟后过期
  • 使用场景:存储临时有效数据(如登录令牌、验证码,自动过期无需手动删除)。

setnx:仅当键不存在时设置键值对

  • 用法setnx key value
    当键不存在时,设置键的值并返回1;若键已存在,不做任何操作并返回0(原子性操作)。
  • 示例
    • lock:order不存在,执行setnx lock:order "1" → 返回1,键lock:order的值被设置为"1"
    • 再次执行相同命令 → 返回0,键的值保持不变
  • 使用场景
    • 分布式锁:确保同一时间只有一个进程操作资源(如秒杀活动中防止超卖,获取锁时用setnx,释放时用del
    • 初始化数据:保证键只被设置一次(如用户首次登录时初始化默认配置)
    • 避免重复任务:防止定时任务并发执行(任务开始前用setnx抢占标识,结束后删除)

incrby:指定步长自增

  • 用法incrby key increment
  • 示例incrby score 5 → 若score当前为80,执行后变为85,返回85
  • 使用场景:需要按固定步长增加的场景(如游戏中给用户加积分,每次加 10 分)。

decrby:指定步长自减

  • 用法decrby key decrement
  • 示例decrby balance 100 → 若balance当前为500,执行后变为400,返回400
  • 使用场景:按固定步长减少数值(如用户消费扣款,每次扣 100 元)。

append:追加字符串

  • 用法append key value
  • 示例:若msg当前值为"hello",执行append msg " world" → 返回11(新字符串长度),msg变为"hello world"
  • 使用场景:动态拼接字符串(如日志记录,不断追加新的日志内容)。

getset:获取旧值并设置新值

  • 用法getset key value
  • 示例:若count当前值为5,执行getset count 10 → 返回"5",同时count的值更新为10
  • 使用场景:原子性地更新计数器并记录旧值,如统计接口调用次数时,同时获取上一次的计数。

strlen:获取字符串长度

  • 用法strlen key
  • 示例strlen msg → 若msg"hello",返回5
  • 使用场景:验证字符串长度(如检查用户输入的昵称是否超过限制)。

getrange:获取字符串指定范围的子串

  • 用法getrange key start end
  • 说明startend为索引(从 0 开始,end-1表示最后一个字符)
  • 示例:若str"abcdef",执行getrange str 1 3 → 返回"bcd"
  • 使用场景:提取字符串中的部分内容(如从完整的日志中截取某段关键信息)。

psetex:设置键值对并指定过期时间(毫秒)

  • 用法psetex key milliseconds value
  • 示例psetex code 5000 "1234" → 设置code的值为"1234",5 秒后过期
  • 使用场景:需要更精确过期时间的临时数据(如秒杀活动中的临时资格码)。

incrbyfloat:自增浮点数

  • 用法incrbyfloat key increment
  • 示例incrbyfloat weight 0.5 → 若weight当前为60.2,执行后变为60.7,返回"60.7"
  • 使用场景:需要处理小数的计数(如商品价格调整、体重变化记录等)。

setrange:替换字符串指定位置的字符

  • 用法setrange key offset value
  • 说明offset为起始位置(从 0 开始),value会覆盖从offset开始的字符
  • 示例:若str当前为"abcdef",执行setrange str 2 "xyz" → 返回6(字符串长度),str变为"abxyzf"
  • 使用场景:部分更新字符串(如修改固定格式的编码中某一段内容)。

哈希

  • 场景描述:存储结构化数据,键值对的集合,适合表示对象,可单独操作对象的字段。
  • 具体示例:
    • 存储用户详细信息(user:100 作为哈希键,nameageemail 作为字段,对应具体值),便于单独更新或获取某字段(如hset user:100 age 25更新年龄)。
    • 购物车(cart:user:100 作为哈希键,商品 ID 为字段,数量为值,hincrby可增减商品数量)。

hset:设置哈希字段的值

  • 用法hset key field value [field value ...]
    一次可设置一个或多个字段值
  • 示例:
    • hset user:1 name "alice" age "25" → 为哈希user:1设置name字段为"alice"age字段为"25"
    • 返回值为成功设置的字段数量(如上述示例返回2
  • 使用场景:存储或更新对象的多个属性(如用户的姓名、年龄、邮箱等)。

hget:获取哈希中指定字段的值

  • 用法hget key field
  • 示例hget user:1 name → 返回哈希user:1name字段的值(如"alice"),若字段不存在返回nil
  • 使用场景:查询对象的单个属性(如获取用户的昵称)。

hgetall:获取哈希中所有字段和值

  • 用法hgetall key
  • 示例hgetall user:1 → 返回数组["name", "alice", "age", "25"](字段和值交替出现)
  • 使用场景:获取对象的完整信息(如查询用户的所有资料)。

hmget:批量获取哈希中多个字段的值

  • 用法hmget key field1 field2 ...
  • 示例hmget user:1 name age → 返回数组["alice", "25"](按输入字段顺序排列)
  • 使用场景:一次性获取对象的多个属性(如同时获取用户的姓名和年龄)。

hincrby:为哈希中指定字段的数值自增指定步长

  • 用法hincrby key field increment
  • 示例:
    • product:100stock字段为50,执行hincrby product:100 stock -5 → 返回45stock变为45
    • 若字段不存在,先初始化为0再自增(如hincrby user:1 score 10,首次执行返回10
  • 使用场景:更新对象的数值型属性(如商品库存增减、用户积分调整)。

hdel:删除哈希中的指定字段

  • 用法hdel key field1 field2 ...
  • 示例hdel user:1 age → 删除user:1中的age字段,返回成功删除的字段数量(如1
  • 使用场景:移除对象的某个属性(如用户注销后删除其手机号字段)。

hexists:检查哈希中是否存在指定字段

  • 用法hexists key field
  • 示例hexists user:1 name → 存在返回1,不存在返回0
  • 使用场景:判断对象是否包含某个属性(如检查用户是否设置了头像)。

hkeys:获取哈希中所有字段名

  • 用法hkeys key
  • 示例hkeys user:1 → 返回数组["name", "age"]
  • 使用场景:获取对象的所有属性名(如遍历用户的所有资料项)。

hvals:获取哈希中所有字段值

  • 用法hvals key
  • 示例hvals user:1 → 返回数组["alice", "25"]
  • 使用场景:获取对象的所有属性值(如收集用户的所有偏好设置值)。

hlen:获取哈希中的字段数量

  • 用法hlen key
  • 示例hlen user:1 → 若user:1nameage两个字段,返回2
  • 使用场景:统计对象的属性数量(如检查商品信息是否完整)。

hincrbyfloat:为哈希中指定字段的浮点数值自增指定步长

  • 用法hincrbyfloat key field increment
  • 示例:若account:1balance字段为100.5,执行hincrbyfloat account:1 balance 20.3 → 返回"120.8"balance变为120.8
  • 使用场景:处理对象的浮点型数值更新(如账户余额的增减)。

hsetnx:仅当哈希中字段不存在时设置其值

  • 用法hsetnx key field value
  • 示例:
    • user:1email字段不存在,执行hsetnx user:1 email "alice@test.com" → 返回1(设置成功)
    • 若字段已存在,返回0(不做修改)
  • 使用场景:确保字段仅被初始化一次(如首次设置用户的注册时间)。

hmset:批量设置哈希字段值(已过时,建议用 hset 替代)

  • 用法hmset key field1 value1 field2 value2 ...
  • 示例hmset user:2 name "bob" gender "male" → 批量设置user:2的字段值
  • 使用场景:批量初始化或更新对象的多个属性(功能与hset一致,推荐优先使用hset)。

列表

  • 场景描述:有序的字符串列表,支持两端插入 / 删除,可作为队列或栈使用。
  • 具体示例:
    • 消息队列(lpush生产消息,rpop消费消息,实现先进先出)。
    • 最新消息列表(如用户动态,lpush添加新动态,lrange获取前 N 条最新动态)。
    • 栈结构(lpush入栈,lpop出栈,实现后进先出)。

lpush:向列表左侧(头部)添加元素

  • 用法lpush key value1 [value2 ...]
    一次可添加一个或多个元素,新元素依次插入到列表头部
  • 示例
    • lpush fruits "apple" "banana" → 向fruits列表左侧添加"apple""banana",列表变为["banana", "apple"]
    • 返回值为添加后列表的长度(如上述示例返回2
  • 使用场景:存储最新数据(如最新评论、最近登录用户,新数据始终在头部)。

rpush:向列表右侧(尾部)添加元素

  • 用法rpush key value1 [value2 ...]
    元素依次插入到列表尾部
  • 示例
    • rpush fruits "orange" → 向fruits列表右侧添加"orange",列表变为["banana", "apple", "orange"]
    • 返回值为添加后列表的长度(如返回3
  • 使用场景:存储有序序列(如消息队列、任务列表,按顺序追加新元素)。

lpop:移除并返回列表左侧(头部)的第一个元素

  • 用法lpop key
  • 示例lpop fruits → 移除并返回"banana",列表变为["apple", "orange"]
  • 使用场景:实现栈(先进后出)或获取最新数据(如处理最新任务)。

rpop:移除并返回列表右侧(尾部)的最后一个元素

  • 用法rpop key
  • 示例rpop fruits → 移除并返回"orange",列表变为["apple"]
  • 使用场景:实现队列(先进先出)或处理最早数据(如消费消息队列的 oldest 消息)。

lrange:获取列表中指定范围的元素

  • 用法
    1
    lrange key start stop
    • startstop为索引(从 0 开始,-1表示最后一个元素)
  • 示例
    • 若列表nums[1, 2, 3, 4, 5],执行lrange nums 1 3 → 返回[2, 3, 4]
    • lrange nums 0 -1 → 返回列表所有元素
  • 使用场景:分页查询列表数据(如获取第 1-10 条评论)。

llen:获取列表的长度

  • 用法llen key
  • 示例llen fruits → 若列表有 3 个元素,返回3
  • 使用场景:统计列表元素数量(如查看未处理任务的总数)。

blpop/brpop:阻塞式移除并返回列表左侧 / 右侧元素

  • 用法
    1
    blpop key1 [key2 ...] timeout
    1
    brpop key1 [key2 ...] timeout
    • 若列表为空,阻塞等待timeout秒(0 表示永久阻塞),直到有元素或超时
  • 示例brpop queue 10 → 若queue为空,阻塞 10 秒;若期间有元素加入,立即返回该元素
  • 使用场景:实现阻塞队列(如消费者等待生产者的消息,减少轮询消耗)。

lindex:获取列表中指定索引的元素

  • 用法lindex key index
  • 示例:若列表fruits["apple", "banana", "orange"],执行lindex fruits 1 → 返回"banana"
  • 使用场景:随机访问列表中的某个元素(如获取第 5 条评论)。

ltrim:保留列表中指定范围的元素,删除其他元素

  • 用法ltrim key start stop
  • 示例
    • 若列表fruits["a", "b", "c", "d", "e"],执行ltrim fruits 1 3 → 保留索引 1-3 的元素,列表变为["b", "c", "d"]
  • 使用场景:限制列表长度(如只保留最新的 100 条日志)。

rpoplpush:从一个列表尾部移除元素并插入到另一个列表头部

  • 用法rpoplpush source destination
  • 示例:若list1[1, 2, 3]list2[4, 5],执行rpoplpush list1 list2 → 移除list1尾部的3,插入list2头部,结果list1[1, 2]list2[3, 4, 5]
  • 使用场景:实现安全的消息队列(处理中的消息暂存到另一个列表,避免意外丢失)。

lrem:删除列表中指定数量的指定元素

  • 用法
    1
    lrem key count value
    • count > 0:从左侧开始删除最多count个值为value的元素
    • count < 0:从右侧开始删除最多count绝对值个值为value的元素
    • count = 0:删除所有值为value的元素
  • 示例:若列表nums[2, 3, 2, 5, 2],执行lrem nums 2 2 → 从左侧删除 2 个值为2的元素,列表变为[3, 5, 2]
  • 使用场景:移除列表中的特定元素(如删除重复的任务记录)。

lset:修改列表中指定索引的元素值

  • 用法lset key index value
  • 示例lset fruits 1 "grape" → 将fruits列表索引 1 的元素改为"grape",列表变为["apple", "grape", "orange"]
  • 使用场景:更新列表中某个位置的元素(如修正评论内容)。

lpushx/rpushx:仅当列表存在时,向左侧 / 右侧添加元素

  • 用法lpushx key value / rpushx key value
  • 示例
    • list3存在,lpushx list3 "x" → 向左侧添加元素,返回新长度
    • list3不存在,返回0(不创建列表)
  • 使用场景:确保只对已存在的列表操作(如仅向已初始化的任务列表添加任务)。

集合

  • 场景描述:无序且元素唯一的集合,支持交集、并集、差集等运算。
  • 具体示例:
    • 标签系统(如文章标签,sadd article:100:tags "java" "redis"smembers获取所有标签)。
    • 好友关系(sadd user:100:friends 200 300存储用户 100 的好友,sinter user:100:friends user:200:friends求共同好友)。
    • 去重(如记录访问过某页面的用户 ID,sadd自动去重,scard获取访问人数)。

sadd:向集合添加一个或多个元素

  • 用法sadd key member1 [member2 ...]
    向指定集合添加元素,若元素已存在则忽略,返回成功添加的元素数量。
  • 示例sadd fruits "apple" "banana" → 向fruits集合添加”apple”和”banana”,返回2(集合变为{"apple", "banana"})。
  • 使用场景:存储不重复的元素集合(如用户标签、已读消息ID、商品分类标签)。

smembers:返回集合中的所有元素

  • 用法smembers key
    返回集合中所有成员,无序(集合本身是无序的)。
  • 示例smembers fruits → 若集合为{"apple", "banana"},返回["apple", "banana"](顺序不固定)。
  • 使用场景:查看集合的全部元素(如展示用户的所有标签、获取某个分类下的所有商品ID)。

sismember:判断元素是否为集合的成员

  • 用法sismember key member
    若元素是集合成员返回1,否则返回0
  • 示例sismember fruits "apple" → 存在返回1,查询”orange”返回0
  • 使用场景:验证元素是否存在于集合中(如检查用户是否拥有某个权限、判断消息是否已读)。

srem:移除集合中的一个或多个元素

  • 用法srem key member1 [member2 ...]
    移除集合中指定的元素,返回成功移除的元素数量(不存在的元素忽略)。
  • 示例srem fruits "banana" → 从fruits集合中移除”banana”,返回1(集合变为{"apple"})。
  • 使用场景:从集合中删除元素(如移除用户的某个标签、删除已过期的消息ID)。

scard:获取集合的元素数量

  • 用法scard key
    返回集合中元素的个数,若集合不存在返回0
  • 示例scard fruits → 若集合有3个元素,返回3
  • 使用场景:统计集合大小(如计算用户标签数量、统计某个分类下的商品总数)。

spop:随机移除并返回集合中的一个或多个元素

  • 用法spop key [count]
    随机移除并返回集合中的count个元素(默认返回1个),若集合为空返回nil
  • 示例spop fruits → 从fruits集合中随机移除一个元素并返回(如”apple”)。
  • 使用场景:随机获取元素(如抽奖、随机推荐商品、随机选择在线用户)。

sinter:计算多个集合的交集

  • 用法sinter key1 key2 [key3 ...]
    返回所有给定集合的交集(同时存在于所有集合中的元素)。
  • 示例sinter set1 set2 → 若set1={"a","b","c"}set2={"b","c","d"},返回["b","c"]
  • 使用场景:获取多个集合的共同元素(如查找同时拥有多个标签的用户、计算用户共同关注的好友)。

sunion:计算多个集合的并集

  • 用法sunion key1 key2 [key3 ...]
    返回所有给定集合的并集(至少存在于一个集合中的元素)。
  • 示例sunion set1 set2 → 若set1={"a","b"}set2={"b","c"},返回["a","b","c"]
  • 使用场景:合并多个集合的元素(如汇总多个分类下的商品ID、合并用户的多个标签列表)。

sdiff:计算多个集合的差集

  • 用法sdiff key1 key2 [key3 ...]
    返回第一个集合与其他集合的差集(存在于第一个集合但不存在于其他集合的元素)。
  • 示例sdiff set1 set2 → 若set1={"a","b","c"}set2={"b","d"},返回["a","c"]
  • 使用场景:获取两个集合的差异元素(如查找已读但未回复的消息ID、对比两个用户标签的差异)。

smove:将元素从一个集合移动到另一个集合

  • 用法smove source destination member
    若元素在源集合中存在,移动到目标集合并返回1;否则返回0
  • 示例smove set1 set2 "a" → 将set1中的”a”移动到set2,返回1
  • 使用场景:元素在集合间的转移(如将用户从”普通会员”集合移动到”VIP会员”集合)。

srandmember:随机返回集合中的一个或多个元素(不删除)

  • 用法srandmember key [count]
    随机返回集合中的count个元素(默认1个),元素仍保留在集合中。
  • 示例srandmember fruits 2 → 从fruits集合中随机返回2个元素(如["apple", "orange"])。
  • 使用场景:随机查看元素但不删除(如随机展示推荐内容、随机抽查在线用户)。

sinterstore:计算多个集合的交集并存储到新集合

  • 用法sinterstore destination key1 key2 [key3 ...]
    计算给定集合的交集,并将结果存储到destination集合,返回交集元素数量。
  • 示例sinterstore inter_set set1 set2 → 将set1set2的交集存储到inter_set,返回交集大小。
  • 使用场景:需要保存交集结果供后续使用(如缓存用户共同关注的好友列表)。

sunionstore:计算多个集合的并集并存储到新集合

  • 用法sunionstore destination key1 key2 [key3 ...]
    计算给定集合的并集,并将结果存储到destination集合,返回并集元素数量。
  • 示例sunionstore union_set set1 set2 → 将set1set2的并集存储到union_set,返回并集大小。
  • 使用场景:需要保存并集结果供后续使用(如缓存多个分类合并后的商品ID列表)。

sdiffstore:计算多个集合的差集并存储到新集合

  • 用法sdiffstore destination key1 key2 [key3 ...]
    计算第一个集合与其他集合的差集,并将结果存储到destination集合,返回差集元素数量。
  • 示例sdiffstore diff_set set1 set2 → 将set1set2的差集存储到diff_set,返回差集大小。
  • 使用场景:需要保存差集结果供后续使用(如缓存未回复的消息ID列表)。

有序集合

  • 场景描述:元素唯一且有序(通过分数排序),支持按分数范围或排名操作。
    • 具体示例 :
    • 排行榜(如游戏积分排名,zadd rank:game 1000 "user1" 800 "user2"zrevrange获取前 10 名高分用户)。
    • 带权重的消息队列(分数设为时间戳,zrangebyscore按时间顺序消费)。
    • 范围查询(如根据用户积分区间筛选用户,zrangebyscore rank:game 500 1000)。

zadd:向有序集合添加一个或多个成员(元素 - 分数对)

  • 用法zadd key [nx|xx] [ch] [incr] score1 member1 [score2 member2 ...]
    • nx:仅添加不存在的成员;xx:仅更新已存在的成员;ch:返回修改的成员数量(新增 + 更新);incr:将指定成员的分数增加,类似zincrby
  • 示例zadd ranking 90 "alice" 85 "bob" → 向ranking集合添加成员alice(分数90)、bob(分数85),返回添加的成员数2
  • 使用场景:构建排行榜(如学生成绩排名、游戏积分排行)、存储带权重的元素(如任务优先级)

zrange:按分数升序获取有序集合中指定范围的成员

  • 用法zrange key start stop [withscores]
    • start/stop为索引(0开始,-1表示最后一个);withscores:同时返回成员分数
  • 示例zrange ranking 0 1 withscores → 若集合有alice(90)bob(85)charlie(95),返回["bob", "85", "alice", "90"]
  • 使用场景:获取排名靠前的元素(如查看积分前10的用户)、分页查询升序排列的成员

zrevrange:按分数降序获取有序集合中指定范围的成员

  • 用法zrevrange key start stop [withscores]
    • zrange类似,仅排序方式为降序(分数从高到低)
  • 示例zrevrange ranking 0 1 withscores → 针对上述ranking集合,返回["charlie", "95", "alice", "90"]
  • 使用场景:获取排行榜前三名(如游戏段位榜Top3)、按权重从高到低展示元素

zcard:获取有序集合的成员总数

  • 用法zcard key
  • 示例zcard ranking → 若ranking有3个成员,返回3
  • 使用场景:统计集合规模(如查看参与排名的用户总数)

zscore:获取有序集合中指定成员的分数

  • 用法zscore key member
  • 示例zscore ranking "alice" → 返回"90"(分数以字符串形式返回)
  • 使用场景:查询单个成员的具体分数(如查看某用户的当前积分)

zrank:获取指定成员在有序集合中按分数升序的排名(排名从0开始)

  • 用法zrank key member
  • 示例zrank ranking "bob" → 若bob分数85为最低,返回0
  • 使用场景:查询成员的升序排名(如某学生在班级的成绩排名,从低到高)

zrevrank:获取指定成员在有序集合中按分数降序的排名(排名从0开始)

  • 用法zrevrank key member
  • 示例zrevrank ranking "charlie" → 若charlie分数95为最高,返回0
  • 使用场景:查询成员的降序排名(如某用户在游戏中的段位排名,从高到低)

zrem:删除有序集合中一个或多个成员

  • 用法zrem key member1 [member2 ...]
  • 示例zrem ranking "bob" → 从ranking中删除bob,返回删除的成员数1
  • 使用场景:移除不再参与排名的成员(如用户注销账号,从积分榜中删除)

zincrby:为有序集合中指定成员的分数增加指定值(可正可负)

  • 用法zincrby key increment member
  • 示例zincrby ranking 5 "alice"alice的分数从90增加到95,返回更新后的分数"95"
  • 使用场景:动态更新成员分数(如用户完成任务后增加积分、扣除违规用户的分数)

zrangebyscore:按分数范围(升序)获取有序集合中的成员

  • 用法zrangebyscore key min max [withscores] [limit offset count]
    • min/max:分数范围(支持(min表示不包含min,+inf表示正无穷);limit:限制返回数量(类似分页)
  • 示例zrangebyscore ranking 80 90 limit 0 2 → 返回分数80-90的前2个成员
  • 使用场景:筛选特定分数段的成员(如查询积分在80-100分的用户)

zrevrangebyscore:按分数范围(降序)获取有序集合中的成员

  • 用法zrevrangebyscore key max min [withscores] [limit offset count]
    • zrangebyscore类似,排序方式为降序
  • 示例zrevrangebyscore ranking 90 80 → 按降序返回分数80-90的成员
  • 使用场景:按分数段降序筛选成员(如查询积分80-100分的用户,从高到低排列)

zcount:统计有序集合中分数在指定范围的成员数量

  • 用法zcount key min max
  • 示例zcount ranking 80 90 → 若分数80-90有2个成员,返回2
  • 使用场景:统计特定分数段的成员数(如查看及格分数以上的用户数量)

zremrangebyscore:删除有序集合中分数在指定范围的成员

  • 用法zremrangebyscore key min max
  • 示例zremrangebyscore ranking 0 60 → 删除分数0-60的成员,返回删除的数量
  • 使用场景:清理无效成员(如移除积分过低的不活跃用户)

zremrangebyrank:删除有序集合中按升序排名在指定范围的成员

  • 用法zremrangebyrank key start stop
  • 示例zremrangebyrank ranking 0 1 → 删除升序排名0-1的成员(分数最低的2个)
  • 使用场景:淘汰排名靠后的成员(如移除积分最低的10%用户)

通用命令

exists

  • 用法exists key1 [key2 ...],检查一个或多个键是否存在,返回存在的键的数量
  • 示例:若存在键user:100product:200,执行exists user:100 product:200返回2;检查不存在的键order:300,返回0
  • 使用场景:判断键是否存在(如验证用户是否已创建、检查缓存是否有效)

del

  • 用法del key1 [key2 ...],删除一个或多个键,返回被删除键的数量
  • 示例:删除键temp:datacache:info,执行del temp:data cache:info,若两个键都存在则返回2
  • 使用场景:清理过期或无用数据(如删除用户注销后的相关缓存、移除临时生成的键)

type

  • 用法type key,返回键所存储值的数据类型(string、list、set、zset、hash等)
  • 示例:若键fruits是集合类型,执行type fruits返回set;键user:info是哈希类型,返回hash
  • 使用场景:查看键的类型以确定后续操作(如避免对集合键使用列表命令)

keys

  • 用法keys pattern,根据通配符模式匹配并返回所有符合条件的键(*匹配任意字符,?匹配单个字符)
  • 示例:匹配所有以user:开头的键,执行keys user:*返回["user:100", "user:101"];匹配log后带一个字符的键,keys log?返回["log1", "log2"]
  • 使用场景:调试时查找特定模式的键(注意:生产环境慎用,可能阻塞服务)

expire

  • 用法expire key seconds,为键设置过期时间(单位:秒),返回1表示设置成功,0表示键不存在
  • 示例:为键session:abc设置1800秒(30分钟)过期时间,执行expire session:abc 1800返回1
  • 使用场景:设置临时数据的有效期(如用户会话、验证码、临时缓存)

ttl

  • 用法ttl key,返回键的剩余过期时间(单位:秒),-1表示永不过期,-2表示键不存在
  • 示例:键code:123还有30秒过期,执行ttl code:123返回30;永不过期的键返回-1
  • 使用场景:查看键的剩余有效期(如判断验证码是否过期、监控临时数据的存活状态)

persist

  • 用法persist key,移除键的过期时间,使其永不过期,返回1表示成功,0表示键不存在或无过期时间
  • 示例:为已设置过期时间的键temp:config移除过期时间,执行persist temp:config返回1
  • 使用场景:将临时数据转为永久数据(如用户将临时草稿保存为正式内容)

rename

  • 用法rename key newkey,将键重命名为新键,若新键已存在则覆盖
  • 示例:将键old:name重命名为new:name,执行rename old:name new:name,若成功无返回值(redis-cli中返回ok
  • 使用场景:批量调整键名格式(如数据迁移时重命名旧版本键名)

dbsize

  • 用法dbsize,返回当前数据库中键的总数
  • 示例:当前数据库有100个键,执行dbsize返回100
  • 使用场景:统计数据库键数量(如监控数据量增长、判断是否需要清理冗余键)

flushdb

  • 用法flushdb,删除当前数据库中的所有键
  • 示例:执行flushdb后,当前数据库中所有键被清空,返回ok
  • 使用场景:测试环境重置数据、清空某个业务模块的所有缓存

flushall

  • 用法flushall,删除所有数据库中的所有键
  • 示例:执行flushall后,redis所有数据库的键均被清空,返回ok
  • 使用场景:完全重置redis数据(生产环境极度慎用,通常仅用于测试环境)

select

  • 用法select dbindex,切换到指定索引的数据库(默认0-15共16个数据库)
  • 示例:切换到索引为1的数据库,执行select 1返回ok
  • 使用场景:按业务拆分数据到不同数据库(如将用户数据存到db0,商品数据存到db1)

move

  • 用法move key dbindex,将当前数据库的键移动到指定索引的数据库,返回1成功,0失败(键不存在或目标库已存在该键)
  • 示例:将当前库的键item:5移动到db2,执行move item:5 2返回1
  • 使用场景:调整键的存储数据库(如将错误存入db0的键移到正确的db3)

randomkey

  • 用法randomkey,随机返回当前数据库中的一个键,若数据库为空返回nil
  • 示例:当前库有键abc,执行randomkey可能返回b
  • 使用场景:随机获取数据(如随机推荐一个商品、抽奖时随机选取一个用户)

expireat

  • 用法expireat key timestamp,为键设置过期的unix时间戳(秒级),返回1成功,0失败
  • 示例:让键event:party在2025年1月1日0点(时间戳1735689600)过期,执行expireat event:party 1735689600返回1
  • 使用场景:设置键在具体时间点过期(如活动结束后自动失效的缓存)