Skip to content

Redis 数据类型

在Redis中,数据是以KV键值对存储的,key是字符串,而value有多种数据类型,本文介绍value的数据类型。

官方数据类型资料:https://redis.io/docs/latest/develop/data-types/

官方命令资料:https://redis.io/docs/latest/commands/

1. Key操作命令

下面介绍关于Redis数据库和key相关命令(命令不区分大小写):

  • select [db index]:选择Redis数据库,[db index]取值范围应为0-15,默认使用0号数据库。

    image-20250605140937085

    如果使用0号数据库,则命令行提示符没有数据库提示;如果使用其他数据库,则会有数据库提示。

  • keys *:列出当前数据库所有的key;

  • exists [key name]:判断某个key是否存在;

  • del [key name]:删除指定的key及其数据;

  • type [key name]:查看指定key的value值是什么数据类型;

  • unlink [key name]:非阻塞删除,仅仅将key从keyspace元数据中删除,真正的删除会在后续异步中操作;

  • dbsize:查看当前数据库key的数量;

  • move [key name] [db index]:将当前数据库的key移动到给定的数据库中;

  • flushdb:清空当前数据库⚠️;

  • flushall:清空所有数据库;

  • ttl [key name]:查看指定的key还有多少秒过期,-1表示永不过期,-2表示已过期;

  • expire [key name] [seconds]:为指定的key设置过期时间(单位:秒);

2. String

本小节介绍有关String数据类型的操作命令:

  • set key value:为key赋值为value,如果key已存在,则覆盖,完整语法如下:

    bash
    SET key value [NX | XX] [GET] [EX seconds | PX milliseconds |
      EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
    • NX:key不存在时设置键值;

    • XX:key存在时设置键值;

    • GET:返回指定键原本的值,若键不存在时返回nil

    • EX seconds:以秒为单位设置过期时间;

    • PX milliseconds:以毫秒为单位设置过期时间;

    • EXAT unix-time-seconds:设置以秒为单位的UNIX时间戳所对应的时间为过期时间;

    • PXAT unix-time-milliseconds:设置以毫秒为单位的UNIX时间戳所对应的时间为过期时间;

    • KEEPTTL:保留设置前指定键的过期时间;

      image-20250605142812871

  • 获取值get key获取指定key对应的值;

  • 同时设置/获取多个键值

    • mset key value [key value]...:同时设置多个键值对;
    • mget key [key]...:同时获取多个键的值;
  • 获取/设置置顶范围内的值

    • getrange key start end:获取子串,start和end是字节偏移量,都包含在内;如果end为-1,表示最后一个字节,-2则表示倒数第二个字节,依次类推;

      image-20250605143718291

    • setrange key offset value:使用value将key所存储的值,从offset位置开始覆盖更新,例如:

      image-20250605144023627

  • 获取字符串长度strlen key返回指定key对应的值字节长度;

  • 追加内容append key value在指定key对应的值后面增加value;

  • 数值增减:如果key对应的值是数字,则可以对其进行数值增减操作

    • incr key:指定key对应的整数 +1;
    • incrby key increment:指定key对应的整数 +increment;
    • decr key:指定key对应的整数 - 1;
    • decrby key increment:指定key对应的整数 - increment;
    • incrbyfloat key increment:指定key对应的浮点数 +increment;

3. List

在Redis中,List是一个双端列表:

image-20250605155336700

容量为2321,可以容纳40多亿个元素。关于List的操作命令如下:

  • LPUSH key element [element ...]:从左边将元素加入到列表中;

  • RPUSH key element [element ...]:从右边将元素加入到列表中;

  • LRANGE key start stop:获取在索引在[start, end]范围内的列表元素,常用来遍历列表,命令如下:

    bash
    LRANGE key 0 -1

    -1表示最后一个元素。

  • LINDEX key index:获取指定列表指定索引处的值;

  • LSET key index element:将列表指定索引处的值替换为element;

  • LLEN key:获取列表长度;

  • LINSERT key <BEFORE | AFTER> pivot element:在列表元素pivot的前面或后面插入新元素element;

  • LPOP key [count]:从列表左边取出最多count个元素;

  • RPOP key [count]:从列表右边取出最多count个元素;

4. Hash

在Redis中,值为Hash,表示值可以存储多个KV(field-value)键值对。有关命令如下:

  • HSET key field value [field value ...]:将哈希表 key 中的 field 的值设置为 value。如果 key 不存在,会自动创建新的哈希表并进行 HSET 操作;如果 field 已经存在于哈希表中,旧的值会被覆盖。
  • HSETNX key field value [field value ...]:只有当哈希表 key 中的 field 不存在时,才将 field 的值设置为 value,如果 field 已经存在,则不执行任何操作。
  • HGET key field:获取哈希表 key 中给定 field 的值。
  • HMGET key field [field ...]:获取哈希表 key 中一个或多个 field 的值,返回值是一个列表,包含所有给定 field 对应的值,如果 field 不存在,则对应位置返回 nil
  • HGETALL key:获取哈希表 key 中所有的 fieldvalue
  • HKEYS key:获取哈希表 key 中所有 field(字段名)。
  • HVALS key:获取哈希表 key 中所有 value(字段值)。
  • HLEN key:获取哈希表 key 中字段的数量。
  • HDEL key field [field ...]:删除哈希表 key 中的一个或多个 field
  • HEXISTS key field:检查哈希表 key 中是否存在给定 field

5. Set

Set是一个 无序的、不重复的字符串元素集合。有关命令如下:

  • SADD key member [member ...]:将一个或多个 member 元素添加到集合 key 当中,已经存在于集合中的 member 元素将被忽略。
  • SMEMBERS key:返回集合 key 中的所有成员。
  • SISMEMBER key member:判断 member 元素是否是集合 key 的成员。
  • SCARD key:返回集合 key 的 cardinality (元素数量)。
  • SRANDMEMBER key [count]:随机返回集合 key 中的一个或多个元素,但不从集合中删除它们。
  • SREM key member [member ...]: 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素将被忽略。
  • SPOP key [count]:移除并返回集合中的一个或多个随机元素。

多个Set可以进行集合运算,有关命令如下:

  • SUNION key [key ...]:返回所有给定集合的 并集。即存在于任何一个给定集合中的元素。
  • SUNIONSTORE destination key [key ...]:将所有给定集合的并集存储在 destination 集合中。
  • SINTER key [key ...]:返回所有给定集合的 交集。即存在于所有给定集合中的元素。
  • SINTERSTORE destination key [key ...]:将所有给定集合的交集存储在 destination 集合中。
  • SDIFF key [key ...]:返回第一个集合与后面所有集合的 差集。即存在于第一个集合但不存在于其他任何集合中的元素。
  • SDIFFSTORE destination key [key ...]:将第一个集合与后面所有集合的差集存储在 destination 集合中。

6. ZSet

ZSet 就是 Sorted Set,即有序集合,在每个集合元素上,还有一个分数,用于排序,如果分数相同,则按照成员的字典序进行排序。

有关ZSet的命令如下:

  • ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]:将一个或多个 member 元素及其 score 值加入到有序集合 key 当中。如果某个 member 已经是有序集合的成员,那么它的 score 将被更新为新的 score,并重新调整其在集合中的位置。

    • NX:只在 member 不存在时才添加。
    • XX:只在 member 已经存在时才更新 score
    • GT:只在新的 score 大于当前 score 时才更新。
    • LT:只在新的 score 小于当前 score 时才更新。
    • CH:当 CH 选项被指定时,ZADD 命令的返回值是新添加的元素数量和被更新的元素数量之和。
    • INCR:将 score 值增加而不是设置。一次只能指定一个 score-member对。
  • ZRANGE key start stop [WITHSCORES]:返回有序集合 key 中,指定区间内的成员。成员按分数从低到高(升序)排列,下标 0 表示第一个元素,-1 表示最后一个元素。

  • ZREVRANGE key start stop [WITHSCORES]:返回有序集合 key 中,指定区间内的成员。成员按分数从高到低(降序)排列。

  • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]:返回有序集合 key 中,所有分数介于 minmax 之间的成员(闭区间),成员按分数从低到高排列。

    参数说明:

    • minmax 可以是数字,表示闭区间。
    • (- 表示负无穷大,+inf 表示正无穷大。
    • ( 开头表示开区间(不包含边界值),例如 (10 表示大于10,(1 (10表示大于1小于10。
    • WITHSCORES:同时返回成员的分数。
    • LIMIT offset count:限制返回结果的数量,类似于 SQL 的 LIMIT
  • ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]:返回有序集合 key 中,所有分数介于 maxmin 之间的成员(闭区间)。成员按分数从高到低排列。注意 maxmin 之前。

  • ZRANK key member:返回 member 在有序集合 key 中的排名(rank)。排名从 0 开始,分数最小的成员排名为 0

  • ZREVRANK key member:返回 member 在有序集合 key 中的逆序排名。逆序排名从 0 开始,分数最大的成员排名为 0

  • ZSCORE key member:返回有序集合 key 中,member 元素的分数。

  • ZCARD key:返回有序集合 key 的元素数量。

  • ZCOUNT key min max:返回有序集合 key 中,分数在 minmax 之间的成员数量。

  • ZREM key member [member ...]:移除有序集合 key 中的一个或多个 member 元素。不存在的 member 元素将被忽略。

  • ZREMRANGEBYSCORE key min max:移除有序集合 key 中,分数在 minmax 之间的所有成员。

  • ZREMRANGEBYRANK key start stop:移除有序集合 key 中,给定排名区间(从 0 开始)的所有成员。排名按分数从低到高。

  • ZINCRBY key increment member:为有序集合 keymember 成员的 score 值加上 increment

ZSet同样支持集合运算,结果也是ZSet。

ZSet的应用场景

  • 排行榜: 游戏积分榜、网站活跃用户榜、商品销售榜等。分数代表积分/活跃度/销量,成员代表玩家/用户/商品。
  • 按时间排序的事件流: 博客文章、微博、新闻等,以时间戳作为分数进行排序。
  • 带权重的任务队列: 任务以优先级作为分数。

7. Bitmap

Redis 中的 Bitmap (位图) 并不是一种独立的数据结构,而是 基于 String 数据类型 提供的,由于String数据类型最多可容纳512M数据,所以Bitmap也是512M,共232个二进制位。

Bitmap可以看作是二进制位数组,每个元素只能为0或1,用来表示状态。

常用操作命令如下:

  • SETBIT key offset value:将指定 keyoffset 处的值设置为 value (0 或 1)。如果 key 不存在,它会自动创建一个新的字符串,并根据 offset 自动扩容。

  • GETBIT key offset:获取指定 keyoffset 处的值。

  • BITCOUNT key [start end [BYTE | BIT]]: 统计 key 中值为 1 的位的数量。startend 参数可以指定统计的字节范围,可以指定以字节或以位为维度统计。

  • BITOP operation destkey key [key ...]:对一个或多个 key 进行位运算(AND, OR, XOR, NOT),并将结果存储在 destkey 中。

    operation 支持:

    • AND:按位与
    • OR:按位或
    • XOR:按位异或
    • NOT:按位非 (只能对一个 key 进行操作)
  • BITPOS key bit [start [end [BYTE | BIT]]]:查找 key 中第一个设置为 bit (0 或 1) 的位的位置。startend 可以指定搜索的字节范围。

image-20250605174749456

Bitmap常见使用场景:

  • 用户在线状态:

    • key 可以是 online_users
    • offset 是用户 ID。
    • value 为 1 表示在线,0 表示离线。
    • SETBIT online_users 10086 1:用户 10086 上线。
    • GETBIT online_users 10086:查询用户 10086 是否在线。
    • BITCOUNT online_users:统计当前在线用户总数。
  • 用户签到/打卡记录:

    • key 可以是 daily_signin:yyyyMMdd (例如 daily_signin:20250605)。

    • offset 是用户 ID。

    • value 为 1 表示已签到,0 表示未签到。

    • SETBIT daily_signin:20250605 12345 1:用户 12345 在 6月5日签到。

    • GETBIT daily_signin:20250605 12345:查询用户 12345 在 6月5日是否签到。

    • 可以使用BITOPBITCOUNT统计连续两天签到的人数:

      image-20250605175119892

8. HyperLogLog

Redis 的 HyperLogLog (HLL) 是一种用于 基数计数(Cardinality Counting) 的概率型数据结构。

基数计数 简单来说就是统计一个集合中 不重复元素的数量,例如:

  • 一个网站的独立访客数(UV)。
  • 一个视频的独立观看用户数。
  • 搜索引擎中查询关键词的独立用户数。
  • 应用程序中日志的独立 IP 数。

HyperLogLog 的核心优势在于:

  • 极度节省内存: 无论要统计的元素数量有多大(十亿、百亿甚至更多),HyperLogLog 所占用的内存都是固定的,最多使用 12 KB
  • 误差可控: 它是一种概率型算法,因此计算结果会存在一定的误差,但这个误差非常小,通常在 0.81% 左右。对于大多数需要大规模去重计数的场景,这个误差是完全可以接受的。

关于HLL的操作命令如下:

  • PFADD key element [element ...]:将一个或多个元素添加到 HyperLogLog 结构中。
  • PFCOUNT key [key ...]:返回一个或多个 HyperLogLog 的估算基数(合并后的基数)。
  • PFMERGE destkey sourcekey [sourcekey ...]:将一个或多个 HyperLogLog 合并到一个新的 HyperLogLog 中,合并后的 HyperLogLog 的基数将是所有源 HyperLogLog 的并集。

image-20250605190828357

HLL 是String类型的:

image-20250605191054369

9. Geospatial

Geospatial允许存储地理坐标信息(经度、纬度),并基于这些信息进行高效的地理空间查询。

Geospatial 功能是基于 Sorted Set 实现的,它将经纬度信息编码成一个 GeoHash 字符串,然后作为 Sorted Set 的成员,GeoHash 的值作为 Sorted Set 的分数。这样就可以利用 Sorted Set 的范围查询能力来实现地理空间查询。

有关Geospatial的命令如下:

  • GEOADD key longitude latitude member [longitude latitude member ...]:将一个或多个地理空间位置(经度、纬度、成员名称)添加到指定的 key(地理空间集合)中。

    longitude:经度,有效范围是 [180,180]

    latitude:纬度,有效范围是 [90,90]

    经度的有效范围是[-180, 180],0度为本初子午线,东经为正,西经为负;纬度的有效范围是[-90, 90],赤道为0度,南纬为负,北纬为正。

    member:成员名称,通常是地理位置的唯一标识符(例如,地点的 ID、商店名称等)。

    例如:

    image-20250605201107626

  • GEOPOS key member [member ...]:获取一个或多个成员的经度、纬度坐标。

    image-20250605201156072

  • GEODIST key member1 member2 [M | KM | FT | MI]:计算两个成员之间的直线距离。可选单位为米(M)、千米(KM)、英尺(FT)和英里(MI)。

  • GEOHASH key member [member ...]:返回成员经纬度的Hash表示。

  • GEOSEARCH:用来地理位置查询,完整命令如下

    bash
    GEOSEARCH key 
    	<FROMMEMBER member | FROMLONLAT longitude latitude>
      <BYRADIUS radius <M | KM | FT | MI> | BYBOX width height <M | KM | FT | MI>> 
      [ASC | DESC] [COUNT count [ANY]] 
      [WITHCOORD] [WITHDIST] [WITHHASH]

    key (必选):指定要查询的地理空间集合的键名。

    FROM 子句 (必选,二选一):定义查询的中心点来源。

    • FROMMEMBER member

      • 以集合中已有的一个 member 的位置作为查询的中心点。
      • 示例:FROMMEMBER "beijing"
    • FROMLONLAT longitude latitude

      • 以给定的经纬度 longitude latitude 作为查询的中心点。
      • 示例:FROMLONLAT 121.5654 25.0330

    BY 子句 (必选,二选一):定义查询的形状和大小。

    • BYRADIUS radius m|km|ft|mi

      • 查询一个圆形区域内的成员。
      • radius:半径数值。
      • m|km|ft|mi:半径的单位(米、千米、英尺、英里)。
      • 示例:BYRADIUS 50 km (50公里半径的圆形区域)
    • BYBOX width height m|km|ft|mi

      • 查询一个矩形区域内的成员。
      • width:矩形的宽度(东西方向的距离)。
      • height:矩形的高度(南北方向的距离)。
      • m|km|ft|mi:宽和高的单位。
      • 注意: 这个矩形是轴对齐的,即边与经纬线平行。
      • 示例:BYBOX 100 100 km (边长 100 公里的正方形区域)

    ORDER 子句 (可选):定义结果的排序方式,如果不指定,则返回顺序是不确定的。

    • ASC:按距离中心点由近及远升序排序。
    • DESC:按距离中心点由远及近降序排序。

    COUNT 子句(可选):限制返回结果的数量。

    WITH 子句 (可选,可组合):定义返回结果中包含的额外信息。

    • WITHCOORD:同时返回找到成员的经度、纬度坐标。
    • WITHDIST:同时返回找到成员与中心点的距离。
    • WITHHASH:同时返回找到成员的 GeoHash 整数编码值。

10. 其他

Stream:在Redis中实现消息队列的数据结构。