当前位置: 首页 > news >正文

【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 3SCARD uv:202406)。
    • 社交关系(共同关注:SINTER follow:user1 follow:user2)。
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");

五、注意事项

  1. 大Key问题:避免单个Key存储过多数据(如List超过百万元素),影响性能。
  2. 内存优化:优先使用压缩存储结构(如Hash比String更节省空间)。
  3. 持久化策略:根据业务选择RDB或AOF,避免数据丢失。
  4. 集群模式:分布式场景需考虑数据分片(如Hash Tag确保相关数据在同一节点)。

相关文章:

  • 29. 自动化测试开发框架拓展之接口测试
  • 堆栈计算机 零地址指令
  • Voice Conversion语音转换
  • Python5.26打卡(day27)
  • 解决虚拟机挂起后,docker容器无法访问的问题
  • 电子电路:什么是感应电动势?
  • Java 版本升级指南:从 Java 8 到 Java 11/17/21 的核心优势与新特性
  • 学习心得(17--18)Flask表单
  • SCADA|KingSCADA信创4.0-Win10安装过程
  • geo ai库本地运行测试的坑
  • IndexTTS - B 站推出的文本转语音模型,支持拼音纠正汉字发音(附整合包)
  • 尚硅谷redis7 37-39 redis持久化之AOF简介
  • 开发一个交易所大概需要多少成本
  • RPM之(1)基础使用
  • 【四】频率域滤波(下)【830数字图像处理】
  • 机械设计插件
  • 洛谷题目:P2785 物理1(phsic1)- 磁通量 题解 (本题较难)
  • 【教学类-36-09】20250526动物面具描边(通义万相)对称图40张,根据图片长宽,自动旋转图片,最大化图片
  • top查看 CPU使用情况
  • 考研408《计算机组成原理》复习笔记,第二章(3)数值数据的运算(浮点数计算篇)
  • 厦门手机网站建设公司/品牌推广外包
  • 化妆品网站建设策划书/网站设计公司模板
  • 高职图书馆网站建设大赛/网站搭建谷歌seo
  • 漳州 外贸网站建设 SEO/百度关键词广告怎么收费
  • 阜阳网站建设云平台/seo如何优化排名
  • 网站换空间上怎么办/移动网站推广如何优化