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

最佳实践

  1. 选择合适的数据类型:根据业务场景选择最适合的数据结构
  2. 控制key的大小:避免过长的key名称
  3. 合理设置过期时间:防止内存泄漏
  4. 使用pipeline:批量操作提高性能
  5. 监控内存使用:定期检查内存占用情况
  6. 避免大key:单个key的value不要过大

总结

Redis的多种数据类型为不同的应用场景提供了灵活的解决方案。理解每种数据类型的特性和适用场景,能够帮助我们更好地设计和优化Redis的使用方案。