Redis作为当今最流行的内存数据库之一,其核心优势在于丰富的数据类型支持。不同于传统关系型数据库的二维表结构,Redis提供了5种基础数据类型和4种扩展数据类型,每种类型都针对特定场景进行了深度优化。
我在实际生产环境中发现,90%的Redis使用问题都源于数据类型选择不当。比如曾遇到一个案例:某电商平台用String类型存储商品库存,当需要执行"库存大于100的商品打9折"这类操作时,不得不取出所有数据在应用层过滤,导致性能瓶颈。后来改用Sorted Set重构,查询性能提升了20倍。
String(字符串):
List(列表):
Hash(哈希表):
Set(集合):
Sorted Set(有序集合):
Bitmaps:
HyperLogLog:
GEO:
Stream:
需要原子计数器?
需要维护有序集合?
bash复制ZADD leaderboard 100 "player1"
ZREVRANGE leaderboard 0 9 WITHSCORES
需要去重集合运算?
需要存储对象属性?
内存敏感场景:
bash复制hash-max-ziplist-entries 512
hash-max-ziplist-value 64
吞吐量优先场景:
持久化考量:
时间序列存储方案:
社交关系图谱:
python复制# 用户A关注用户B
redis.sadd('user:A:following', 'user:B')
redis.sadd('user:B:followers', 'user:A')
# 用户B发帖,粉丝时间线
post_id = create_post('user:B', 'Hello world')
followers = redis.smembers('user:B:followers')
for follower in followers:
redis.zadd(f'{follower}:timeline', {post_id: time.time()})
Multi/Exec陷阱:
CAS模式实现:
lua复制local current = redis.call('GET', KEYS[1])
if current == ARGV[1] then
return redis.call('SET', KEYS[1], ARGV[2])
end
return nil
小对象存储优化:
bash复制# 存储100个字段的Hash
HSET user:1000 name "John" age 30 ...(98个字段)
# 内存对比
redis-memory-for-key user:1000
大Key拆分策略:
高危命令黑名单:
管道化批量操作:
python复制pipe = redis.pipeline()
for i in range(1000):
pipe.set(f'key:{i}', i)
pipe.execute()
Lua脚本最佳实践:
缓存雪崩事故:
python复制expire_time = base_time + random.randint(0, 300)
热点Key问题:
关键监控项:
健康检查脚本:
bash复制#!/bin/bash
used_memory=$(redis-cli info | grep 'used_memory:' | cut -d: -f2)
max_memory=$(redis-cli config get maxmemory | tail -n1)
if [ $(($used_memory * 100 / $max_memory)) -gt 90 ]; then
echo "Memory alert!" | mail -s "Redis Warning" admin@example.com
fi
Redis 7.0在数据类型方面的重要改进:
在实际使用中我发现,新版本对大数据量的Hash和Sorted Set性能提升明显。某次迁移测试显示,存储百万级会员数据的Hash表查询性能提升了约40%,内存占用减少了15%。不过需要注意新版客户端的兼容性问题,建议先在测试环境验证。