【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确保相关数据在同一节点)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/907009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用matlab提取abaqus odb文件中的节点信息

在MATLAB中提取Abaqus ODB文件中的节点信息&#xff0c;可以通过以下几种方法实现&#xff1a; 方法1&#xff1a;使用MATLAB的ABAQUS Interface工具箱 https://wenku.csdn.net/answer/77axwtqnys 可以参考这个 MATLAB的ABAQUS Interface工具箱提供了直接读取ODB文件的功能。…

【Java】异常处理

1.异常的概念 在程序运行时&#xff0c;打断正常程序流程的不正常情况分两类: 1.错误(Error)&#xff1a;应用程序无法捕获的严重问题(自己无法处理) 例&#xff1a; 虚拟机相关的问题&#xff0c;如虚拟机崩溃、动态链接失败、低层资源错误等 总是不受编译器检查的&#xff0…

Linux(Centos 7.6)命令详解:tar

1.命令作用 命令tar将许多文件一起保存到单个磁带或磁盘存档中&#xff0c;并且可以从存档中恢复单个文件(GNU tar saves many files together into a single tape or disk archive, and can restore individual files from the archive.)。 2.命令语法 Usage: tar [OPTION.…

企业网络综合实训

企业网络综合实训 任务描述&#xff1a; 公司的中心机房、办公区一和办公区二位于同一园区。要求各大楼之间要互通&#xff0c;并且均能访问Internet&#xff1b;同时公司业务需要对外拓展&#xff0c;需要在Internet数据中心机房部署一台对外提供DNS和Web站点服务的服务器。…

8天Python从入门到精通【itheima】-41~44

目录 41节-while循环的嵌套应用 1.学习目标 2.while循环的伪代码和生活情境中的应用 3.图片应用的代码案例 4.代码实例【Patrick自己亲手写的】&#xff1a; 5.whlie嵌套循环的注意点 6.小节总结 42节-while循环的嵌套案例-九九乘法表 1.补充知识-print的不换行 2.补充…

探索Linux互斥:线程安全与资源共享

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 互斥是并发编程中避免竞争条件和保护共享资源的核心技术。通过使用锁或信号量等机制&#xff0c;能够确保多线程或多进程环境下对共享资源的安全访问&#xff0c;避免数据不一致、死锁等问题。 竞争条件 竞…

《Stable Diffusion 3.0企业级落地指南》——技术赋能与商业价值的深度融合实践

Stable Diffusion 3.0&#xff08;SD3&#xff09;作为当前多模态生成式AI技术的集大成者&#xff0c;凭借其创新的扩散Transformer架构&#xff08;DiT&#xff09;、流匹配&#xff08;Flow Matching&#xff09;技术以及超分辨率生成能力&#xff0c;正在重塑企业内容生产的…

基于本地模型+多级校验设计的高效缓存,有效节省token数量(有点鸡肋doge)。

前言 我是基于token有限而考虑的一个省钱方案&#xff0c;还能够快速返回结果&#xff0c;但是劣势也很明显&#xff0c;设计不好容易出问题&#xff0c;就如下面所介绍的语义飘逸和缓存污染&#xff0c;我认为在自己学习大模型的过程用来省钱非常可以&#xff0c;再加上学习过…

网络安全全知识图谱:威胁、防护、管理与发展趋势详解

1 网络安全基础概念 1.1 什么是网络安全 网络安全是指通过技术、管理和法律等手段&#xff0c;保护计算机网络系统中的硬件、软件及其系统中的数据&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露&#xff0c;确保系统连续可靠正常地运行&#xff0c;网络服务不…

远控安全进阶之战:TeamViewer/ToDesk/向日葵设备安全策略对比

【作者主页】Francek Chen 【文章摘要】在数字化时代&#xff0c;卓越的远程控制软件需兼顾功能与体验&#xff0c;包括流畅连接、高清画质、低门槛UI设计、毫秒级延迟及多功能性&#xff0c;同时要有独树一帜的远控安全技术&#xff0c;通过前瞻性安全策略阻挡网络风险&#x…

Steam发布游戏过程的若干问题

我没有想到在Steam发布游戏的过程会比做游戏的过程更困难&#xff0c;更恶心。 注册Steamworks 税务采访 税务采访部分填的地址要和后面它们要求你发证件照片里的地址一样。护照里因为没有地址不会通过&#xff0c;我用的驾照里面有地址。没有驾照可以用身份证。 应用准备界…

开搞:第四个微信小程序:图上县志

原因&#xff1a;我换了一个微信号来搞&#xff0c;因为用同一个用户&#xff0c;备案只能一个个的来。这样不行。所以我换了一个。原来注册过小程序。现在修改即可。注意做好计划后&#xff0c;速度备案和审核&#xff0c;不然你时间浪费不起。30元花起。 结构&#xff1a; -…

第三十七天打卡

知识点回顾&#xff1a; 过拟合的判断&#xff1a;测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint&#xff0c;还包含训练状态 早停策略 作业&#xff1a;对信贷数据集训练后保存权重&#xff0c;加载权重后继续训练50轮&#x…

Java高频面试之并发编程-21

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;详细说说AQS AQS&#xff08;AbstractQueuedSynchronizer&#xff09;是 Java 并发包&#xff08;java.util.concurre…

按键状态机

原工程地址&#xff1a;https://github.com/candylife9/state_machine_example 视频&#xff1a;C语言之状态机编程_02_状态机使用案例分析_哔哩哔哩_bilibili 我觉得讲的挺好的。 来自豆包封装的通用接口 头文件 /*** file key_state_machine.h* brief 通用按键状态机接口…

华为OD机试真题——新学校选址(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

欧拉操作系统下安装hadoop集群

背景&#xff1a;欧拉操作系统下安装CDH集群的时候&#xff0c;需要安装python2.7.5&#xff0c;但是本身欧拉系统对python2的支持可能没有那么好&#xff0c;所以考虑搭建原生的hadoop集群。 基础环境如下 组件名称组件版本欧拉VERSION“22.03 (LTS-SP4)”jdkopenjdk versio…

SQL语句的执行流程

文章目录 一、执行流程二、建立连接三、预处理器四、解析器4.1 词法分析4.2 语法分析4.3 语义分析 五、优化器六、执行器七、返回结果 一、执行流程 阶段主要功能关键组件1. 建立连接身份验证、权限检查连接器2. 预处理器缓存检查、SQL预处理查询缓存3. 解析器词法分析、语法分…

TiDB:从快速上手到核心原理与最佳实践

文章目录 引言第一部分&#xff1a;TiDB快速体验与实践指南1. TiDB概述2. TiDB部署方式2.1 本地测试环境部署2.2 生产环境部署2.3 Kubernetes部署2.4 云服务 3. TiDB基本操作3.1 连接TiDB3.2 数据库和表操作3.3 分区表3.4 事务操作 4. 数据迁移到TiDB4.1 从MySQL迁移4.2 使用Ti…

总结:进程和线程的联系和区别

前言:通过学习javaEE初阶中的多线程章节后加上我自己的理解,想来总结一下线程和进程的联系和区别. 一来是能更好地复习知识,二来是为了记录我的学习路程,相信未来的我回首不会忘记这段难忘的经历. 1.进程 先来谈谈进程:进程是操作系统中资源分配的基本单位. 1)进程的执行方…