Redis提供了多种数据结构模式,包括字符串、哈希、列表、集合、有序集合、位图、HyperLogLog、地理空间索引和流等。根据你的数据存储需求选择合适的模式:缓存使用字符串或哈希,会话存储用列表或哈希,排行榜用有序集合,位置服务用GEO,实时日志用流。以下是直接教程:快速选择指南——1. 需要简单键值对?用String。2. 对象存储?用Hash。3. 队列或栈?用List。4. 唯一成员?用Set。5. 排序列表?用Sorted Set。示例代码:redis.set('user:1', '{"name":"Alice","age":30}'); redis.hset('user:profile:1', 'name', 'Bob'); redis.lpush('queue', 'task1'); 这就是适合你的方案起点。
Redis字符串模式
Redis的String是最基础的数据类型,可以存储字符串、整数、浮点数甚至二进制数据。String类型非常适合用作缓存,因为它简单高效。比如,你可以用它来缓存用户的信息、API响应结果等。SET key value命令设置值,GET key获取值,DEL key删除键。String还支持原子递增操作如INCR,用于计数器场景,比如访问次数统计。它的最大容量是512MB,非常适合存储大块文本或序列化对象。
哈希模式的应用
Hash类似于一个小型的key-value存储,可以用来表示对象,比如用户信息:id作为顶级key,属性如name、age、email作为field。HSET user:1000 name "John" age 30,HMGET获取多个field。Hash节省内存,比多个String更高效,尤其适合存储结构化数据如用户 profile 或配置项。适合电商商品详情、用户信息等频繁更新的场景。
列表List模式
List是双向链表,支持从头部或尾部插入和弹出元素,非常适合实现队列、栈或消息列表。比如聊天记录、任务队列:LPUSH chatroom "hello",RPOP获取并移除。List可以用作最近访问列表,通过LTRIM保持固定长度。Redis List是线程安全的,适合多生产者多消费者模式,如实时消息系统。
集合Set模式
Set是无序的、不重复的字符串集合,SADD添加成员,SMEMBERS获取所有,SINTER求交集,SUNION并集。非常适合标签系统、好友列表、抽奖池等需要唯一性和集合运算的场景。比如用户标签:SADD user:1000:tags "java" "redis" "cache"。Set操作原子性强,效率高。
有序集合Sorted Set
Sorted Set每个成员都有一个分数(score),按分数排序。ZADD leaderboard 100 "player1" 200 "player2",ZRANGE 0 -1 WITHSCORES获取排行榜。完美用于排行榜、优先级队列、时间线。分数可以是时间戳,实现按时间排序的动态集合。
GEO地理位置模式
Redis 3.2引入GEO,支持经纬度存储和位置查询。GEOADD sicily 13.361389 46.800000 "Palermo",GEORADIUS查询半径内位置,GEODIST计算两点距离。适合附近的人、门店搜索等LBS服务。返回结果包括距离和方向。
Stream模式新特性
Redis 5.0的Stream是日志式数据结构,支持消费者组,像Kafka-lite。XADD stream * field value,XREAD读取消息,XGROUP创建组。适合实时日志、事件流、消息队列。Stream支持持久化和 Exactly-Once语义。
FAQ
Q: Redis哪种模式适合缓存?
A: String或Hash最简单高效。
Q: 如何实现排行榜?
A: 用Sorted Set,ZADD和ZRANGE。
Q: 位置服务用什么?
A: GEO类型,GEOADD和GEORADIUS。
Q: 队列怎么做?
A: List用LPUSH/RPOP,或Stream更高级。
Q: 内存怎么优化?
A: 选择合适结构如Hash代替多个String。