Redis学习笔记
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→ 返回4,num的值变为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"→ 同时设置username和email的值 - 使用场景:一次性存储多个关联数据,减少网络请求次数,提高效率(如批量保存用户的多项属性)。
mget:批量获取键的值
- 用法:
mget key1 key2 ... - 示例:
mget username email→ 返回数组["alice", "alice@test.com"](按输入键的顺序排列) - 使用场景:批量查询多个键的数据,如同时获取用户的用户名、邮箱、手机号等。
decr:自减数字值(-1)
- 用法:
decr key - 示例:若
stock当前值为10,执行decr stock→ 返回9,stock的值变为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 - 说明:
start和end为索引(从 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作为哈希键,name、age、email作为字段,对应具体值),便于单独更新或获取某字段(如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:1中name字段的值(如"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:100的stock字段为50,执行hincrby product:100 stock -5→ 返回45,stock变为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:1有name和age两个字段,返回2 - 使用场景:统计对象的属性数量(如检查商品信息是否完整)。
hincrbyfloat:为哈希中指定字段的浮点数值自增指定步长
- 用法:
hincrbyfloat key field increment - 示例:若
account:1的balance字段为100.5,执行hincrbyfloat account:1 balance 20.3→ 返回"120.8",balance变为120.8 - 使用场景:处理对象的浮点型数值更新(如账户余额的增减)。
hsetnx:仅当哈希中字段不存在时设置其值
- 用法:
hsetnx key field value - 示例:
- 若
user:1中email字段不存在,执行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
start和stop为索引(从 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→ 将set1和set2的交集存储到inter_set,返回交集大小。 - 使用场景:需要保存交集结果供后续使用(如缓存用户共同关注的好友列表)。
sunionstore:计算多个集合的并集并存储到新集合
- 用法:
sunionstore destination key1 key2 [key3 ...]
计算给定集合的并集,并将结果存储到destination集合,返回并集元素数量。 - 示例:
sunionstore union_set set1 set2→ 将set1和set2的并集存储到union_set,返回并集大小。 - 使用场景:需要保存并集结果供后续使用(如缓存多个分类合并后的商品ID列表)。
sdiffstore:计算多个集合的差集并存储到新集合
- 用法:
sdiffstore destination key1 key2 [key3 ...]
计算第一个集合与其他集合的差集,并将结果存储到destination集合,返回差集元素数量。 - 示例:
sdiffstore diff_set set1 set2→ 将set1与set2的差集存储到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:100和product:200,执行exists user:100 product:200返回2;检查不存在的键order:300,返回0 - 使用场景:判断键是否存在(如验证用户是否已创建、检查缓存是否有效)
del
- 用法:
del key1 [key2 ...],删除一个或多个键,返回被删除键的数量 - 示例:删除键
temp:data和cache: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 - 示例:当前库有键
a、b、c,执行randomkey可能返回b - 使用场景:随机获取数据(如随机推荐一个商品、抽奖时随机选取一个用户)
expireat
- 用法:
expireat key timestamp,为键设置过期的unix时间戳(秒级),返回1成功,0失败 - 示例:让键
event:party在2025年1月1日0点(时间戳1735689600)过期,执行expireat event:party 1735689600返回1 - 使用场景:设置键在具体时间点过期(如活动结束后自动失效的缓存)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 TouHouQing's Blog!
评论



