Redis 基本数据类型和常用命令

一、数据类型

Redis 5 支持以下多种数据类型:

  • 二进制安全的字符串。
  • Lists (列表) :根据插入顺序排序的字符串元素的集合。
  • Sets (集) :未排序的不重复的字符串元素的集合。
  • Sorted Sets (排序集) :类似于集,但每个字符串元素与被称为分数的值相关,元素总是按其分数排序。
  • Hashes (散列) :由字段 (Field) 和值都是字符串组成的映射的集合。
  • Bit Arrays (也称 bitmaps 位图) :Bitmaps 本身不是一种数据结构, 实际上它就是字符串,但是它可以对字符串的位进行操作,所以在 Redis 官方的分类当中将其单独归为一类。
  • HyperLogLogs :实际类型为字符串类型 ,它是一种基数算法, 通过 HyperLogLog 可以利用极小的内存空间完成独立总数的统计。
  • Streams (流) :Stream是 Redis 5.0 引入的一种新数据类型,用于在生产者和消费者之间建立数据通道。

二、常用命令

2.1 字符串

作用 命令格式 参数或示例
设置值 set key value [ex seconds][px milliseconds][nx xx] setnx setex
获取值 get key 如果获取的键不存在 ,则返回 nil
批量设置 mset key value [key value ...] mset a 1 b 2 c 3 d 4
批量获取值 mget key [key ...] mget a b c d
计数 incr key
decr key
incrby key increment(指定数值自增)
decrby key decrement(指定数值自减)
incrbyfloat key increment (浮点数自增)
值是整数时返回自增或自减后的结果;
值不是整数时返回错误;
键不存在时自动创建,并按照初始值为 0 进行自增或自减。
追加值 append key value 向字符串尾部追加值。
字符串长度 strlen key 获取字符串长度,中文占用三个字节
设置并返回原值 getset key value
设置指定位置的字符串 setrange key offeset value
获取部分字符串 getrange key start end

2.3 哈希

作用 格式 参数或示例
设置值 hset key field value hset user:1 name tom
hset user:1 age 12
获取值 hget key field hget user:1 name
删除 field hdel key field [field ...]
计算 field 个数 hlen key
批量设置或获取 hmget key field [field]
hmset key field value [field value...]
hmset user:1 name mike age 12 city tianjin
hmget user:1 name city
判断 field 是否存在 hexists key field
获取所有 field hkeys key
获取所有 value hvals key
获取所有的 filed-value hgetall key 如果哈希元素个数比较多可能会阻塞Redis,此时可以使用 hscan 渐进式遍历
计数 hincrby key field
hincrbyfloat key field

2.4 列表

作用 格式 参数或示例
左侧插入:lpush key value [value ...]
右侧插入:rpush key value [value ...]
某个指定元素前后插入:linsert key before
after pivot value
获取指定范围内的元素列表:lrange key start end
获取列表指定索引下标的元素:lindex key index
获取列表指定长度:llen key
lrange listkey 0 -1
从列表左侧弹出元素:lpop key
从列表右侧弹出元素:rpop key
删除指定元素:lrem key count value
截取列表:ltrim key start end
count>0:从左到右, 删除最多 count 个元素。
count<0:从右到左, 删除最多 -count 个元素。
count=0: 删除所有
修改指定下标的元素:lset key index newValue
阻塞操作 blpop key [key ...] timeout
brpop key [key ...] timeout
key[key...]: 多个列表的键。 timeout: 阻塞时间

2.5 集合

集合(set) 类型也是用来保存多个的字符串元素, 但和列表类型不一样的是, 集合中的元素是无序的, 不允许有重复元素,不能通过下标获取元素。

作用 格式 参数或示例
添加元素 sadd key element [element ...] 返回结果为添加成功的元素个数
删除元素 srem key element [element ...] 返回结果为成功删除的元素个数
计算元素个数 scard key
判断元素是否在集合中 sismember key element
随机返回 srandmember key [count] 随机从集合返回指定个数元素,count 默认为1
从集合随机弹出元素 spop key srandmember 不会从集合中删除元素,spop 会
获取集合中所有元素 smembers key 可用 sscan 代替

集合间操作

作用 格式
求多个集合的交集 sinter key [key ...]
求多个集合的并集 suinon key [key ...]
求多个集合的差集 sdiff key [key ...]
将交集、并集、差集的结果保存 sinterstore destination key [key ...]
suionstore destination key [key ...]
sdiffstore destination key [key ...]

2.6 有序集合

有序集合中的元素可以排序。它给每个元素设置一个分数(score) 作为排序的依据。

作用 格式 参数或示例
添加成员 zadd key score member [score member ...] nx: member 不存在时才可设置成功, 用于添加;
xx: member 存在时可以设置成功, 用于更新;
ch: 返回此次操作后, 有序集合内元素和分数发生变化的个数;
incr:对 score 做增加, 相当于下面的 zincrby。
计算成员个数 zcard key
计算某个成员的分数 zscore key member
计算某个成员的排名 zrank key member zrevrank key member zrank是从分数从低到高返回排名, zrevrank 反之。
删除成员 zrem key member [member ...]
增加成员分数 zincrby key increment member zincrby user:ranking 9 tom
返回指定排名范围的成员 zrange key start end [withscores]
zrevrange key start end [withscores]
zrange是从低到高返回, zrevrange 反之。
返回指定分数范围内的成员 zrangebyscore key min max [withscores][limit offset count]
zrevrangebyscore key max min [withscores][limit offset count]
其中 zrangebyscore 按照分数从低到高返回, zrevrangebyscore 反之;
[limit offset count] 选项用于限制输出的起始位置和个数;
min 和 max 代表最小和最大值,支持开闭区间, 也可以使用 -inf 和+inf 代表无限小和无限大。
删除指定排名内的升序元素 zremrangerank key start end
删除指定分数范围的成员 zremrangebyscore key min max

集合间操作

作用 格式
交集 zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum
并集 zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum
  • destination : 交集计算的结果保存到这个键。
  • numkeys : 需要做交集计算键的个数。
  • key[key...] : 需要做交集计算的键。
  • weights weight[weight...] : 每个键的权重, 在做交集计算时, 每个键中的每个 member 会将自己分数乘以这个权重, 每个键的权重默认是1。
  • aggregate sum|min|max : 计算成员交集后, 分值可以按照sum(和)、min(最小值)、max(最大值)做汇总, 默认值是 sum 。

2.7 全局命令

  1. 查看所有键: keys *
  2. 查看键总数:dbsize
  3. 检查键是否存在:exists key
  4. 删除键:del key [key ...]
  5. 键过期:expire key seconds ,使用 ttl 命令可以查看键剩余的过期时间, 它有以下三种返回值:
    • 大于等于0的整数: 键剩余的过期时间。
    • -1: 键未设置过期时间。
    • -2: 键不存在
  6. 查看键的数据类型:type key

2.8 键过期

可以使用以下命令完成设置键的过期时间:

  • expire key seconds : 键在 seconds 秒后过期;
  • expireat key timestamp : 键在秒级时间戳 timestamp 后过期;
  • pexpire key milliseconds : 键在 milliseconds 毫秒后过期;
  • pexpireat key milliseconds-timestamp :键在毫秒级时间戳 timestamp 后过期。

注意事项:

  • 如果 expire key 的键不存在, 返回结果为 0;
  • 如果设置过期时间为负值, 键会立即被删除, 此时等价于 del 命令;
  • persist key 命令可以将键的过期时间清除,使键变成永久的;
  • 需要特别注意对于字符串类型键, 执行 set 命令会清除掉已有的过期时间;
  • Redis 不支持对二级数据结构的内部元素设置过期时间, 例如不能对列表内的某个元素设置过期时间;
  • setex 命令是 set+expire 的组合, 它是一个原子操作。

2.9 渐进式键遍历

使用 keys 命令遍历键可能会带来阻塞的风险,因为 Redis 提供了渐进式键遍历命令 scan ,使用格式如下:

scan cursor [match pattern] [count number] 
  • cursor :游标,第一次遍历从 0 开始, 每次遍历完都会返回当前游标的值, 直到游标值为 0, 表示遍历结束。
  • match pattern :可选参数, 它的作用的是匹配特定模式的键;
  • count number :可选参数, 它的作用是表明每次要遍历的键个数, 默认值是 10。

2.10 数据库管理

  1. 切换数据库:select dbIndex
  2. 清除数据库:flushdb/flushall,flushdb只清除当前数据库, flushall会清除所有数据库。