Redis基本数据类型
Redis基本数据类型
概述
Redis支持多种数据类型,每种类型都有其特定的使用场景和操作命令。理解这些数据类型的特性和应用场景是高效使用Redis的基础。
String(字符串)
特性
- 最基本的数据类型
- 二进制安全,可存储任何数据
- 最大512MB
- 支持数值操作
常用命令
bash
# 基本操作
SET key value
GET key
DEL key
# 批量操作
MSET key1 value1 key2 value2
MGET key1 key2
# 数值操作
INCR counter
INCRBY counter 5
DECR counter
DECRBY counter 3
# 字符串操作
APPEND key value
STRLEN key
GETRANGE key start end
SETRANGE key offset value
# 基本操作
SET key value
GET key
DEL key
# 批量操作
MSET key1 value1 key2 value2
MGET key1 key2
# 数值操作
INCR counter
INCRBY counter 5
DECR counter
DECRBY counter 3
# 字符串操作
APPEND key value
STRLEN key
GETRANGE key start end
SETRANGE key offset value
应用场景
bash
# 1. 缓存
SET user:1001 '{"name":"John","age":30}'
# 2. 计数器
INCR page_views
INCR user:1001:login_count
# 3. 分布式锁
SET lock:resource "locked" EX 30 NX
# 4. 会话存储
SET session:abc123 '{"user_id":1001,"login_time":"2023-01-01"}' EX 3600
# 1. 缓存
SET user:1001 '{"name":"John","age":30}'
# 2. 计数器
INCR page_views
INCR user:1001:login_count
# 3. 分布式锁
SET lock:resource "locked" EX 30 NX
# 4. 会话存储
SET session:abc123 '{"user_id":1001,"login_time":"2023-01-01"}' EX 3600
Hash(哈希)
特性
- 键值对集合
- 适合存储对象
- 内存优化的数据结构
常用命令
bash
# 基本操作
HSET user:1001 name "John" age 30
HGET user:1001 name
HGETALL user:1001
HDEL user:1001 age
# 批量操作
HMSET user:1001 name "John" age 30 email "[email protected]"
HMGET user:1001 name age
# 数值操作
HINCRBY user:1001 age 1
HINCRBYFLOAT user:1001 score 1.5
# 检查操作
HEXISTS user:1001 name
HKEYS user:1001
HVALS user:1001
HLEN user:1001
# 基本操作
HSET user:1001 name "John" age 30
HGET user:1001 name
HGETALL user:1001
HDEL user:1001 age
# 批量操作
HMSET user:1001 name "John" age 30 email "[email protected]"
HMGET user:1001 name age
# 数值操作
HINCRBY user:1001 age 1
HINCRBYFLOAT user:1001 score 1.5
# 检查操作
HEXISTS user:1001 name
HKEYS user:1001
HVALS user:1001
HLEN user:1001
应用场景
bash
# 1. 用户信息存储
HMSET user:1001 name "John" age 30 email "[email protected]"
# 2. 购物车
HSET cart:user1001 product1 2 product2 1
# 3. 统计信息
HINCRBY stats:2023-01-01 page_views 1
HINCRBY stats:2023-01-01 unique_visitors 1
# 1. 用户信息存储
HMSET user:1001 name "John" age 30 email "[email protected]"
# 2. 购物车
HSET cart:user1001 product1 2 product2 1
# 3. 统计信息
HINCRBY stats:2023-01-01 page_views 1
HINCRBY stats:2023-01-01 unique_visitors 1
List(列表)
特性
- 有序的字符串列表
- 支持双端操作
- 最大长度2^32-1
常用命令
bash
# 插入操作
LPUSH mylist value1 value2 # 左侧插入
RPUSH mylist value3 value4 # 右侧插入
LINSERT mylist BEFORE value2 new_value
# 获取操作
LRANGE mylist 0 -1 # 获取所有元素
LINDEX mylist 0 # 获取指定位置元素
LLEN mylist # 获取长度
# 删除操作
LPOP mylist # 左侧弹出
RPOP mylist # 右侧弹出
LREM mylist 2 value # 删除指定值
# 阻塞操作
BLPOP mylist 10 # 阻塞左侧弹出
BRPOP mylist 10 # 阻塞右侧弹出
# 插入操作
LPUSH mylist value1 value2 # 左侧插入
RPUSH mylist value3 value4 # 右侧插入
LINSERT mylist BEFORE value2 new_value
# 获取操作
LRANGE mylist 0 -1 # 获取所有元素
LINDEX mylist 0 # 获取指定位置元素
LLEN mylist # 获取长度
# 删除操作
LPOP mylist # 左侧弹出
RPOP mylist # 右侧弹出
LREM mylist 2 value # 删除指定值
# 阻塞操作
BLPOP mylist 10 # 阻塞左侧弹出
BRPOP mylist 10 # 阻塞右侧弹出
应用场景
bash
# 1. 消息队列
LPUSH message_queue "task1"
BRPOP message_queue 0
# 2. 最新动态
LPUSH user:1001:timeline "发布了新动态"
LRANGE user:1001:timeline 0 9 # 获取最新10条
# 3. 日志记录
LPUSH app_logs "2023-01-01 10:00:00 INFO: Application started"
# 1. 消息队列
LPUSH message_queue "task1"
BRPOP message_queue 0
# 2. 最新动态
LPUSH user:1001:timeline "发布了新动态"
LRANGE user:1001:timeline 0 9 # 获取最新10条
# 3. 日志记录
LPUSH app_logs "2023-01-01 10:00:00 INFO: Application started"
Set(集合)
特性
- 无序的唯一字符串集合
- 支持集合运算
- 最大元素数量2^32-1
常用命令
bash
# 基本操作
SADD myset member1 member2
SMEMBERS myset
SREM myset member1
SCARD myset
# 检查操作
SISMEMBER myset member1
SRANDMEMBER myset 2
SPOP myset
# 集合运算
SUNION set1 set2 # 并集
SINTER set1 set2 # 交集
SDIFF set1 set2 # 差集
SUNIONSTORE result set1 set2 # 并集存储
# 基本操作
SADD myset member1 member2
SMEMBERS myset
SREM myset member1
SCARD myset
# 检查操作
SISMEMBER myset member1
SRANDMEMBER myset 2
SPOP myset
# 集合运算
SUNION set1 set2 # 并集
SINTER set1 set2 # 交集
SDIFF set1 set2 # 差集
SUNIONSTORE result set1 set2 # 并集存储
应用场景
bash
# 1. 标签系统
SADD user:1001:tags "java" "redis" "mysql"
SADD user:1002:tags "python" "redis" "mongodb"
SINTER user:1001:tags user:1002:tags # 共同标签
# 2. 好友关系
SADD user:1001:friends 1002 1003 1004
SISMEMBER user:1001:friends 1002
# 3. 去重统计
SADD unique_visitors:2023-01-01 user1001 user1002
SCARD unique_visitors:2023-01-01
# 1. 标签系统
SADD user:1001:tags "java" "redis" "mysql"
SADD user:1002:tags "python" "redis" "mongodb"
SINTER user:1001:tags user:1002:tags # 共同标签
# 2. 好友关系
SADD user:1001:friends 1002 1003 1004
SISMEMBER user:1001:friends 1002
# 3. 去重统计
SADD unique_visitors:2023-01-01 user1001 user1002
SCARD unique_visitors:2023-01-01
Sorted Set(有序集合)
特性
- 有序的唯一字符串集合
- 每个成员关联一个分数
- 支持范围查询
常用命令
bash
# 基本操作
ZADD leaderboard 100 "player1" 200 "player2"
ZRANGE leaderboard 0 -1 WITHSCORES
ZREM leaderboard "player1"
ZCARD leaderboard
# 分数操作
ZSCORE leaderboard "player1"
ZINCRBY leaderboard 50 "player1"
# 范围操作
ZRANGE leaderboard 0 9 # 按排名
ZRANGEBYSCORE leaderboard 100 200 # 按分数
ZREVRANGE leaderboard 0 9 # 逆序
# 排名操作
ZRANK leaderboard "player1" # 正序排名
ZREVRANK leaderboard "player1" # 逆序排名
# 基本操作
ZADD leaderboard 100 "player1" 200 "player2"
ZRANGE leaderboard 0 -1 WITHSCORES
ZREM leaderboard "player1"
ZCARD leaderboard
# 分数操作
ZSCORE leaderboard "player1"
ZINCRBY leaderboard 50 "player1"
# 范围操作
ZRANGE leaderboard 0 9 # 按排名
ZRANGEBYSCORE leaderboard 100 200 # 按分数
ZREVRANGE leaderboard 0 9 # 逆序
# 排名操作
ZRANK leaderboard "player1" # 正序排名
ZREVRANK leaderboard "player1" # 逆序排名
应用场景
bash
# 1. 排行榜
ZADD game_scores 1500 "player1" 1200 "player2"
ZREVRANGE game_scores 0 9 WITHSCORES # 前10名
# 2. 延时队列
ZADD delay_queue 1672531200 "task1" # 时间戳作为分数
ZRANGEBYSCORE delay_queue 0 $(date +%s) LIMIT 0 10
# 3. 热门文章
ZINCRBY hot_articles 1 "article:123"
ZREVRANGE hot_articles 0 9 # 最热门的10篇文章
# 1. 排行榜
ZADD game_scores 1500 "player1" 1200 "player2"
ZREVRANGE game_scores 0 9 WITHSCORES # 前10名
# 2. 延时队列
ZADD delay_queue 1672531200 "task1" # 时间戳作为分数
ZRANGEBYSCORE delay_queue 0 $(date +%s) LIMIT 0 10
# 3. 热门文章
ZINCRBY hot_articles 1 "article:123"
ZREVRANGE hot_articles 0 9 # 最热门的10篇文章
高级数据类型
HyperLogLog
bash
# 基数统计
PFADD unique_visitors user1 user2 user3
PFCOUNT unique_visitors
PFMERGE result uv:2023-01-01 uv:2023-01-02
# 基数统计
PFADD unique_visitors user1 user2 user3
PFCOUNT unique_visitors
PFMERGE result uv:2023-01-01 uv:2023-01-02
Bitmap
bash
# 位图操作
SETBIT user_login:2023-01-01 1001 1 # 用户1001今天登录
GETBIT user_login:2023-01-01 1001
BITCOUNT user_login:2023-01-01 # 今天登录用户数
# 位图操作
SETBIT user_login:2023-01-01 1001 1 # 用户1001今天登录
GETBIT user_login:2023-01-01 1001
BITCOUNT user_login:2023-01-01 # 今天登录用户数
Geospatial
bash
# 地理位置
GEOADD locations 116.397 39.916 "beijing" 121.473 31.230 "shanghai"
GEODIST locations "beijing" "shanghai" km
GEORADIUS locations 116.397 39.916 100 km
# 地理位置
GEOADD locations 116.397 39.916 "beijing" 121.473 31.230 "shanghai"
GEODIST locations "beijing" "shanghai" km
GEORADIUS locations 116.397 39.916 100 km
内存优化
编码方式
- String: int、embstr、raw
- Hash: ziplist、hashtable
- List: ziplist、linkedlist
- Set: intset、hashtable
- Sorted Set: ziplist、skiplist
配置优化
bash
# Hash优化
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
# List优化
list-max-ziplist-size -2
list-compress-depth 0
# Set优化
set-max-intset-entries 512
# Sorted Set优化
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# Hash优化
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
# List优化
list-max-ziplist-size -2
list-compress-depth 0
# Set优化
set-max-intset-entries 512
# Sorted Set优化
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
最佳实践
- 选择合适的数据类型:根据业务场景选择最适合的数据结构
- 控制key的大小:避免过长的key名称
- 合理设置过期时间:防止内存泄漏
- 使用pipeline:批量操作提高性能
- 监控内存使用:定期检查内存占用情况
- 避免大key:单个key的value不要过大
总结
Redis的多种数据类型为不同的应用场景提供了灵活的解决方案。理解每种数据类型的特性和适用场景,能够帮助我们更好地设计和优化Redis的使用方案。