第三章:Redis基础数据类型
3.1 String类型详解
String类型特点
- 二进制安全,可以存储任何数据
- 最大值为512MB
- 支持自增自减操作
常用命令
# 基础操作
SET key value # 设置值
GET key # 获取值
SETNX key value # 设置值(仅当key不存在时)
SETEX key seconds value # 设置值并指定过期时间
PSETEX key milliseconds value # 设置值并指定过期时间(毫秒)
# 批量操作
MSET key1 value1 key2 value2 # 设置多个键值对
MGET key1 key2 # 获取多个键的值
# 数值操作
INCR key # 递增1
DECR key # 递减1
INCRBY key increment # 增加指定值
DECRBY key decrement # 减少指定值
INCRBYFLOAT key increment # 增加浮点数
# 其他操作
STRLEN key # 获取字符串长度
APPEND key value # 追加值
GETRANGE key start end # 获取子字符串
SETRANGE key offset value # 设置子字符串
应用场景
1. 缓存用户信息
# 存储用户JSON数据
SET user:1001 '{"id":1001,"name":"张三","age":25}'
GET user:1001
# 设置过期时间
SETEX user:1001 3600 '{"id":1001,"name":"张三","age":25}'
2. 计数器
# 文章浏览量
INCR article:views:1001
# 每日活跃用户数
INCR daily:active:users:2023-01-01
# 视频播放量
INCRBY video:plays:1001 100
3. 分布式锁
# 获取锁
SET lock:resource1 "unique_value" NX EX 30
# 释放锁
if redis.call("get", KEYS[1]) == ARGV[1] then
return redis.call("del", KEYS[1])
else
return 0
end
3.2 Hash类型详解
Hash类型特点
- 适合存储对象
- 每个Hash可以存储2^32-1个字段
- 支持字段级别的操作
常用命令
# 字段操作
HSET key field value # 设置字段值
HGET key field # 获取字段值
HGETALL key # 获取所有字段和值
HKEYS key # 获取所有字段
HVALS key # 获取所有值
HDEL key field # 删除字段
HEXISTS key field # 判断字段是否存在
# 批量操作
HMSET key field1 value1 field2 value2 # 设置多个字段
HMGET key field1 field2 # 获取多个字段值
# 数值操作
HINCRBY key field increment # 字段值增加整数
HINCRBYFLOAT key field increment # 字段值增加浮点数
# 其他操作
HLEN key # 获取字段数量
HSTRLEN key field # 获取字段值长度
应用场景
1. 存储用户信息
# 设置用户信息
HSET user:1001 name "张三"
HSET user:1001 age "25"
HSET user:1001 email "zhangsan@example.com"
# 获取用户信息
HGETALL user:1001
# 获取特定字段
HGET user:1001 name
# 更新用户年龄
HINCRBY user:1001 age 1
2. 购物车
# 添加商品到购物车
HSET cart:1001 product:1001 2
HSET cart:1001 product:1002 1
# 获取购物车商品
HGETALL cart:1001
# 更新商品数量
HINCRBY cart:1001 product:1001 1
# 删除商品
HDEL cart:1001 product:1001
3.3 List类型详解
List类型特点
- 有序的字符串列表
- 支持双端操作
- 可以实现队列和栈
常用命令
# 添加元素
LPUSH key value1 value2 # 从左侧插入
RPUSH key value1 value2 # 从右侧插入
LINSERT key BEFORE|AFTER pivot value # 在指定元素前后插入
# 删除元素
LPOP key # 从左侧弹出
RPOP key # 从右侧弹出
LREM key count value # 删除指定元素
# 查询元素
LLEN key # 获取列表长度
LINDEX key index # 获取指定索引的元素
LRANGE key start stop # 获取范围内的元素
# 其他操作
LTRIM key start stop # 修剪列表
LSET key index value # 设置指定索引的值
应用场景
1. 消息队列
# 生产者
LPUSH queue:task "task1"
LPUSH queue:task "task2"
# 消费者
RPOP queue:task
# 阻塞式消费
BRPOP queue:task 0
2. 最新列表
# 添加最新文章
LPUSH recent:articles "article:1001"
LPUSH recent:articles "article:1002"
# 获取最新10篇文章
LRANGE recent:articles 0 9
# 保持列表长度
LTRIM recent:articles 0 9
3. 时间线
# 添加动态
LPUSH timeline:user:1001 "动态1"
LPUSH timeline:user:1001 "动态2"
# 获取用户动态
LRANGE timeline:user:1001 0 -1
3.4 Set类型详解
Set类型特点
- 无序的字符串集合
- 不允许重复元素
- 支持集合运算
常用命令
# 元素操作
SADD key member1 member2 # 添加成员
SREM key member # 删除成员
SPOP key # 随机弹出成员
SMOVE source destination member # 移动成员
# 查询操作
SMEMBERS key # 获取所有成员
SCARD key # 获取成员数量
SISMEMBER key member # 判断成员是否存在
SRANDMEMBER key count # 随机获取成员
# 集合运算
SINTER key1 key2 # 交集
SUNION key1 key2 # 并集
SDIFF key1 key2 # 差集
# 其他操作
SINTERSTORE destination key1 key2 # 交集并存储
SUNIONSTORE destination key1 key2 # 并集并存储
SDIFFSTORE destination key1 key2 # 差集并存储
应用场景
1. 标签系统
# 添加标签
SADD article:1001:tags "Redis" "数据库" "缓存"
# 获取标签
SMEMBERS article:1001:tags
# 删除标签
SREM article:1001:tags "缓存"
2. 共同好友
# 添加好友
SADD user:1001:friends "1002" "1003" "1004"
SADD user:1002:friends "1001" "1003" "1005"
# 获取共同好友
SINTER user:1001:friends user:1002:friends
3. 抽奖系统
# 添加抽奖用户
SADD lottery:users "user1" "user2" "user3"
# 随机抽取中奖用户
SRANDMEMBER lottery:users 1
# 抽取并移除
SPOP lottery:users
3.5 ZSet类型详解
ZSet类型特点
- 有序的字符串集合
- 每个成员关联一个分数
- 按分数排序
- 分数可以重复
常用命令
# 元素操作
ZADD key score1 member1 score2 member2 # 添加成员
ZREM key member1 member2 # 删除成员
ZINCRBY key increment member # 增加成员分数
# 查询操作
ZCARD key # 获取成员数量
ZSCORE key member # 获取成员分数
ZRANK key member # 获取成员排名(从低到高)
ZREVRANK key member # 获取成员排名(从高到低)
# 范围查询
ZRANGE key start stop [WITHSCORES] # 获取范围内的成员(从低到高)
ZREVRANGE key start stop [WITHSCORES] # 获取范围内的成员(从高到低)
ZRANGEBYSCORE key min max [WITHSCORES] # 按分数范围获取
ZREVRANGEBYSCORE key max min [WITHSCORES] # 按分数范围获取(倒序)
# 其他操作
ZCOUNT key min max # 统计分数范围内的成员数
ZREMRANGEBYRANK key start stop # 按排名删除
ZREMRANGEBYSCORE key min max # 按分数范围删除
应用场景
1. 排行榜
# 添加分数
ZADD leaderboard 100 "user1" 95 "user2" 90 "user3"
# 获取前10名
ZREVRANGE leaderboard 0 9 WITHSCORES
# 获取用户排名
ZREVRANK leaderboard "user1"
# 更新分数
ZINCRBY leaderboard 5 "user3"
2. 延迟队列
# 添加任务(时间戳作为分数)
ZADD delayed:queue 1704067200 "task1"
ZADD delayed:queue 1704067260 "task2"
# 获取到期任务
ZRANGEBYSCORE delayed:queue -inf 1704067200
# 删除已执行任务
ZREM delayed:queue "task1"
3. 限流
# 添加访问记录
ZADD limit:user:1001 1704067200 "request1"
ZADD limit:user:1001 1704067201 "request2"
# 删除过期记录
ZREMRANGEBYSCORE limit:user:1001 -inf 1704067100
# 获取当前请求数
ZCARD limit:user:1001
3.6 Bitmap类型详解
Bitmap类型特点
- 基于String类型实现
- 位图操作
- 节省空间
- 适合统计
常用命令
# 位操作
SETBIT key offset value # 设置位值
GETBIT key offset # 获取位值
# 统计操作
BITCOUNT key [start end] # 统计设置为1的位数
BITOP operation destkey key1 key2 ... # 位运算
# 其他操作
BITPOS key bit [start end] # 查找第一个指定值的位置
应用场景
1. 用户签到
# 用户签到
SETBIT sign:2023:1001 0 1
SETBIT sign:2023:1001 1 1
SETBIT sign:2023:1001 2 0
# 获取签到状态
GETBIT sign:2023:1001 0
# 统计签到天数
BITCOUNT sign:2023:1001
2. 在线用户
# 用户上线
SETBIT online:2023-01-01 1001 1
SETBIT online:2023-01-01 1002 1
# 用户下线
SETBIT online:2023-01-01 1001 0
# 统计在线用户数
BITCOUNT online:2023-01-01
3. 用户特征
# 设置用户特征
SETBIT user:1001:features 0 1 # 性别
SETBIT user:1001:features 1 0 # 年龄段
SETBIT user:1001:features 2 1 # 地区
# 获取用户特征
GETBIT user:1001:features 0
# 查找相似用户
BITOP AND similar user:1001:features user:1002:features
BITCOUNT similar
3.7 HyperLogLog类型详解
HyperLogLog类型特点
- 基数统计
- 空间占用小(12KB)
- 误差率约0.81%
- 适合大数据量统计
常用命令
PFADD key element1 element2 ... # 添加元素
PFCOUNT key1 key2 ... # 统计基数
PFMERGE destkey key1 key2 ... # 合并多个HyperLogLog
应用场景
1. UV统计
# 添加访问用户
PFADD daily:uv:2023-01-01 "user1" "user2" "user3"
# 获取UV数
PFCOUNT daily:uv:2023-01-01
# 统计多日UV
PFADD daily:uv:2023-01-02 "user1" "user4"
PFMERGE total:uv daily:uv:2023-01-01 daily:uv:2023-01-02
PFCOUNT total:uv
2. 独立IP统计
# 添加IP
PFADD daily:ip:2023-01-01 "192.168.1.1" "192.168.1.2"
# 获取独立IP数
PFCOUNT daily:ip:2023-01-01
3.8 Geo类型详解
Geo类型特点
- 地理位置存储
- 基于ZSet实现
- 支持距离计算
- 支持范围查询
常用命令
# 位置操作
GEOADD key longitude latitude member1 ... # 添加位置
GEOPOS key member1 member2 ... # 获取位置
GEODIST key member1 member2 [unit] # 计算距离
# 范围查询
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
# 其他操作
GEOHASH key member1 member2 ... # 获取Geohash
应用场景
1. 附近的人
# 添加用户位置
GEOADD users:location 116.404 39.915 "user1"
GEOADD users:location 116.407 39.918 "user2"
# 查找附近的人
GEORADIUS users:location 116.404 39.915 1 km WITHDIST WITHCOORD
# 计算距离
GEODIST users:location "user1" "user2" km
2. 附近店铺
# 添加店铺位置
GEOADD shops:location 116.404 39.915 "shop1"
GEOADD shops:location 116.407 39.918 "shop2"
# 查找附近店铺
GEORADIUS shops:location 116.404 39.915 2 km WITHDIST
3. 配送范围
# 添加配送点
GEOADD delivery:points 116.404 39.915 "point1"
GEOADD delivery:points 116.407 39.918 "point2"
# 检查是否在配送范围内
GEORADIUS delivery:points 116.405 39.916 1 km


