如何高效且优雅地使用Redis

news2024/9/22 19:36:39

本文从如下7个维度,带你全面理解Redis的最佳实践和优化:

  • 内存
  • 性能
  • 可靠性
  • 运维
  • 安全
  • 资源规划
  • 监控

1、如何节省内存

1.1、控制Key的长度

  • 在开发业务时,要提前预估Redis中写入key的数量,如果key数量达到了百万级别,那过长的key也会占用过多的内存空间
  • 在保证key简单、清晰的前提下,key要尽可能地简短,这对内存的优化非常直接和高效

1.2、避免存储bigkey

  • 如果大量存储bigkey(value过大或过多),会占用大量Redis内存;此外,客户端读写bigkey也会产生性能问题
  • 避免Redis存储bigkey,建议如下:
    1)String类型:控制在10KB以下
    2)List/Hash/Set/ZSet:元素数量控制在1万以下

1.3、选择合适的数据类型

  • Redis提供了丰富的数据类型,这些数据类型底层对应着多种数据结构来实现(可进一步节约内存资源):如,String、Set在存储int数据时,会采用整数编码来存储;Hash、ZSet在存储元素较少时,会采用压缩列表(ZipList)存储,在元素较多时,会转为哈希表(HashTable)和跳表(SkipList)存储 ==》 Hash:HashTable;ZSet:HashTable + SkipTable
    在这里插入图片描述
  • 利用如上数据存储的特性,建议如下:
    1)String、Set:尽量存储int类型数据
    2)List/Hash/Set/Zset:存储的元素数量尽可能地控制在转换阈值之下(元素数量尽量控制在1万以下),以便节省内存

1.4、把Redis当做缓存而非数据库

  • 要把Redis当作缓存而非数据库,即Redis只存储经常访问的热点数据,以此保证较高的内存利用率
  • 写入到Redis中的数据,尽可能设置过期时间
  • 业务应用在Redis中无法查询到数据时,才从后端数据库查询并加载到Redis

1.5、设置内存上限和淘汰策略

  • Redis中key都设置了过期时间,但如果业务应用写入数据量很大,并设置的过期时间比较久,则短期内Redis内存依旧会快速增长。如果控制Redis内存的上限,就会导致使用过多的内存资源
  • 对于此种场景,你需要提前预估业务数据量,并为Redis实例设置maxmemory来控制实例的内存上限,如此来避免Redis占用内存持增长
  • 此外,还需要结合业务特点设置数据的淘汰策略(默认情况下,推荐使用allkeys-lru)
    1)基于LFU算法的淘汰策略(对是否设置了过期时间TTL进行再分类)
    allkeys-lfu:对全体key,基于LFU算法进行淘汰(默认推荐)
    volatile-lfu: 对设置了TTL的key,基于LFU算法进行淘汰
    2)基于LFU算法的淘汰策略(对是否设置了过期时间TTL进行再分类)
    allkeys-lru:对全体key,基于LRU算法进行淘汰
    volatile-lru:对设置了TTL的key,基于LRU算法进行淘汰
    3)随机淘汰(对是否设置了过期时间TTL进行再分类)
    allkeys-random:对全体key ,随机进行淘汰
    volatile-random:对设置了TTL的key ,随机进行淘汰
    4)其他
    volatile-ttl:对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰
    noeviction:不淘汰任何key,但是内存满时不允许写入新数据,默认就是这种策略

1.6、数据压缩后写入Redis

  • 如果想进一步优化Redis内存,还可以在业务应用中先将数据压缩,再写入到Redis(采用snappy、gzip等压缩算法),但是,客户端在读取压缩存储的数据时要解压数据,这会消耗一定的CPU资源,这需要根据实际情况来权衡

2、如何发挥Redis的高性能

  • 在使用Redis时,往往需要我们关注于如何持续发挥Redis的高性能,从而避免操作延迟的情况发生,结合实战经验给出的建议如下:

2.1、避免存储bigkey

  • 由于Redis处理请求是单线程的,当写入一个bigkey时,会在内存分配上耗费较多时间,导致操作延迟会增加,同理,删除bigkey会耗时地释放内存
  • 在读取bigkey时,会在网络数据传输上花费更多时间,后续执行的请求会发生排队,导致Redis性能下降
  • 如果确实有存储bigkey的需求,可以将bigkey拆分为多个小key存储

2.2、开启lazy-free机制

  • 如果无法避免存储bigkey的情况,建议开启Redis的lazy-free机制。当开启lazy-free后,删除bigkey时释放内存的耗时操作将会交由后台线程去执行,如此以避免对主线程的影响

2.3、批量命令代替单个命令

  • 当需要一次性操作多个key时,推荐使用批量命令来处理,相较于多次单个操作的优势在于,可减少客户端和服务端之间的网络IO次数
    1)String或Hash结构使用MGET/MSET代替GET/SET命令,HMGET/HMSET代替HGET/HSET命令
    2)其他数据类型使用Pipeline,一次性打包发送多个命令到服务端执行
    在这里插入图片描述

2.4、注意DEL操作的时间复杂度

  • 当删除String类型的Key时,时间复杂度为O(1)
  • 当删除数据类型为List、Hash、Set、ZSet,时间复杂度为O(N),N为集合的元素个数,即集合中的元素越多,DEL操作花费时间越多,原因在于删除大量元素时,需要依次回收每个元素占用的内存,元素越多,花费时间也就越久,该过程在主线程中执行,存在阻塞主线程的风险,推荐分批删除,操作如下:
  • List类型:多次执行LPOP/RPOP,直到所有元素都删除完成
    Hash/Set/ZSet类型:先对应执行HSCAN/SSCAN/SCAN查询元素,再对应执行HDEL/ SREM / ZREM依次删除每个元素
    2)

2.5、避免key集中过期

  • Redis通过定时+懒惰的方式来清理过期key,该过程在主线程中执行
  • 如果业务中存在大量key过期的情况,Redis在清理过期key的过程中,存在主线程阻塞的风险,可以通过给过期时间增加一个随机值,将key的过期时间分散开来,从而避免大量key集中过期对主线程的影响
    -

2.6、使用长连接操作Redis,合理配置连接池

  • 业务应用要使用长连接操作Redis,而非短连接
  • 当使用短连接操作Redis时,每次都需要经过TCP三次握手,四次挥手,会徒增操作耗时
  • 客户端应该使用连接池的方式访问Redis,并设置合理的参数,长时间不操作Redis时,应及时释放连接资源

2.7、只使用db0

  • Redis尽管提供了16个db,但推荐只使用db0,理由如下:
    1)在一个连接上操作多个db数据时,每次都需要执行SELECT,会给Redis带来额外的压力
    2)Redis Cluster只支持db0,如果想要在集群中迁移数据,迁移成本会很高

2.8、使用读写分离 & 分片集群

  • 如果业务读请求量很大,则可以采用部署多个从库的方式,实现读写分离,通过Redis的从库来分担读请求的压力,进而提升性能
    在这里插入图片描述
  • 如果业务写请求量很大,单个Redis实例已经无法支撑写流量,则可以使用分片集群来减轻写请求的压力
    在这里插入图片描述

2.9、不开启AOF或AOF配置为每秒刷盘

2.10、适用物理机部署Redis

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

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

相关文章

【SpringMVC】之自定义注解

文章目录 一、Java注解1.1 简介1.2 分类1.2.1 JDK基本注解1.2.2 JDK元注解1.3 自定义注解 二、使用自定义注解2.1 **案例一(获取类与方法上的注解值)**2.2 **案例二(获取类属性上的注解属性值)**2.3 **案例三(获取参数…

easycms v5.5 分析 | Bugku S3 AWD排位赛

前言 这个awd打的悲,后台默认用户名密码为admin:admin,但是几乎所有人都改了 而且一进去看到这个cms就有点懵逼,都不知道这个cms是干嘛的(没用过相似的cms) 虽然网上找出了很多相关的漏洞,但是不知道为什…

API实战教程:使用身份证OCR识别API构建一个应用

1. 引言 你是否曾经想过,只需拍一张身份证的照片,就能自动读取上面的所有信息?今天,我们要介绍的就是这样一个神奇的工具:身份证OCR识别API。不管你是技术小白还是初学者,跟着我们的步骤,你都可…

揭秘弹幕游戏制作

最近好多人问弹幕游戏,甚至是招人的也要DOTS做弹幕游戏... 实际上目前的弹幕游戏绝大多数应该和DOTS没有半点关系,别忘了DOTS这项技术渲染问题还没能够被合理解决呢 所以目前用的全都是GPU Instance这项技术,于是乎我决定下场写这篇帖子&am…

【藏经阁一起读】(69)__《阿里云视频云产品手册2023版》

【藏经阁一起读】(69)__《阿里云视频云产品手册2023版》 目录 一、概述阿里云视频云全产品矩阵 二、数字人视频制作 以下是人工智能虚拟人物的一些优秀代表作品及其特点: 阿里云视频云数字人视频制作产品优势 ▶高还原度的拟真效果 ▶场…

网络安全(黑客技术)自学规划

一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性…

外包干了2个月,技术退步明显.......

先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

华为云云耀云服务器L实例评测|华为云云耀云服务器L实例开展性能评测

作者简介: 辭七七,目前大二,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

哪个牌子的电视盒子好用?锋哥数码揭晓最新电视盒子品牌排行榜

哪个牌子的电视盒子好用?不同人群需求不同选购侧重点也不同,老人要买操作简单的,小孩要买辅导课多的,追剧党要买看视频流畅广告少的,喜欢投屏的就更注重投屏体验,锋哥做电视盒子的测评已经很多年了&#xf…

SQL 2008 R2 和vCenter 5.1安装步骤与AQ

准备情况: Windows 2008 r2 sp1 64bit操作系统 Sql 2008 完整版安装包(名称:SQLFULL_CHS.iso 安装完成会安装managment) vCenter完整版安装包(名称:VMware-VIMSetupall-5.1.0-799735.iso) …

亿级长连接,淘宝接入层网关的架构设计

说在前面 在40岁老架构师 尼恩的读者交流群(50)中,很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近,尼恩指导一个小伙伴简历,写了一个《高并发网关项目》,此项目帮这个小伙拿到 字节/阿里/…

C++——vector(2)

作者:几冬雪来 时间:2023年9月15日 内容:C——vector知识讲解 目录 前言: vector: 构造函数: 创建模板: reserve/push_back: 迭代器/capacity和size: insert: 改进&…

基于springboot+vue的大学生智能消费记账系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

OPTEE异常调用栈解析

安全之安全(security)博客目录导读 目录 一、OPTEE标准的异常调用栈格式 二、OPTEE异常调用栈解析脚本 三、如何执行解析命令 四、OPTEE异常调用栈解析结果 序言:当OPTEE发生异常时,安全控制台会输出dump信息,虽然有了Call stack&#x…

企业级SpringBoot单体项目模板 —— 基础应用搭建

😜作 者:是江迪呀✒️本文关键词:SpringBoot项目模板、工程、MyBatis-plus☀️每日 一言:你那么在意不喜欢你的人的言语,这对喜欢你的人来说很不公平 一、创建一个Maven项目 Maven的安装自己百度。 2.1 …

新能源汽车驱动电机的基本知识

学习目标:了解电机的基本知识。能力目标:培养学生搜集和整理相关资料的能力。素质目标:培养学生良好的职业素养。额定电店.在夫见定条件下电池工作的*于佳 电压知识准备术语和定义。 (1)驱动电机系统 通过有效的控制策略将动力蓄电池提供的直流电转化为交流实现电机的正转以及反…

在Linux上配置Spug自动化运维平台,实现公网远程访问

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件…

Keepalived 高可用(附带配置实例,联动Nginx和LVS)

Keepalived 一、Keepalived相关知识点概述1.1 单服务的风险(单点故障问题)1.2 一个合格的集群应该具备的特性1.3 VRRP虚拟路由冗余协议1.4 健康检查1.5 ”脑裂“现象 二、Keepalived2.1 Keepalived是什么?2.2 Keepalived体系主要模块及其作用…

机器学习技术(十)——决策树算法实操,基于运营商过往数据对用户离网情况进行预测

机器学习技术(十)——决策树算法实操 文章目录 机器学习技术(十)——决策树算法实操一、引言二、数据集介绍三、导入相关依赖库四、读取并查看数据1、读取数据2、查看数据 五、数据预处理1、选择数据2、数据转码 六、建模与参数优…