【Redis】第2节|Redis基本数据类型
一、基础数据结构
1. String(字符串)
- 特点:二进制安全,支持字符串、数值存储,原子性操作。
- 核心操作:
SET key value # 存储键值对
GET key # 获取值
INCR key # 数值自增1
SETEX key seconds val # 存储带过期时间的值
- 应用场景:
- 单值缓存(如用户余额:
SET user:1:balance 1000
)。 - 分布式锁(
SET lock:order 1 NX EX 10
)。 - 计数器(如点赞数:
INCR post:1:like
)。
- 单值缓存(如用户余额:
2. Hash(哈希表)
- 特点:字段(field)与值(value)的映射,适合存储对象。
- 核心操作:
HSET user:1 name "roy" balance 1888 # 存储对象
HMGET user:1 name balance # 批量获取字段
HINCRBY user:1 balance 100 # 字段值自增
- 应用场景:
- 结构化数据存储(如用户信息:
HSET user:1 id 1 name "roy"
)。 - 电商购物车(用户ID为key,商品ID为field,数量为value)。
- 结构化数据存储(如用户信息:
3. List(列表)
- 特点:双向链表,支持头部/尾部快速操作,按索引访问中间元素效率低。
- 核心操作:
LPUSH list:msgs "msg1" "msg2" # 左插入元素
RPOP list:msgs # 右弹出元素
LRANGE list:msgs 0 -1 # 获取所有元素
- 应用场景:
- 消息队列(LPUSH + RPOP实现队列,LPUSH + LPOP实现栈)。
- 排行榜滚动数据(如最近10条消息:
LRANGE list:msgs 0 9
)。
4. Set(集合)
- 特点:无序、唯一元素,支持交集、并集、差集运算。
- 核心操作:
SADD set:users 1 2 3 # 添加元素
SMEMBERS set:users # 获取所有元素
SINTER set:A set:B # 交集运算
- 应用场景:
- 去重统计(如UV统计:
SADD uv:202406 1 2 3
,SCARD uv:202406
)。 - 社交关系(共同关注:
SINTER follow:user1 follow:user2
)。
- 去重统计(如UV统计:
5. ZSet(有序集合)
- 特点:元素关联分值(score),按分值排序,支持范围查询。
- 核心操作:
ZADD rank:202406 100 "user1" 90 "user2" # 添加带分值元素
ZREVRANGE rank:202406 0 9 WITHSCORES # 倒序获取前10名
ZINCRBY rank:202406 5 "user1" # 分值自增
- 应用场景:
- 排行榜(如成绩排名、点赞排名)。
- 时间线(按时间戳排序的动态列表)。
二、高级数据结构
1. Bitmap(位图)
- 特点:基于二进制位存储,节省空间,适合统计状态(如签到、在线状态)。
- 核心操作:
SETBIT sign:202406 1 1 # 用户1在第1天签到(offset从0开始)
GETBIT sign:202406 1 # 查询签到状态
BITCOUNT sign:202406 # 统计总签到次数
- 应用场景:
- 每日签到(
SETBIT
标记日期,BITCOUNT
统计天数)。 - 活跃用户统计(按天标记在线状态)。
- 每日签到(
2. HyperLogLog(基数统计)
- 特点:近似统计不重复元素个数,内存占用固定(约12KB),存在误差(<1%)。
- 核心操作:
PFADD hll:uv 1 2 3 # 添加元素
PFCOUNT hll:uv # 统计UV数
PFMERGE hll:uv_week hll:uv_day1 hll:uv_day7 # 合并多日统计
- 应用场景:
- 大规模UV统计(如网站日活、月活)。
3. Geo(地理空间索引)
- 特点:存储经纬度,支持距离计算、范围查询。
- 核心操作:
GEOADD cities 113.017 28.2 "Changsha" 120.15 30.2 "Hangzhou" # 添加地点
GEODIST cities "Changsha" "Hangzhou" KM # 计算距离(公里)
GEORADIUS cities 113 28 5 KM WITHCOORD # 查询5公里内的地点并返回坐标
- 应用场景:
- 附近推荐(如外卖商家、共享单车定位)。
4. Stream(流)
- 特点:Redis实现的消息队列,支持生产者-消费者模型,自动生成消息ID。
- 核心操作:
XADD stream:msg * user "roy" content "hello" # 添加消息(*自动生成ID)
XGROUP CREATE stream:msg group1 0 # 创建消费者组
XREADGROUP GROUP group1 consumer1 COUNT 10 STREAMS stream:msg > # 消费消息
- 应用场景:
- 轻量级消息队列(替代Kafka/RabbitMQ的简单场景)。
三、数据结构选型指南
场景 | 推荐结构 | 理由 |
单值缓存 | String | 简单高效,支持过期时间 |
对象存储 | Hash | 字段结构化,节省内存 |
消息队列 | List/Stream | List实现简单队列,Stream支持消费者组 |
去重统计 | Set | 唯一元素特性 |
排行榜 | ZSet | 分值排序,范围查询高效 |
签到统计 | Bitmap | 位操作节省空间 |
地理位置查询 | Geo | 经纬度索引与距离计算 |
大规模UV统计 | HyperLogLog | 内存固定,适合亿级数据 |
四、Spring Boot集成Redis
1. Maven依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. 核心配置(application.properties
)
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=your-password
spring.redis.database=0 # 数据库索引(默认0)
3. RedisTemplate配置(解决中文乱码)
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);// 字符串序列化(解决key和value中文乱码)StringRedisSerializer stringSerializer = new StringRedisSerializer();template.setKeySerializer(stringSerializer);template.setValueSerializer(stringSerializer);// Hash类型序列化template.setHashKeySerializer(stringSerializer);template.setHashValueSerializer(stringSerializer);return template;
}
4. 操作示例
@Autowired
private RedisTemplate<String, Object> redisTemplate;// String操作
redisTemplate.opsForValue().set("key", "value");
String value = (String) redisTemplate.opsForValue().get("key");// Hash操作
redisTemplate.opsForHash().put("user:1", "name", "roy");
String name = (String) redisTemplate.opsForHash().get("user:1", "name");
五、注意事项
- 大Key问题:避免单个Key存储过多数据(如List超过百万元素),影响性能。
- 内存优化:优先使用压缩存储结构(如Hash比String更节省空间)。
- 持久化策略:根据业务选择RDB或AOF,避免数据丢失。
- 集群模式:分布式场景需考虑数据分片(如Hash Tag确保相关数据在同一节点)。