Redis面试——常用命令

一、String

(1)设置值相关命令

1.1.1 SET

  1. 功能:设置一个键值对,如果键已存在则覆盖旧值
  2. 语法
    SET key value [EX seconds] [PX milliseconds] [NX|XX]
    
    EX seconds:设置键的过期时间为 seconds 秒
    PX milliseconds:设置键的过期时间为 milliseconds 毫秒
    NX:仅当键不存在时设置
    XX:仅当键已存在时设置
  3. 示例
    127.0.0.1:6379> SET mykey "Hello"
    OK
  4. 输出解释:OK 表示设置成功

1.1.2 SETNX

  1. 功能:仅当键不存在时设置键值对
  2. 语法
    SETNX key value
  3. 示例
    127.0.0.1:6379> SETNX mykey "World"
    (integer) 0
  4. 输出解释:因为 mykey 已经存在,所以返回 0 表示设置失败

1.1.3 SETEX

  1. 功能:设置键值对并同时设置过期时间(以秒为单位)
  2. 语法
    SETEX key seconds value
  3. 示例
    127.0.0.1:6379> SETEX mykey2 60 "Temporary Value"
    OK
  4. 输出解释:OK 表示设置成功,mykey2 将在 60 秒后过期

1.1.4 PSETEX

  1. 功能:设置键值对并同时设置过期时间(以毫秒为单位)
  2. 语法
    PSETEX key milliseconds value
  3. 示例
    127.0.0.1:6379> PSETEX mykey3 10000 "Short - lived Value"
    OK
  4. 输出解释:OK 表示设置成功,mykey3 将在 10000 毫秒(即 10 秒)后过期

1.1.5 MSET

  1. 功能:同时设置多个键值对
  2. 语法
    MSET key1 value1 [key2 value2 ...]
  3. 示例
    127.0.0.1:6379> MSET key1 "value1" key2 "value2"
    OK
  4. 输出解释:OK 表示所有键值对都设置成功

1.1.6 MSETNX

  1. 功能:仅当所有给定键都不存在时,同时设置多个键值对。如果有一个键已存在,则所有键都不会被设置
  2. 语法
    MSETNX key1 value1 [key2 value2 ...]
  3. 示例
    127.0.0.1:6379> MSETNX key3 "value3" key4 "value4"
    (integer) 1
  4. 输出解释:返回 1 表示所有键都不存在,设置成功

(2)获取值相关命令

1.2.1 GET

  1. 功能:获取指定键的值。如果键不存在,返回 (nil)
  2. 语法
    GET key
  3. 示例
    127.0.0.1:6379> GET mykey
    "Hello"
  4. 输出解释:返回键 mykey 对应的值 "Hello"

1.2.2 MGET

  1. 功能:同时获取多个键的值。如果某个键不存在,对应位置返回 (nil)
  2. 语法
    MGET key1 [key2 ...]
  3. 示例
    127.0.0.1:6379> MGET key1 key2 key3
    1) "value1"
    2) "value2"
    3) "value3"
  4. 输出解释:依次返回 key1、key2、key3 的值

(3)数值操作相关命令

1.3.1 INCR

  1. 功能:将键的值递增 1。如果键不存在,则先将其值初始化为 0 再进行递增。键的值必须是整数
  2. 语法
    INCR key
  3. 示例
    127.0.0.1:6379> SET counter 10
    OK
    127.0.0.1:6379> INCR counter
    (integer) 11
  4. 输出解释:counter 的值从 10 递增到 11

1.3.2 DECR

  1. 功能:将键的值递减 1。如果键不存在,则先将其值初始化为 0 再进行递减。键的值必须是整数
  2. 语法
    DECR key
  3. 示例
    127.0.0.1:6379> DECR counter
    (integer) 10
  4. 输出解释:counter 的值从 11 递减到 10

1.3.3 INCRBY

  1. 功能:将键的值增加指定的整数。如果键不存在,则先将其值初始化为 0 再进行增加
  2. 语法
    INCRBY key increment
  3. 示例
    127.0.0.1:6379> INCRBY counter 5
    (integer) 15
  4. 输出解释:counter 的值增加 5 后变为 15

1.3.4 DECRBY

  1. 功能:将键的值减少指定的整数。如果键不存在,则先将其值初始化为 0 再进行减少
  2. 语法
    DECRBY key decrement
  3. 示例
    127.0.0.1:6379> DECRBY counter 3
    (integer) 12
  4. 输出解释:counter 的值减少 3 后变为 12

1.3.5 INCRBYFLOAT

  1. 功能:将键的值增加指定的浮点数。如果键不存在,则先将其值初始化为 0 再进行增加
  2. 语法
    INCRBYFLOAT key increment
  3. 示例
    127.0.0.1:6379> SET float_counter 2.5
    OK
    127.0.0.1:6379> INCRBYFLOAT float_counter 1.5
    "4"
  4. 输出解释:float_counter 的值从 2.5 增加 1.5 后变为 4

(4)字符串操作相关命令

1.4.1 APPEND

  1. 功能:如果键已经存在,将指定的值追加到键的现有值的末尾;如果键不存在,则等同于 SET 命令
  2. 语法
    APPEND key value
  3. 示例
    127.0.0.1:6379> SET message "Hello"
    OK
    127.0.0.1:6379> APPEND message " World"
    (integer) 11
  4. 输出解释:返回追加后字符串的长度,此时 message 的值为 "Hello World"

1.4.2 STRLEN

  1. 功能:返回键对应值的字符串长度。如果键不存在,返回 0
  2. 语法
    STRLEN key
  3. 示例
    127.0.0.1:6379> STRLEN message
    (integer) 11
  4. 输出解释:message 的值 "Hello World" 长度为 11

1.4.3 GETRANGE

  1. 功能:返回键对应值的子字符串,通过指定起始和结束索引。索引从 0 开始,负数表示从字符串末尾开始计数
  2. 语法
    GETRANGE key start end
  3. 示例
    127.0.0.1:6379> GETRANGE message 0 4
    "Hello"
  4. 输出解释:返回 message 从索引 0 到 4 的子字符串 "Hello"

1.4.4 SETRANGE

  1. 功能:从指定的偏移量开始,用指定的值覆盖键对应值的一部分。如果偏移量超过了原字符串的长度,中间会用 0 字节填充
  2. 语法
    SETRANGE key offset value
  3. 示例
    127.0.0.1:6379> SETRANGE message 6 "Redis"
    (integer) 11
    127.0.0.1:6379> GET message
    "Hello Redis"
  4. 输出解释:返回修改后字符串的长度,message 的值被修改为 "Hello Redis"

二、List

(1)插入元素命令

2.1.1 LPUSH

  1. 功能:将一个或多个值插入到列表的头部(左侧)。若列表不存在,会先创建一个空列表再插入
  2. 语法
    LPUSH key value [value ...]
  3. 示例
    127.0.0.1:6379> LPUSH mylist "apple"
    (integer) 1
    127.0.0.1:6379> LPUSH mylist "banana" "cherry"
    (integer) 3
  4. 输出解释:第一次插入后列表长度为 1,第二次插入两个值后列表长度变为 3。当前列表 mylist 元素顺序为 ["cherry", "banana", "apple"]

2.1.2 RPUSH

  1. 功能:将一个或多个值插入到列表的尾部(右侧)。若列表不存在,会先创建空列表再插入
  2. 语法
    RPUSH key value [value ...]
  3. 示例
    127.0.0.1:6379> RPUSH mylist "date"
    (integer) 4
  4. 输出解释:插入后列表长度变为 4,此时列表 mylist 元素顺序为 ["cherry", "banana", "apple", "date"]

2.1.3 LPUSHX

  1. 功能:仅当列表存在时,将一个值插入到列表的头部
  2. 语法
    LPUSHX key value
  3. 示例
    127.0.0.1:6379> LPUSHX mylist "elderberry"
    (integer) 5
  4. 输出解释:由于 mylist 存在,插入成功,列表长度变为 5,元素顺序为 ["elderberry", "cherry", "banana", "apple", "date"]

2.1.4 RPUSHX

  1. 功能:仅当列表存在时,将一个值插入到列表的尾部
  2. 语法
    RPUSHX key value
  3. 示例
    127.0.0.1:6379> RPUSHX mylist "fig"
    (integer) 6
  4. 输出解释:因为 mylist 存在,插入成功,列表长度变为 6,元素顺序为 ["elderberry", "cherry", "banana", "apple", "date", "fig"]

(2)移除元素命令

2.2.1 LPOP

  1. 功能:移除并返回列表的第一个元素(头部元素)。若列表为空,返回 (nil)
  2. 语法
    LPOP key
  3. 示例
    127.0.0.1:6379> LPOP mylist
    "elderberry"
  4. 输出解释:移除并返回了列表 mylist 的头部元素 "elderberry",此时列表元素顺序为 ["cherry", "banana", "apple", "date", "fig"]

2.2.2 RPOP

  1. 功能:移除并返回列表的最后一个元素(尾部元素)。若列表为空,返回 (nil)
  2. 语法
    RPOP key
  3. 示例
    127.0.0.1:6379> RPOP mylist
    "fig"
  4. 输出解释:移除并返回了列表 mylist 的尾部元素 "fig",此时列表元素顺序为 ["cherry", "banana", "apple", "date"]

(3)获取元素命令

2.3.1 LRANGE

  1. 功能:返回列表中指定范围的元素。索引从 0 开始,负数表示从列表末尾开始计数,如 -1 表示最后一个元素
  2. 语法
    LRANGE key start stop
  3. 示例
    127.0.0.1:6379> LRANGE mylist 0 -1
    1) "cherry"
    2) "banana"
    3) "apple"
    4) "date"
  4. 输出解释:返回了列表 mylist 中从索引 0 到最后一个元素的所有元素

2.3.2 LINDEX

  1. 功能:返回列表中指定索引位置的元素。若索引超出列表范围,返回 (nil)
  2. 语法
    LINDEX key index
  3. 示例
    127.0.0.1:6379> LINDEX mylist 2
    "apple"
  4. 输出解释:返回了列表 mylist 中索引为 2 的元素 "apple"

(4)列表长度命令

2.4.1 LLEN

  1. 功能:返回列表的长度。若列表不存在,返回 0
  2. 语法
    LLEN key
  3. 示例
    127.0.0.1:6379> LLEN mylist
    (integer) 4
  4. 输出解释:列表 mylist 的长度为 4

(5)列表修剪命令

2.5.1 LTRIM

  1. 功能:对列表进行修剪,只保留指定范围内的元素,其他元素会被删除
  2. 语法
    LTRIM key start stop
  3. 示例
    127.0.0.1:6379> LTRIM mylist 1 2
    OK
    127.0.0.1:6379> LRANGE mylist 0 -1
    1) "banana"
    2) "apple"
  4. 输出解释:保留了列表 mylist 中索引 1 到 2 的元素,删除了其他元素。修剪后列表元素顺序为 ["banana", "apple"]

(6)阻塞式弹出命令

2.6.1 BLPOP

  1. 功能:阻塞式地从一个或多个列表的头部弹出元素。若所有列表都为空,客户端会被阻塞,直到有元素被插入到任何一个列表中或者达到指定的超时时间
  2. 语法
    BLPOP key [key ...] timeout
  3. 示例:假设当前有两个列表 list1 为空,list2 有元素 ["item1"]
    127.0.0.1:6379> BLPOP list1 list2 10
    1) "list2"
    2) "item1"
  4. 输出解释:客户端从 list2 中弹出了头部元素 "item1",因为 list1 为空,list2 有元素。若两个列表都为空,客户端会阻塞最多 10 秒

2.6.2 BRPOP

  1. 功能:阻塞式地从一个或多个列表的尾部弹出元素。若所有列表都为空,客户端会被阻塞,直到有元素被插入到任何一个列表中或者达到指定的超时时间
  2. 语法
    BRPOP key [key ...] timeout
  3. 示例:与 BLPOP 类似,只是从尾部弹出元素

(7)列表元素移动命令

2.7.1 RPOPLPUSH

  1. 功能:移除列表的最后一个元素,并将其插入到另一个列表的头部
  2. 语法
    RPOPLPUSH source destination
  3. 示例
    127.0.0.1:6379> RPOPLPUSH mylist anotherlist
    "apple"
  4. 输出解释:将列表 mylist 的尾部元素 "apple" 移除,并插入到列表 anotherlist 的头部

2.7.2 BRPOPLPUSH

  1. 功能:阻塞式地从一个列表的尾部弹出元素,并将其插入到另一个列表的头部。若源列表为空,客户端会被阻塞,直到有元素被插入到源列表中或者达到指定的超时时间
  2. 语法
    BRPOPLPUSH source destination timeout
  3. 示例:与 RPOPLPUSH 类似,但具有阻塞功能

三、Hash

(1)设置哈希字段

3.1.1 HSET

  1. 功能:为哈希表中的一个或多个字段设置值。如果哈希表不存在,会创建一个新的哈希表;如果字段已存在,会覆盖旧值
  2. 语法
    HSET key field value [field value ...]
  3. 示例
    127.0.0.1:6379> HSET user:1 name "Alice" age 25
    (integer) 2
  4. 输出解释

3.1.2 HSETNX

  1. 功能:仅当字段不存在时,为哈希表中的字段设置值
  2. 语法
    HSETNX key field value
  3. 示例
    127.0.0.1:6379> HSETNX user:1 email "alice@example.com"
    (integer) 1
    127.0.0.1:6379> HSETNX user:1 name "Bob"
    (integer) 0
  4. 输出解释:第一次执行 HSETNX 时,email 字段不存在,设置成功,返回 1;第二次执行时,name 字段已存在,设置失败,返回 0

(2)获取哈希字段的值

3.2.1 HGET

  1. 功能:获取哈希表中指定字段的值。如果字段不存在,返回 (nil)
  2. 语法
    HGET key field
  3. 示例
    127.0.0.1:6379> HGET user:1 name
    "Alice"
  4. 输出解释:返回哈希表 user:1 中 name 字段的值 "Alice"

3.2.2 HMGET

  1. 功能:获取哈希表中一个或多个字段的值。如果某个字段不存在,对应位置返回 (nil)
  2. 语法
    HMGET key field [field ...]
  3. 示例
    127.0.0.1:6379> HMGET user:1 name age email
    1) "Alice"
    2) "25"
    3) "alice@example.com"
  4. 输出解释:依次返回 name、age、email 字段的值

3.2.3 HGETALL

  1. 功能:获取哈希表中所有的字段和值。返回的结果是字段和值交替出现
  2. 语法
    HGETALL key
  3. 示例
    127.0.0.1:6379> HGETALL user:1
    1) "name"
    2) "Alice"
    3) "age"
    4) "25"
    5) "email"
    6) "alice@example.com"
  4. 输出解释:返回哈希表 user:1 中所有的字段和对应的值

(3)删除哈希字段

3.3.1 HDEL

  1. 功能:删除哈希表中一个或多个字段。返回被删除字段的数量
  2. 语法
    HDEL key field [field ...]
  3. 示例
    127.0.0.1:6379> HDEL user:1 email
    (integer) 1
  4. 输出解释:成功删除了 user:1 哈希表中的 email 字段,返回 1

(4)检查哈希字段是否存在

3.4.1 HEXISTS

  1. 功能:检查哈希表中指定字段是否存在。如果存在,返回 1;否则返回 0
  2. 语法
    HEXISTS key field
  3. 示例
    127.0.0.1:6379> HEXISTS user:1 name
    (integer) 1
    127.0.0.1:6379> HEXISTS user:1 email
    (integer) 0
  4. 输出解释:name 字段存在,返回 1;email 字段已被删除,返回 0

(5)获取哈希表的字段数量

3.5.1 HLEN

  1. 功能:返回哈希表中字段的数量。如果哈希表不存在,返回 0
  2. 语法
    HLEN key
  3. 示例
    127.0.0.1:6379> HLEN user:1
    (integer) 2
  4. 输出解释:哈希表 user:1 中目前有 name 和 age 两个字段,所以返回 2

(6)获取哈希表的所有字段或所有值

3.6.1 HKEYS

  1. 功能:返回哈希表中所有的字段
  2. 语法
    HKEYS key
  3. 示例
    127.0.0.1:6379> HKEYS user:1
    1) "name"
    2) "age"
  4. 输出解释:返回哈希表 user:1 中所有的字段名

3.6.2 HVALS

  1. 功能:返回哈希表中所有的值
  2. 语法
    HVALS key
  3. 示例
    127.0.0.1:6379> HVALS user:1
    1) "Alice"
    2) "25"
  4. 输出解释:返回哈希表 user:1 中所有字段对应的值

(7)数值操作

3.7.1 HINCRBY

  1. 功能:将哈希表中指定字段的值增加指定的整数。如果字段不存在,会先将其值初始化为 0 再进行增加
  2. 语法
    HINCRBY key field increment
  3. 示例
    127.0.0.1:6379> HINCRBY user:1 age 5
    (integer) 30
  4. 输出解释:将 user:1 哈希表中 age 字段的值增加 5,新的值为 30

3.7.2 HINCRBYFLOAT

  1. 功能:将哈希表中指定字段的值增加指定的浮点数。如果字段不存在,会先将其值初始化为 0 再进行增加
  2. 语法
    HINCRBYFLOAT key field increment
  3. 示例:假设 user:1 哈希表中有一个 score 字段,值为 80.5
    127.0.0.1:6379> HINCRBYFLOAT user:1 score 5.5
    "86"
  4. 输出解释:将 user:1 哈希表中 score 字段的值增加 5.5,新的值为 86

四、Set

(1)添加元素

4.1.1 SADD

  1. 功能:向集合中添加一个或多个元素。如果元素已经存在于集合中,则忽略该元素;如果集合不存在,则创建一个新集合
  2. 语法
    SADD key member [member ...]
  3. 示例
    127.0.0.1:6379> SADD myset "apple" "banana" "cherry"
    (integer) 3
  4. 输出解释:返回成功添加到集合中的元素数量。这里添加了三个新元素,所以返回 3

(2)移除元素

4.2.1 SREM

  1. 功能:从集合中移除一个或多个元素。如果元素不存在于集合中,则忽略该元素
  2. 语法
    SREM key member [member ...]
  3. 示例
    127.0.0.1:6379> SREM myset "banana"
    (integer) 1
  4. 输出解释:返回成功从集合中移除的元素数量。这里移除了 "banana" 元素,所以返回 1

(3)获取集合中的所有元素

4.3.1 SMEMBERS

  1. 功能:返回集合中的所有元素
  2. 语法
    SMEMBERS key
  3. 示例
    127.0.0.1:6379> SMEMBERS myset
    1) "apple"
    2) "cherry"
  4. 输出解释:返回集合 myset 中的所有元素

(4)检查元素是否存在于集合中

4.4.1 SISMEMBER

  1. 功能:检查指定元素是否存在于集合中。如果存在,返回 1;否则返回 0
  2. 语法
    SISMEMBER key member
  3. 示例
    127.0.0.1:6379> SISMEMBER myset "apple"
    (integer) 1
    127.0.0.1:6379> SISMEMBER myset "banana"
    (integer) 0
  4. 输出解释:"apple" 存在于集合中,返回 1;"banana" 已被移除,不存在于集合中,返回 0

(5)获取集合的元素数量

4.5.1 SCARD

  1. 功能:返回集合中的元素数量。如果集合不存在,返回 0
  2. 语法
    SCARD key
  3. 示例
    127.0.0.1:6379> SCARD myset
    (integer) 2
  4. 输出解释:集合 myset 中目前有两个元素,所以返回 2

(6)集合运算

4.6.1 SINTER

  1. 功能:返回多个集合的交集,即同时存在于所有集合中的元素
  2. 语法
    SINTER key [key ...]
  3. 示例
    127.0.0.1:6379> SADD set1 "apple" "banana" "cherry"
    (integer) 3
    127.0.0.1:6379> SADD set2 "apple" "date"
    (integer) 2
    127.0.0.1:6379> SINTER set1 set2
    1) "apple"
  4. 输出解释:集合 set1 和 set2 的交集只有 "apple",所以返回该元素

4.6.2 SUNION

  1. 功能:返回多个集合的并集,即包含所有集合中的所有元素
  2. 语法
    SUNION key [key ...]
  3. 示例
    127.0.0.1:6379> SUNION set1 set2
    1) "apple"
    2) "banana"
    3) "cherry"
    4) "date"
  4. 输出解释:集合 set1 和 set2 的并集包含 "apple"、"banana"、"cherry" 和 "date",所以返回这些元素

4.6.3 SDIFF

  1. 功能:返回多个集合的差集,即存在于第一个集合但不存在于其他集合中的元素
  2. 语法
    SDIFF key [key ...]
  3. 示例
    127.0.0.1:6379> SDIFF set1 set2
    1) "banana"
    2) "cherry"
  4. 输出解释:集合 set1 中存在但集合 set2 中不存在的元素是 "banana" 和 "cherry",所以返回这两个元素

(7)随机获取元素

4.7.1 SRANDMEMBER

  1. 功能:随机返回集合中的一个或多个元素。如果不指定数量,则默认返回一个元素;如果指定的数量为正数,则返回不重复的元素;如果指定的数量为负数,则可能返回重复的元素
  2. 语法
    SRANDMEMBER key [count]
  3. 示例
    127.0.0.1:6379> SRANDMEMBER myset
    "apple"
    127.0.0.1:6379> SRANDMEMBER myset 2
    1) "apple"
    2) "cherry"
  4. 输出解释:第一次调用随机返回了 "apple";第二次调用指定返回两个元素,返回了 "apple" 和 "cherry"

(8)随机移除元素

4.8.1 SPOP

  1. 功能:随机移除并返回集合中的一个或多个元素
  2. 语法
    SPOP key [count]
  3. 示例
    127.0.0.1:6379> SPOP myset
    "cherry"
  4. 输出解释:随机移除并返回了集合 myset 中的 "cherry" 元素。移除后,集合 myset 中只剩下 "apple" 元素

(9)移动元素到另一个集合

4.9.1 SMOVE

  1. 功能:将一个元素从一个集合移动到另一个集合。如果源集合中不存在该元素,则不进行任何操作;如果目标集合不存在,则创建一个新集合
  2. 语法
    SMOVE source destination member
  3. 示例
    127.0.0.1:6379> SMOVE myset newset "apple"
    (integer) 1
  4. 输出解释:成功将 "apple" 元素从 myset 集合移动到 newset 集合,返回 1。此时 myset 集合为空,newset 集合包含 "apple" 元素

五、Zset

(1)添加元素

5.1.1 ZADD

  1. 功能:向有序集合中添加一个或多个成员及其分数。如果成员已存在,则更新其分数;如果有序集合不存在,则创建一个新的有序集合
  2. 语法
    ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
    
    NX:仅当成员不存在时添加
    XX:仅当成员已存在时更新分数
    CH:返回被修改的成员数量,包括新添加和分数更新的成员
    INCR:对已存在成员的分数进行增量操作,此时只能指定一个成员
  3. 示例
    127.0.0.1:6379> ZADD myzset 10 "member1" 20 "member2" 30 "member3"
    (integer) 3
  4. 输出解释:成功添加了三个成员,返回 3。此时有序集合 myzset 包含 ("member1", 10)、("member2", 20)、("member3", 30)

(2)获取成员分数

5.2.1 ZSCORE

  1. 功能:返回有序集合中指定成员的分数。如果成员不存在,返回 (nil)
  2. 语法
    ZSCORE key member
  3. 示例
    127.0.0.1:6379> ZSCORE myzset "member2"
    "20"
  4. 输出解释:返回成员 "member2" 的分数 20

(3)获取成员排名

5.3.1 ZRANK

  1. 功能:返回有序集合中指定成员的排名(按分数从小到大排序),排名从 0 开始。如果成员不存在,返回 (nil)
  2. 语法
    ZRANK key member
  3. 示例
    127.0.0.1:6379> ZRANK myzset "member2"
    (integer) 1
  4. 输出解释:成员 "member2" 在有序集合中按分数从小到大排第 1(排名从 0 开始)

5.3.2 ZREVRANK

  1. 功能:返回有序集合中指定成员的排名(按分数从大到小排序),排名从 0 开始。如果成员不存在,返回 (nil)
  2. 语法
    ZREVRANK key member
  3. 示例
    127.0.0.1:6379> ZREVRANK myzset "member2"
    (integer) 1
  4. 输出解释:成员 "member2" 在有序集合中按分数从大到小排第 1(排名从 0 开始)

(4)获取指定范围的成员

5.4.1 ZRANGE

  1. 功能:返回有序集合中指定排名范围(按分数从小到大)的成员。可以选择同时返回成员的分数
  2. 语法
    ZRANGE key start stop [WITHSCORES]
  3. 示例
    127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES
    1) "member1"
    2) "10"
    3) "member2"
    4) "20"
    5) "member3"
    6) "30"
  4. 输出解释:返回有序集合 myzset 中所有成员及其分数,按分数从小到大排序

5.4.2 ZREVRANGE

  1. 功能:返回有序集合中指定排名范围(按分数从大到小)的成员。可以选择同时返回成员的分数
  2. 语法
    ZREVRANGE key start stop [WITHSCORES]
  3. 示例
    127.0.0.1:6379> ZREVRANGE myzset 0 -1 WITHSCORES
    1) "member3"
    2) "30"
    3) "member2"
    4) "20"
    5) "member1"
    6) "10"
  4. 输出解释:返回有序集合 myzset 中所有成员及其分数,按分数从大到小排序

(5)获取指定分数范围的成员

5.5.1 ZRANGEBYSCORE

  1. 功能:返回有序集合中指定分数范围(按分数从小到大)的成员。可以选择同时返回成员的分数
  2. 语法
    ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
  3. 示例
    127.0.0.1:6379> ZRANGEBYSCORE myzset 10 20 WITHSCORES
    1) "member1"
    2) "10"
    3) "member2"
    4) "20"
  4. 输出解释:返回有序集合 myzset 中分数在 10 到 20 之间的成员及其分数,按分数从小到大排序

5.5.2 ZREVRANGEBYSCORE

  1. 功能:返回有序集合中指定分数范围(按分数从大到小)的成员。可以选择同时返回成员的分数
  2. 语法
    ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
  3. 示例
    127.0.0.1:6379> ZREVRANGEBYSCORE myzset 20 10 WITHSCORES
    1) "member2"
    2) "20"
    3) "member1"
    4) "10"
  4. 输出解释:返回有序集合 myzset 中分数在 10 到 20 之间的成员及其分数,按分数从大到小排序

(6)移除成员

5.6.1 ZREM

  1. 功能:从有序集合中移除一个或多个成员。返回成功移除的成员数量
  2. 语法
    ZREM key member [member ...]
  3. 示例
    127.0.0.1:6379> ZREM myzset "member2"
    (integer) 1
  4. 输出解释:成功移除了成员 "member2",返回 1

(7)增加成员分数

5.7.1 ZINCRBY

  1. 功能:为有序集合中指定成员的分数增加指定的增量。如果成员不存在,则先添加该成员并将分数初始化为增量值
  2. 语法
    ZINCRBY key increment member
  3. 示例
    127.0.0.1:6379> ZINCRBY myzset 5 "member1"
    "15"
  4. 输出解释:成员 "member1" 的分数增加 5 后变为 15

(8)获取有序集合的成员数量

5.8.1 ZCARD

  1. 功能:返回有序集合中的成员数量。如果有序集合不存在,返回 0
  2. 语法
    ZCARD key
  3. 示例
    127.0.0.1:6379> ZCARD myzset
    (integer) 2
  4. 输出解释:有序集合 myzset 中目前有 2 个成员

(9)获取指定分数范围内的成员数量

5.9.1 ZCOUNT

  1. 功能:返回有序集合中指定分数范围内的成员数量
  2. 语法
    ZCOUNT key min max
  3. 示例
    127.0.0.1:6379> ZCOUNT myzset 10 20
    (integer) 1
  4. 输出解释:有序集合 myzset 中分数在 10 到 20 之间的成员有 1 个

(10)移除指定排名范围的成员

5.10.1 ZREMRANGEBYRANK

  1. 功能:移除有序集合中指定排名范围(按分数从小到大)的成员。返回被移除的成员数量
  2. 语法
    ZREMRANGEBYRANK key start stop
  3. 示例
    127.0.0.1:6379> ZREMRANGEBYRANK myzset 0 0
    (integer) 1
  4. 输出解释:移除了有序集合 myzset 中排名第 0 的成员,返回 1

(11)移除指定分数范围的成员

5.11.1 ZREMRANGEBYSCORE

  1. 功能:移除有序集合中指定分数范围的成员。返回被移除的成员数量
  2. 语法
    ZREMRANGEBYSCORE key min max
  3. 示例
    127.0.0.1:6379> ZREMRANGEBYSCORE myzset 10 20
    (integer) 0
  4. 输出解释:由于之前移除操作后,分数在 10 到 20 之间已无成员,所以返回 0
    ### Redis 常见面试题及详细解答 #### 1. Redis 支持哪些数据结构? Redis 是一个键值存储数据库,支持多种数据结构,包括字符串(Strings),哈希(Hashes),列表(Lists),集合(Sets)以及有序集合(sorted sets)[^1]。 #### 2. 解释 Redis 集群方案有哪些? 常见的 Redis 集群方案主要包括三种方式: - **主从复制**:允许设置多个副本以提高可用性和读取能力。主服务器负责写入操作并将更改同步给若干个只读的从属实例。 - **哨兵模式**:提供高可用性的解决方案,能够自动监控并切换故障节点至备用节点上继续服务。 - **官方推荐的 Redis Cluster**:实现了分布式架构下的键空间划分与跨机器的数据迁移功能。 #### 3. 当 key 过期时会发生什么?它是如何工作的? 当设置了 TTL (Time To Live) 的 Key 到达其生存期限后并不会立刻消失不见;相反地,它会被标记为已过期的状态等待清理程序来移除它们。具体来说,有两种主要策略用于管理这些过期项: - 定期扫描(Active Expire),即后台线程周期性检查随机选取的一部分 keyspace 中是否有已经到期的对象; - 惰性删除(Lazy Deletion), 即仅在尝试访问某个特定 key 之时才会去验证该对象是否仍然有效——如果发现确实超出了设定时限,则即时销毁之。 #### 4. 描述一下 Redis 主从复制的工作原理。 在一个典型的主从配置里,存在至少一对相互关联的服务端实体 —— Master 和 Slave 。前者接受客户端发起的一切修改请求并向后者发送更新通知以便维持一致视图。每当发生变更事件时,master 就会记录下相应动作并通过网络连接传递给 slave ,使得后者得以重复执行同样的指令序列从而达到镜像效果。此外,slave 只能响应查询类别的调用而不能参与任何形式上的写入活动[^2]。 #### 5. 如何解决 AOF 文件过大问题? 为了应对大容量日志带来的挑战,Redis 设计了一套称为 "Append Only File Rewrite"(AOF重写) 的优化措施。这项技术的核心在于创建一个新的紧凑版本的日志文件代替旧版冗长繁杂的内容。期间,整个过程不会干扰正常的业务流程,只是偶尔会造成轻微延迟现象。完成之后再利用新生成的小型化脚本重新初始化内存映射即可恢复正常运作状态[^3]。 ```bash BGREWRITEAOF ``` 上述命令可用于触发一次手动的 AOF rewrite 操作。 #### 6. Redis 事务是如何实现的? Redis 提供了一个简单的多命令打包执行特性叫做 Transactions (事务)。一旦进入 MULTI 状态之下所提交的所有后续指令都会暂存起来直到最终由 EXEC 发起一次性批量处理为止。在此期间还可以通过 WATCH 关键字监视某些指定变量的变化情况进而决定是否放弃正在进行中的这批任务转而采用 DISCARD 来丢弃掉未决项目清单里的全部条目[^4]。 #### 7. 跳表(zset)内部结构是怎样的? 跳表是一种概率平衡树形索引结构,在 Redis 中用来高效维护有序集 Sorted Set 数据类型。每个元素都对应着链表形式的一系列层(Level),其中较低层次覆盖范围更广但高度较短,越往上则逐渐稀疏直至顶端形成单一线路贯穿始终。这样的设计既保证了查找效率又能简化插入/删除逻辑复杂度。以下是 C 语言描述的一个典型 zskiplist 结构体定义[^5]: ```c typedef struct zskiplist { struct zskiplistNode *header, *tail; unsigned long length; int level; } zskiplist; ```
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值