Redis知识点和性能优化汇总(redis的性能瓶颈)
mhr18 2024-11-07 10:57 35 浏览 0 评论
1、Redis可用数据类型
Redis 支持多种数据类型,例如字符串、散列、列表、集合、有序集合、HyperLogLog、流、地理坐标等,每种类型都有对应的使用场景,同时也满足了所有开发者的需要。
2、Redis持久化方式
Redis持久化有下边三种方式:
- 快照,也就是RDB(Redis Database),将某一时刻内存中的数据,以二进制方式写入磁盘。
- 文件追加,即AOF(Append Only File),通过记录所有操作命令,然后用文本形式追加到文件结尾来实现。
- 混合持久化方式,这个是Redis 4.0后增加的方式。混合持久化方式结合了RDB和AOF的优点,在持久化的时候,先将内存中数据以RDB形式写入文件开头,然后再将后续的操作命令以AOF的形式追加到文件结尾。这样既保证了数据持久化,又保证了Redis的重启速度。
3、Redis事务
Redis 的事务从开始到结束要经历三个阶段:
- 开启事务
- 命令入列
- 执行事务/放弃事务
其中,开启事务使用 multi 命令,事务执行使用 exec 命令,放弃事务使用 discard 命令。
4、Redis性能优化点
- 缩短键值对的存储长度;
网上有很多关于Redis键值对长度对性能影响的测试案例,这里就不多说了。
优化的方案是我们在保证语义完整的情况下,尽量压缩键值对的长度,如果有必要,可以考虑将数据压缩后存储,以Java为例,我们可以将数据序列化,序列化可以用protobuff或者kryo,也可以将数据压缩存储,压缩可以考虑snappy。
- 使用 lazy free(延迟删除)特性;
lazy free 特性是 Redis 4.0 新增的一个非常实用的功能,它可以理解为惰性删除或延迟删除。意思是在删除的时候提供异步延时释放键值的功能,把键值释放操作放在单独的子线程处理中,以减少删除对 Redis 主线程的阻塞,可以有效地避免删除 big key 带来的性能和可用性问题。
- 设置键值的过期时间;
根据实际业务给键值设置合理的过期时间,这样redis会帮你自动清理过期数据,以达到节约内存的需要,也为了避免由于过多的键值堆积,频繁触发内存淘汰策略。
- 禁用耗时长的查询命令;
Redis命令中时间复杂度是O(N)的命令要格外关注,这个表示执行命令的不确定性。拿"keys pattern"来说,如果数据量较大,这个命令执行就会很慢。
Redis是单线程执行查询命令,如果命令很耗时,就会阻塞Redis,造成大量延时。
优化方式主要有:禁用keys命令;避免一次查询大量数据,可以采用scan命令,用游标模式查询;通过规则严格控制Hash、Set、Sorted Set 等等结构的数据大小;删除大数据时候采用异步方式。
- 使用 slowlog 优化耗时命令;
使用 slowlog 功能找出最耗时的 Redis 命令进行相关的优化,以提升 Redis 的运行速度。
- 使用 Pipeline 批量操作数据;
Pipeline(管道技术)是客户端提供的一种批处理技术,用于一次处理多个 Redis 命令,从而提高整个交互的性能。
- 避免大量数据同时失效;
由于Redis过期键删除策略原因,如果同时间大量数据失效,Redis会循环执行检查和删除操作,就会导致Redis读写卡顿,同时内存管理器清理内存,也会导致消耗一定的CPU。
- 客户端使用优化;
尽量采用Redis连接池,避免频繁创建消耗Redis连接。
- 限制 Redis 内存大小;
在64位操作系统中,Redis内存大小是没有限制的,这样就会导致物理内存不足的时候,Redis会使用交换空间,在内存和交换空间迁移数据时候,将会阻塞 Redis 进程,导致 Redis 出现延迟,从而影响 Redis 的整体性能。
- 使用物理机而非虚拟机安装 Redis 服务;
虚拟机在内存占用和网络传输上会有糟糕的表现,所以建议使用物理机。
- 检查数据持久化策略;
Redis 的持久化策略是将内存数据复制到硬盘上,这样才可以进行容灾恢复或者数据迁移,但维护持久化的功能,需要很大的性能开销。如果是非必要持久化业务,可以考虑关闭持久化功能。
- 使用分布式架构来增加读写速度;
采用Redis分布式架构,我们可以把写入放到主库上执行,把读功能转移到从服务上,因此就可以在单位时间内处理更多的请求,从而提升的 Redis 整体的运行速度。
5、常见问题及解决方案
- 热key问题
所谓热key问题就是,突然有几十万的请求去访问redis上的某个特定key,那么这样会造成流量过于集中,达到物理网卡上限,从而导致这台redis的服务器宕机引发雪崩。
针对热key的解决方案:
- 提前把热key打散到不同的服务器,降低压力。
- 加入二级缓存,提前加载热key数据到内存中,如果redis宕机,走内存查询。
- 缓存穿透
缓存穿透是指查询不存在缓存中的数据,每次请求都会打到DB,就像缓存不存在一样。
解决方案就是存入数据时候过滤下,将不符合规则的数据用一个特定格式标记下,每次获取时候,直接返回即可,这样就不会产生击穿请求直接查库了。
- 缓存雪崩
缓存雪崩是指在短时间内,有大量缓存同时过期,导致大量的请求直接查询数据库,从而对数据库造成了巨大的压力,严重情况下可能会导致数据库宕机的情况叫做缓存雪崩。
针对雪崩几个解决方案:
- 针对不同key设置不同的过期时间,避免同时过期。
- 限流,如果redis宕机,可以限流,避免同时刻大量请求打崩DB。
- 二级缓存,提前加载热key数据到内存中,如果redis宕机,走内存查询。
相关推荐
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
-
在企业级运维、故障排查和性能调优过程中,准确了解服务器的运行环境至关重要。无论是物理机还是虚拟机,都存在各自的优势与限制。在很多场景下,尤其是当你继承一台服务器而不清楚底层硬件细节时,如何快速辨识它是...
- 第四节 Windows 系统 Docker 安装全指南
-
一、Docker在Windows上的运行原理(一)架构限制说明Docker本质上依赖Linux内核特性(如Namespaces、Cgroups等),因此在Windows系统上无法直...
- C++ std:shared_ptr自定义allocator引入内存池
-
当C++项目里做了大量的动态内存分配与释放,可能会导致内存碎片,使系统性能降低。当动态内存分配的开销变得不容忽视时,一种解决办法是一次从操作系统分配一块大的静态内存作为内存池进行手动管理,堆对象内存分...
- Activiti 8.0.0 发布,业务流程管理与工作流系统
-
Activiti8.0.0现已发布。Activiti是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速、稳定的BPMN2流程引擎。Activiti可以...
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
-
MyBatis动态SQL在日常开发中频繁使用,但大多数开发者仅掌握基础标签。本文将介绍五种高阶技巧,助你解锁更灵活的SQL控制能力。一、智能修剪(Trim标签)应用场景:动态处理字段更新,替代<...
- Springboot数据访问(整合Mybatis Plus)
-
Springboot整合MybatisPlus1、创建数据表2、引入maven依赖mybatis-plus-boot-starter主要引入这个依赖,其他相关的依赖在这里就不写了。3、项目结构目录h...
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
-
见证了两个月前勇士与猛龙那个史诗般的系列赛后,甲骨文球馆正式成为了历史。那个大大的红色标志被一个字母一个字母地移除,在周四,一切都成为了过去式。然而这座,别名为“Roaracle”(译注:Roar怒吼...
- Mybatis入门看这一篇就够了(mybatis快速入门)
-
什么是MyBatisMyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为M...
- Springboot数据访问(整合druid数据源)
-
Springboot整合druid数据源基本概念SpringBoot默认的数据源是:2.0之前:org.apache.tomcat.jdbc.pool.DataSource2.0及之后:com.z...
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
-
什么是/etc/profile.d/目录?/etc/profile.d/目录是Linux系统不可或缺的一部分保留配置脚本。它与/etc/profile文件相关联,这是一个启动脚本,该脚...
- 企业数据库安全管理规范(企业数据库安全管理规范最新版)
-
1.目的为规范数据库系统安全使用活动,降低因使用不当而带来的安全风险,保障数据库系统及相关应用系统的安全,特制定本数据库安全管理规范。2.适用范围本规范中所定义的数据管理内容,特指存放在信息系统数据库...
- Oracle 伪列!这些隐藏用法你都知道吗?
-
在Oracle数据库中,有几位特殊的“成员”——伪列,它们虽然不是表中真实存在的物理列,但却能在数据查询、处理过程中发挥出意想不到的强大作用。今天给大家分享Oracle伪列的使用技巧,无论...
- Oracle 高效处理数据的隐藏神器:临时表妙用
-
各位数据库搬砖人,在Oracle的代码世界里闯荡,处理复杂业务时,是不是总被数据“搅得头大”?今天给大家安利一个超实用的隐藏神器——临时表!当你需要临时存储中间计算结果,又不想污染正式数据表...
- Oracle 数据库查询:多表查询(oracle多表关联查询)
-
一、多表查询基础1.JOIN操作-INNERJOIN:返回两个表中满足连接条件的匹配行,不保留未匹配数据。SELECTa.emp_id,b.dept_nameFROMempl...
- 一文掌握怎么利用Shell+Python实现多数据源的异地备份程序
-
简介:在信息化时代,数据安全和业务连续性已成为企业和个人用户关注的焦点。无论是网站数据、数据库、日志文件,还是用户上传的文档、图片等,数据一旦丢失,损失难以估量。尤其是当数据分布在多个不同的目录、服务...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
- 第四节 Windows 系统 Docker 安装全指南
- C++ std:shared_ptr自定义allocator引入内存池
- Activiti 8.0.0 发布,业务流程管理与工作流系统
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
- Springboot数据访问(整合Mybatis Plus)
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
- Mybatis入门看这一篇就够了(mybatis快速入门)
- Springboot数据访问(整合druid数据源)
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
- 标签列表
-
- oracle位图索引 (74)
- oracle基目录 (50)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (53)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)