Redis功能强大,那也顶不住被滥用啊!

Redis功能强大,数据类型丰富,再快的系统,也经不住疯狂的滥用。通过禁用部分高风险功能,并挂上开发的枷锁,业务更能够以简洁、通用的思想去考虑问题,而不是绑定在某种实现上。

Redis根据不同的用途,会有不同的持久化策略和逐出策略,所以,在使用和申请 Redis 集群前,请明确是用来做缓存还是存储。Redis的集群有主从和 cluster 两种模式,各有优缺点。以下规范不区分集群模式,我们分别从使用场景和操作限制两方面说明。

使用规范

冷热数据区分

虽然 Redis支持持久化,但将所有数据存储在 Redis 中,成本非常昂贵。建议将热数据 (如 QPS超过 5k) 的数据加载到 Redis 中。低频数据可存储在 Mysql、 ElasticSearch中。

业务数据分离

不要将不相关的数据业务都放到一个 Redis中。一方面避免业务相互影响,另一方面避免单实例膨胀,并能在故障时降低影响面,快速恢复。

消息大小限制

由于 Redis 是单线程服务,消息过大会阻塞并拖慢其他操作。保持消息内容在 1KB 以下是个好的习惯。严禁超过 50KB 的单条记录。消息过大还会引起网络带宽的高占用,持久化到磁盘时的 IO 问题。

连接数限制

连接的频繁创建和销毁,会浪费大量的系统资源,极限情况会造成宿主机当机。请确保使用了正确的 Redis 客户端连接池配置。

缓存 Key 设置失效时间

作为缓存使用的 Key,必须要设置失效时间。失效时间并不是越长越好,请根据业务性质进行设置。注意,失效时间的单位有的是秒,有的是毫秒,这个很多同学不注意容易搞错。

缓存不能有中间态

缓存应该仅作缓存用,去掉后业务逻辑不应发生改变,万不可切入到业务里。

1、缓存的高可用会影响业务;

2、产生深耦合会发生无法预料的效果;

3、会对维护行产生肤效果。

扩展方式首选客户端 hash

如果应用太小就别考虑了,如单 redis 集群并不能为你的数据服务,不要着急扩大你的 redis 集群(包括 M/S 和 Cluster),集群越大,在状态同步和持久化方面的性能越差。优先使用客户端 hash 进行集群拆分。如:根据用户 id 分 10 个集群,用户尾号为 0 的落在第一个集群。

操作限制

严禁使用 Keys

Keys 命令效率极低,属于 O(N)操作,会阻塞其他正常命令,在 cluster 上,会是灾难性的操作。严禁使用,DBA 应该 rename 此命令,从根源禁用。

严禁使用 Flush

flush 命令会清空所有数据,属于高危操作。严禁使用,DBA 应该 rename 此命令,从根源禁用,仅 DBA 可操作。

严禁作为消息队列使用

如没有非常特殊的需求,严禁将 Redis 当作消息队列使用。Redis 当作消息队列使用,会有容量、网络、效率、功能方面的多种问题。如需要消息队列,可使用高吞吐的 Kafka 或者高可靠的 RocketMQ。

严禁不设置范围的批量操作

redis 那么快,慢查询除了网络延迟,就属于这些批量操作函数。大多数线上问题都是由于这些函数引起。

1、[zset] 严禁对 zset 的不设范围操作

ZRANGE、 ZRANGEBYSCORE等多个操作 ZSET 的函数,严禁使用 ZRANGE myzset 0 -1 等这种不设置范围的操作。请指定范围,如 ZRANGE myzset 0 100。如不确定长度,可使用 ZCARD 判断长度

2、[hash] 严禁对大数据量 Key 使用 HGETALL

HGETALL会取出相关 HASH 的所有数据,如果数据条数过大,同样会引起阻塞,请确保业务可控。如不确定长度,可使用 HLEN 先判断长度

3、[key] Redis Cluster 集群的 mget 操作

Redis Cluster 的 MGET 操作,会到各分片取数据聚合,相比传统的 M/S架构,性能会下降很多,请提前压测和评估

4、[其他] 严禁使用 sunion, sinter, sdiff等一些聚合操作

禁用 select 函数

select函数用来切换 database,对于使用方来说,这是很容易发生问题的地方,cluster 模式也不支持多个 database,且没有任何收益,禁用。

禁用事务

redis 本身已经很快了,如无大的必要,建议捕获异常进行回滚,不要使用事务函数,很少有人这么干。

禁用 lua 脚本扩展

lua 脚本虽然能做很多看起来很 cool 的事情,但它就像是 SQL 的存储过程,会引入性能和一些难以维护的问题,禁用。

禁止长时间 monitor

monitor函数可以快速看到当前 redis 正在执行的数据流,但是当心,高峰期长时间阻塞在 monitor 命令上,会严重影响 redis 的性能。此命令不禁止使用,但使用一定要特别特别注意。

Key 规范

Redis 的 Key 一定要规范,这样在遇到问题时,能够进行方便的定位。Redis 属于无 scheme 的 KV 数据库,所以,我们靠约定来建立其 scheme 语义。其好处:

1、能够根据某类 key 进行数据清理 2、能够根据某类 key 进行数据更新 3、能够方面了解到某类 key 的归属方和应用场景 4、为统一化、平台化做准备,减少技术变更

一般,一个 key 需要带以下维度:业务、key 用途、变量等,各个维度使用 : 进行分隔,以下是几个 key 的实例:

user:sex 用户 10002232 的性别 msg:achi 201712 的用户发言数量排行榜

最后

适当的约束是架构成熟的必要条件,通过约定能达到规范是集体开发的最高境界。Redis用的多,也要用的稳,给点约束、立点规矩,生活将变的美好。通过二次封装redis客户端,直接阻断,效果更佳。

Image placeholder
GlaryJoker
未设置
  14人点赞

没有讨论,发表一下自己的看法吧

推荐文章
原生线程池这么强大,Tomcat 为何还需扩展线程池?

前言Tomcat/Jetty是目前比较流行的Web容器,两者接受请求之后都会转交给线程池处理,这样可以有效提高处理的能力与并发度。JDK提高完整线程池实现,但是Tomcat/Jetty都没有直接使用。

R语言有多强大?十个你不知道的功能

大数据文摘出品编译:邬亮有些业界从业人士对R语言的价值并不认可,他们认为R语言只针对统计分析。R语言的确提供了很全面的统计分析的软件包,比如CRAN,Bioconductor,Neuroconduct

phpstrom 快捷键,老是记不住哇! 记一下记一下!

老是记不住哇!记一下记一下! Esc键编辑器(从工具窗口)F2(Shift+F2)下/上高亮错误或警告快速定位F3向下查找关键字出现位置F4查找变量来源F5复制文件/文件夹F6移动F11切换书签F12

从技术到生态构建,云计算棋局越来越大,如何成功落地

经过十多年的发展,云计算已经从概念阶段逐步走向了实践。一批互联网巨头企业迅速抢滩布局产业基础研究与核心技术领域,以BAT为代表,在云计算领域布局迅猛,外资云如AWS、甲骨文、微软、IBM,也都通过合作

Beego:简约 & 强大并存的 Go 应用框架

引言:Beego是一个快速开发Go应用的HTTP框架,他可以用来快速开发API、Web及后端服务等各种应用,是一个RESTful的框架,主要设计灵感来源于tornado、sinatra和flask这三

看,那个35岁的程序员好像一条”狗“…

35岁并不是所有的程序员都成了架构师也不是所有的程序员都荣升技术总监更不是所有的程序员都转成了项目经理大部分35岁的程序员依旧是一线码农…..有的是真心喜欢,而更多的却是无奈。无论何种原因,35岁的程

我的代码和注释都写的像坨屎,那又怎么样?

题图:摄于2019年–绍兴东湖一周前,我的朋友圈被一篇#百度某新员工发飙:前人代码写得像一坨屎,颠覆了对大厂的认知#的文章刷屏了,评论区也非常热闹。但让我惊讶的是,几乎所有的声音里都充满着嘲笑与讥讽,

微软张若非:搜索引擎和广告系统,那些你所不知的AI落地技术

这两年,被誉为“ 皇冠上的明珠”的自然语言处理领域发展愈发火热,成为了业内新宠,而 搜索和广告这两大老牌技术领域似乎已被大家遗忘。其实,这两大接地气的工程领域仍是各企业竞相抢夺的市场之一。近日,AI科

electron+vue实现div contenteditable功能|截图

最近在学习基于electron+electron-vue开发聊天客户端项目时,需要用到编辑器插入表情功能。一般通过input或textarea也能实现,通过插入[笑脸]、(:12这些标签,展示的时候解

采用 PHP-quickorm/Captcha,用最快的速度在 PHP 语言下实现验证码功能

要调用起这个库,门槛十分低,但是建议满足以下几个条件: PHP5+ PHPGD扩展 Composer(非必须) 安装方法 首先我们花30秒来引入一下这个库,主要有以下两种方式。 其一、使用Comp

Python 3.8 新功能

Python3.8是Python编程语言的最新主要版本,它包含许多新功能和优化。 Python3.8 Python3.8的一些新功能包括: 1.海象运算符 Walrus 在这个新版本中,我们有

JS 直接打印功能实现代码

Jsweb打印方法汇总 1.插件打印,网上可以搜有付费和免费的打印插件可以用,一般来说免费的一般只支持ie浏览器,有的免费插件还有水印。需要安装插件到打印机所用电脑上。2.js直接打印,只支持IE浏览

PHP 7.4 新功能更新列表

PHP7.4,下一个PHP7较小的发布版,期望在2019年11月28日发布。因此,现在是时候让大家深入了解这个版本添加哪些新特性使PHP更快、更可靠。 虽然PHP7.4显著地提升了性能和提高代码可读性

PHP7.4 新特性和废弃的功能

PHP7.4新特性PHP7.4上月28号已经发布了。又带来了一些新特性。可以让我们的代码写的更少了。1.属性添加限定类型 4.数组解包使用展开运算符...解包数组。这个特性,应该又是从js那吸收过来的

SQL Server 2014的数据库引擎新增功能(参考sqlserver官方文档)

SQLServer2014数据库引擎引入了一些新功能和增强功能,这些功能可以提高设计、开发和维护数据存储系统的架构师、开发人员和管理员的能力和工作效率。  以下是 数据库引擎已增强的方面。数据库引擎功

不使用JavaScript创建常见UI元素功能

我们已经习惯于用JavaScript编写常见的UI元素功能(如手风琴、工具提示、文本截断等),但是随着HTML和CSS有了新的功能以及旧版浏览器不再受支持,我们越来越少使用JavaScript来创建U

Java没有创新了吗?Java 13提供可提高生产率和效率的功能

在其CodeOne会议上,Oracle解释了JavaSE13正式发布后Java的快速发布周期如何带来创新。在过去的二十多年中,Java编程语言新版本的开发速度相对较慢,仅每隔几年就会进行重大更新。甲骨

7 个好用的 TypeScript 新功能

作者:RC翻译:疯狂的技术宅 原文:https://blog.bitsrc.io/7-new-... 未经允许严禁转载 TypeScript语言小组一直在以惊人的速度推出新功能。从最新的《Javasc

Redis 命令练习汇总

一、Redis连接与认证 连接参数:ip、端口、连接超时时间,连接成功返回true,否则返回false $ret=$redis->connect('127.0.0.1',6379,30); 密码认

基于 Redis 的 LBS 尝试

redis3.2版本中增加的最大功能就是对GEO(地理位置)的支持,这对于O2O项目来说,又有了一项实现LBS应用的选择。 主要命令: GEOADD|将指定的地理空间位置(纬度、经度、

PHP 操作 Redis 的基本方法

最近系统性的研究了下redis,准备些一篇redis使用常遇到的问题;包括: redis的基本操作方法。 1redis的连接: //实例化redis $redis=newRedis(); //连接 $

初识 redux

redux介绍 单向数据流:从父组件流向子组件,兄弟组件无法共享数据 State:React中的状态,是只读对象,不可直接修改 Reducer:基本函数,用于对State业务的处理 Action:普通

Golang 操作 Redis 的基本方法

摘要 看到有位老哥写了PHP操作Redis的基本方法,于是就有了这篇博客 超喜欢Redis的,感觉使用起来很方便,但是社区不温不火哈? 就当是为Redis社区做贡献吧,如果大家喜欢记得点个赞哦 话不多

Redis 的特性

以下是Redis的主要功能列表: 速度:Redis将整个数据集存储在主内存中,这就是为什么它非常快的原因。它的加载速度高达110,000个SET/秒,并且可以在入门级Linux机器中检索到81,000

Homestead 安装 PHP Redis 扩展

虽然Laravel可以通过安装predis/predis:~1.1对Redis进行操作,但是还是想脱离框架,用PHP操作Reids,通过安装PHPRedis既可实现,以下是具体的安装步骤: 下载最新安