Redis 数据类型
Redis支持多种数据结构,每种数据结构都有特定的使用场景。
1. String(字符串)
最基本的数据类型,一个key对应一个value。
基本操作
redis
# 设置值
SET name "GlowXQ"
SET age 25
# 获取值
GET name
# 同时设置多个键值
MSET key1 "value1" key2 "value2" key3 "value3"
# 同时获取多个值
MGET key1 key2 key3
# 设置并返回旧值
GETSET name "NewName"
# 追加字符串
APPEND name " Blog"
# 获取字符串长度
STRLEN name
# 设置范围内的值
SETRANGE name 0 "Hello"
# 获取范围内的值
GETRANGE name 0 4数值操作
redis
# 自增
INCR counter # counter += 1
INCRBY counter 5 # counter += 5
# 自减
DECR counter # counter -= 1
DECRBY counter 3 # counter -= 3
# 浮点数增加
INCRBYFLOAT price 0.5应用场景
- 缓存:用户信息、文章内容
- 计数器:点赞数、访问量
- 分布式锁:SETNX实现
- Session共享
2. Hash(哈希)
类似于Map<String, String>,适合存储对象。
基本操作
redis
# 设置单个字段
HSET user:1001 name "GlowXQ"
HSET user:1001 age 25
HSET user:1001 email "glowxq@example.com"
# 设置多个字段
HMSET user:1002 name "User2" age 30 email "user2@example.com"
# 获取单个字段
HGET user:1001 name
# 获取多个字段
HMGET user:1001 name age
# 获取所有字段和值
HGETALL user:1001
# 获取所有字段名
HKEYS user:1001
# 获取所有值
HVALS user:1001
# 判断字段是否存在
HEXISTS user:1001 name
# 删除字段
HDEL user:1001 email
# 获取字段数量
HLEN user:1001
# 字段值增加
HINCRBY user:1001 age 1
HINCRBYFLOAT user:1001 balance 10.5
# 字段不存在时设置
HSETNX user:1001 phone "13800138000"应用场景
- 存储对象:用户信息、商品信息
- 购物车:用户ID为key,商品ID为field,数量为value
redis
# 购物车示例
HSET cart:1001 product:1 2 # 商品1,数量2
HSET cart:1001 product:2 1 # 商品2,数量1
HINCRBY cart:1001 product:1 1 # 商品1数量+1
HDEL cart:1001 product:2 # 移除商品2
HGETALL cart:1001 # 查看购物车3. List(列表)
有序的字符串列表,可以从两端操作。
基本操作
redis
# 左侧插入
LPUSH list1 "a" "b" "c" # 结果:c b a
# 右侧插入
RPUSH list2 "a" "b" "c" # 结果:a b c
# 左侧弹出
LPOP list1
# 右侧弹出
RPOP list2
# 获取列表长度
LLEN list1
# 获取范围内的元素
LRANGE list1 0 -1 # 获取所有元素
LRANGE list1 0 9 # 获取前10个元素
# 获取指定索引的元素
LINDEX list1 0
# 设置指定索引的值
LSET list1 0 "new value"
# 在指定元素前/后插入
LINSERT list1 BEFORE "b" "new"
LINSERT list1 AFTER "b" "new"
# 保留指定范围的元素
LTRIM list1 0 9 # 只保留前10个
# 移除元素
LREM list1 1 "value" # 移除1个值为"value"的元素
# 阻塞弹出
BLPOP list1 10 # 等待10秒
BRPOP list1 10应用场景
- 消息队列:LPUSH + BRPOP
- 最新列表:最新文章、最新评论
- 栈:LPUSH + LPOP
- 队列:LPUSH + RPOP
redis
# 消息队列示例
# 生产者
LPUSH queue:tasks "task1"
LPUSH queue:tasks "task2"
# 消费者
BRPOP queue:tasks 0 # 阻塞等待任务4. Set(集合)
无序的字符串集合,元素唯一。
基本操作
redis
# 添加元素
SADD set1 "a" "b" "c"
# 获取所有元素
SMEMBERS set1
# 判断元素是否存在
SISMEMBER set1 "a"
# 获取集合大小
SCARD set1
# 移除元素
SREM set1 "a"
# 随机获取元素
SRANDMEMBER set1 2 # 随机获取2个元素
# 随机弹出元素
SPOP set1
# 移动元素到另一个集合
SMOVE set1 set2 "b"集合运算
redis
# 交集
SINTER set1 set2
# 并集
SUNION set1 set2
# 差集
SDIFF set1 set2 # set1中有但set2中没有的
# 将结果存储到新集合
SINTERSTORE result set1 set2
SUNIONSTORE result set1 set2
SDIFFSTORE result set1 set2应用场景
- 标签系统:用户标签、文章标签
- 共同好友:交集运算
- 抽奖系统:SRANDMEMBER随机抽取
- 点赞/收藏:用户ID存入集合
redis
# 标签系统示例
SADD user:1001:tags "Java" "MySQL" "Redis"
SADD user:1002:tags "Python" "MySQL" "MongoDB"
# 共同标签
SINTER user:1001:tags user:1002:tags # 结果:MySQL
# 文章被哪些用户点赞
SADD article:1001:likes 1001 1002 1003
SCARD article:1001:likes # 点赞数
SISMEMBER article:1001:likes 1001 # 判断用户是否点赞5. ZSet(有序集合)
有序的集合,每个元素关联一个分数(score),按分数排序。
基本操作
redis
# 添加元素
ZADD leaderboard 9500 "player1"
ZADD leaderboard 8800 "player2"
ZADD leaderboard 9200 "player3"
# 获取元素数量
ZCARD leaderboard
# 获取指定范围的元素(按分数升序)
ZRANGE leaderboard 0 -1
ZRANGE leaderboard 0 9 WITHSCORES # 带分数
# 获取指定范围的元素(按分数降序)
ZREVRANGE leaderboard 0 9 WITHSCORES
# 获取指定分数范围的元素
ZRANGEBYSCORE leaderboard 8000 9000 WITHSCORES
# 获取元素的分数
ZSCORE leaderboard "player1"
# 获取元素的排名
ZRANK leaderboard "player1" # 升序排名
ZREVRANK leaderboard "player1" # 降序排名
# 增加分数
ZINCRBY leaderboard 100 "player1"
# 移除元素
ZREM leaderboard "player2"
# 移除指定排名范围的元素
ZREMRANGEBYRANK leaderboard 0 2
# 移除指定分数范围的元素
ZREMRANGEBYSCORE leaderboard 0 8000
# 统计指定分数范围的元素数量
ZCOUNT leaderboard 8000 9000集合运算
redis
# 交集
ZINTERSTORE result 2 zset1 zset2
# 并集
ZUNIONSTORE result 2 zset1 zset2应用场景
- 排行榜:游戏积分榜、热搜榜
- 延时队列:时间戳作为score
- 优先级任务:优先级作为score
redis
# 排行榜示例
# 添加分数
ZADD game:rank 9500 "player1"
ZADD game:rank 8800 "player2"
ZADD game:rank 9200 "player3"
# 增加分数
ZINCRBY game:rank 100 "player1"
# 获取前10名
ZREVRANGE game:rank 0 9 WITHSCORES
# 获取玩家排名(从1开始)
ZREVRANK game:rank "player1"
# 延时队列示例
# 添加任务(时间戳作为score)
ZADD delay:queue 1640000000 "task1"
ZADD delay:queue 1640000060 "task2"
# 获取到期任务
ZRANGEBYSCORE delay:queue 0 [当前时间戳]6. Bitmap(位图)
基于String类型,通过位操作实现。
redis
# 设置位
SETBIT key 10 1
# 获取位
GETBIT key 10
# 统计位为1的数量
BITCOUNT key
# 位运算
BITOP AND destkey key1 key2
BITOP OR destkey key1 key2
BITOP XOR destkey key1 key2
BITOP NOT destkey key应用场景
- 签到统计:用户每日签到
- 在线状态:用户是否在线
- 布隆过滤器
redis
# 签到示例
# 用户1001在第1天签到
SETBIT sign:1001:202410 0 1
# 用户1001在第5天签到
SETBIT sign:1001:202410 4 1
# 统计签到天数
BITCOUNT sign:1001:2024107. HyperLogLog
用于基数统计(去重计数),占用空间极小(12KB)。
redis
# 添加元素
PFADD uv:20241022 "user1" "user2" "user3"
# 统计基数
PFCOUNT uv:20241022
# 合并
PFMERGE uv:total uv:20241022 uv:20241023应用场景
- UV统计:网站独立访客数
- 搜索关键词统计
8. Geospatial(地理位置)
存储地理位置信息。
redis
# 添加位置
GEOADD cities 116.40 39.90 "beijing"
GEOADD cities 121.47 31.23 "shanghai"
# 获取位置
GEOPOS cities "beijing"
# 计算距离
GEODIST cities "beijing" "shanghai" km
# 获取附近的位置
GEORADIUS cities 116.40 39.90 1000 km
# 获取指定位置附近的位置
GEORADIUSBYMEMBER cities "beijing" 1000 km应用场景
- 附近的人/店铺
- 外卖配送范围
💡 提示
这是一个demo文档,欢迎补充更多数据类型相关内容。