Appearance
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号数据库。
如果使用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已存在,则覆盖,完整语法如下:bashSET 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:保留设置前指定键的过期时间;
获取值:
get key获取指定key对应的值;同时设置/获取多个键值:
mset key value [key value]...:同时设置多个键值对;mget key [key]...:同时获取多个键的值;
获取/设置置顶范围内的值:
getrange key start end:获取子串,start和end是字节偏移量,都包含在内;如果end为-1,表示最后一个字节,-2则表示倒数第二个字节,依次类推;
setrange key offset value:使用value将key所存储的值,从offset位置开始覆盖更新,例如:
获取字符串长度:
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是一个双端列表:

容量为
LPUSH key element [element ...]:从左边将元素加入到列表中;RPUSH key element [element ...]:从右边将元素加入到列表中;LRANGE key start stop:获取在索引在[start, end]范围内的列表元素,常用来遍历列表,命令如下:bashLRANGE 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中所有的field和value。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中,所有分数介于min和max之间的成员(闭区间),成员按分数从低到高排列。参数说明:
min和max可以是数字,表示闭区间。(-表示负无穷大,+inf表示正无穷大。(开头表示开区间(不包含边界值),例如(10表示大于10,(1 (10表示大于1小于10。WITHSCORES:同时返回成员的分数。LIMIT offset count:限制返回结果的数量,类似于 SQL 的LIMIT。
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]:返回有序集合key中,所有分数介于max和min之间的成员(闭区间)。成员按分数从高到低排列。注意max在min之前。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中,分数在min和max之间的成员数量。ZREM key member [member ...]:移除有序集合key中的一个或多个member元素。不存在的member元素将被忽略。ZREMRANGEBYSCORE key min max:移除有序集合key中,分数在min和max之间的所有成员。ZREMRANGEBYRANK key start stop:移除有序集合key中,给定排名区间(从0开始)的所有成员。排名按分数从低到高。ZINCRBY key increment member:为有序集合key的member成员的score值加上increment。
ZSet同样支持集合运算,结果也是ZSet。
ZSet的应用场景
- 排行榜: 游戏积分榜、网站活跃用户榜、商品销售榜等。分数代表积分/活跃度/销量,成员代表玩家/用户/商品。
- 按时间排序的事件流: 博客文章、微博、新闻等,以时间戳作为分数进行排序。
- 带权重的任务队列: 任务以优先级作为分数。
7. Bitmap
Redis 中的 Bitmap (位图) 并不是一种独立的数据结构,而是 基于 String 数据类型 提供的,由于String数据类型最多可容纳512M数据,所以Bitmap也是512M,共
Bitmap可以看作是二进制位数组,每个元素只能为0或1,用来表示状态。
常用操作命令如下:
SETBIT key offset value:将指定key的offset处的值设置为value(0 或 1)。如果key不存在,它会自动创建一个新的字符串,并根据offset自动扩容。GETBIT key offset:获取指定key的offset处的值。BITCOUNT key [start end [BYTE | BIT]]: 统计key中值为 1 的位的数量。start和end参数可以指定统计的字节范围,可以指定以字节或以位为维度统计。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) 的位的位置。start和end可以指定搜索的字节范围。

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日是否签到。可以使用
BITOP和BITCOUNT统计连续两天签到的人数:
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 的并集。

HLL 是String类型的:

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:经度,有效范围是。 latitude:纬度,有效范围是。 经度的有效范围是[-180, 180],0度为本初子午线,东经为正,西经为负;纬度的有效范围是[-90, 90],赤道为0度,南纬为负,北纬为正。
member:成员名称,通常是地理位置的唯一标识符(例如,地点的 ID、商店名称等)。例如:

GEOPOS key member [member ...]:获取一个或多个成员的经度、纬度坐标。
GEODIST key member1 member2 [M | KM | FT | MI]:计算两个成员之间的直线距离。可选单位为米(M)、千米(KM)、英尺(FT)和英里(MI)。GEOHASH key member [member ...]:返回成员经纬度的Hash表示。GEOSEARCH:用来地理位置查询,完整命令如下bashGEOSEARCH 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中实现消息队列的数据结构。