>  기사  >  데이터 베이스  >  Redis 사양은 무엇입니까?

Redis 사양은 무엇입니까?

王林
王林앞으로
2023-06-03 14:19:491234검색

Redis는 강력한 기능과 풍부한 데이터 유형을 갖추고 있습니다. 시스템이 아무리 빠르더라도 엄청난 남용을 견딜 수 없습니다. 일부 고위험 기능을 비활성화하고 개발의 족쇄를 걸면 비즈니스는 특정 구현에 얽매이지 않고 간결하고 일반적인 아이디어로 문제를 고려할 수 있습니다.

Redis는 다양한 용도에 따라 다양한 지속성 전략과 제거 전략을 갖습니다. 따라서 Redis 클러스터를 사용하고 적용하기 전에 캐싱 또는 저장용으로 사용되는지 명확히 하세요. Redis 클러스터에는 마스터-슬레이브와 클러스터라는 두 가지 모드가 있으며 둘 다 고유한 장점과 단점이 있습니다. 다음 사양에서는 클러스터 모드를 구분하지 않고 사용 시나리오 및 운영 제한 사항을 설명합니다.

사용 사양

핫 데이터와 콜드 데이터 구별

redis는 지속성을 지원하지만 모든 데이터를 Redis에 저장하는 데는 비용이 많이 듭니다. 핫 데이터(QPS가 5k를 초과하는 데이터 등)를 Redis에 로드하는 것이 좋습니다. 저주파 데이터는 MysqlElasticSearch에 저장할 수 있습니다. MysqlElasticSearch中

业务数据分离

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

消息大小限制

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

连接数限制

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

缓存 Key 设置失效时间

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

缓存不能有中间态

缓存应该仅作缓存用,去掉后业务逻辑不应发生改变,万不可切入到业务里。第一,缓存的高可用会影响业务;第二,产生深耦合会发生无法预料的效果;第三,会对维护行产生肤效果。

扩展方式首选客户端 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 的不设范围操作

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

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

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

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

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

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

禁用 select 函数

select函数用来切换 database,对于使用方来说,这是很容易发生问题的地方,cluster 模式也不支持多个 database

비즈니스 데이터 분리🎜🎜관련 없는 모든 데이터 서비스를 하나의 Redis에 넣지 마세요. 한편으로는 비즈니스 상호 영향을 방지하는 반면, 단일 인스턴스의 확장을 방지하여 장애 발생 시 영향을 줄이고 신속하게 복구할 수 있습니다. 🎜🎜메시지 크기 제한🎜🎜Redis는 단일 스레드 서비스이므로 메시지가 너무 많으면 다른 작업이 차단되고 속도가 느려집니다. 메시지 내용을 1KB 미만으로 유지하는 것이 좋습니다. 50KB를 초과하는 단일 레코드는 엄격히 금지됩니다. 메시지가 너무 크면 네트워크 대역폭 사용량이 많아지고 디스크에 유지할 때 IO 문제가 발생합니다. 🎜🎜연결 수 제한🎜🎜연결을 자주 생성하고 삭제하면 시스템 리소스가 많이 낭비되고 극단적인 경우 호스트가 중단될 수 있습니다. 올바른 Redis 클라이언트 연결 풀 구성을 사용하고 있는지 확인하세요. 🎜🎜캐시 키는 만료 시간을 설정합니다🎜🎜캐시로 사용되는 이므로 만료 시간을 설정해야 합니다. 유효기간은 길수록 좋습니다. 업무 성격에 맞게 설정해 주세요. 실패 시간의 일부 단위는 초이고 일부는 밀리초입니다. 많은 학생들이 주의를 기울이지 않으면 쉽게 실수를 할 수 있습니다. 🎜🎜캐시는 중간 상태를 가질 수 없습니다.🎜🎜캐시는 캐싱에만 사용해야 합니다. 비즈니스 로직은 제거된 후 변경되어서는 안 되며, 비즈니스에 분할되어서도 안 됩니다. 첫째, 캐시의 높은 가용성은 비즈니스에 영향을 미치고, 둘째, 심층 결합은 예측할 수 없는 영향을 미치며, 셋째, 유지 관리 작업에 표면적인 영향을 미칩니다. 🎜🎜선호되는 확장 방법은 클라이언트 측 해시입니다🎜🎜🎜작은 애플리케이션은 잊어버리세요🎜🎜🎜단일 redis 클러스터는 데이터를 제공할 수 없으므로 서두르지 말고 redis 클러스터(M/S 및 Cluster 포함), 클러스터가 클수록 상태 동기화 및 지속성 성능이 저하됩니다. 클러스터 분할을 위해 클라이언트 <code>해시 사용을 우선순위로 지정하세요. 예를 들어 사용자 ID에 따라 10개의 클러스터가 나누어지고, 마지막 번호가 0인 사용자가 첫 번째 클러스터에 속합니다. 🎜🎜작업 제한🎜🎜Keys 사용은 엄격히 금지됩니다🎜🎜Keys 명령은 매우 비효율적이며 O(N) 작업에 속하므로 다른 일반 명령을 차단합니다. 클러스터에서는 재앙적인 작업이 될 것입니다. 사용은 엄격히 금지됩니다. <code>DBA는 소스에서 비활성화된 이 명령의 이름을 변경해야 합니다. 🎜🎜Flush🎜🎜flush 명령을 사용하면 모든 데이터가 지워지며 위험도가 높은 작업은 엄격히 금지됩니다. 사용은 엄격히 금지됩니다. DBA는 이 명령의 이름을 변경해야 하며 소스에서 비활성화되어야 하며 DBA만 작동할 수 있습니다. 🎜🎜메시지 큐로 사용하는 것은 엄격히 금지됩니다🎜🎜아주 특별한 요구가 없다면 Redis를 메시지 큐로 사용하는 것은 엄격히 금지됩니다. Redis를 메시지 큐로 사용하게 되면 용량, 네트워크, 효율성, 기능성 측면에서 다양한 문제가 발생하게 됩니다. 메시지 대기열이 필요한 경우 처리량이 높은 Kafka 또는 안정성이 뛰어난 RocketMQ를 사용할 수 있습니다. 🎜🎜범위를 설정하지 않은 일괄 작업은 엄격히 금지됩니다🎜🎜redis 네트워크 지연을 제외하고 매우 빠르고 느린 쿼리는 이러한 일괄 작업 기능에 속합니다. 대부분의 온라인 문제는 이러한 기능으로 인해 발생합니다. 🎜
1. [zset] zset에서 범위가 지정되지 않은 작업은 엄격히 금지됩니다.
🎜ZRANGE, ZRANGEBYSCORE 및 기타 작업 ZSET 기능 , ZRANGE myzset 0 -1 및 범위를 설정하지 않는 기타 작업을 사용하는 것은 엄격히 금지됩니다. ZRANGE myzset 0 100과 같이 범위를 지정하십시오. 길이가 확실하지 않은 경우 ZCARD를 사용하여 길이를 확인할 수 있습니다🎜
2. [hash] 대용량 데이터 키에는 HGETALL
사용을 엄격히 금지합니다🎜 HGETALLHASH의 모든 데이터에 대해 해당 항목을 제거합니다. 데이터 항목 수가 너무 많으면 혼잡이 발생할 수도 있으므로 비즈니스가 제어 가능한지 확인하십시오. 길이가 확실하지 않은 경우 HLEN을 사용하여 먼저 길이를 확인할 수 있습니다🎜
3. [key] Redis 클러스터 클러스터의 관리 작업
🎜Redis 클러스터 MGET 작업은 각 샤드에서 데이터를 수집하여 집계합니다. 기존 M/S 아키텍처와 비교하면 성능이 많이 떨어집니다. 미리 테스트하고 평가하세요🎜
4. [기타] sunion, sinter, sdiff 등 일부 집계 연산은 사용이 엄격히 금지됩니다.
🎜select 기능을 비활성화하세요🎜🎜select code> 기능은 <code>데이터베이스를 전환하는 데 사용됩니다. 사용자의 경우 여기서 문제가 쉽게 발생할 수 있습니다. 클러스터 모드도 여러 데이터베이스를 지원하지 않습니다. 그리고 아무런 혜택도 없습니다. 🎜

Disable transaction

redis 자체는 이미 매우 빠릅니다. 큰 필요가 없으면 예외를 포착하고 트랜잭션 기능을 사용하지 않는 것이 좋습니다. redis 本身已经很快了,如无大的必要,建议捕获异常进行回滚,不要使用事务函数,很少有人这么干。

禁用 lua 脚本扩展

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

禁止长时间 monitor

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

Key 规范

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

  1. 能够根据某类 key 进行数据清理

  2. 能够根据某类 key 进行数据更新

  3. 能够方面了解到某类 key 的归属方和应用场景

  4. 为统一化、平台化做准备,减少技术变更

一般,一个 key

lua 스크립트 확장 비활성화

lua 스크립트는 멋져 보이는 많은 작업을 수행할 수 있지만 이는 SQL의 저장소와 같습니다. 성능 및 일부 어려운 유지 관리 문제가 발생하며 비활성화됩니다.

장기 모니터 금지

monitor 기능을 사용하면 현재 redis에서 실행 중인 데이터 흐름을 빠르게 확인할 수 있지만 에서 차단되므로 주의하세요. /code> 명령은 피크 기간 동안 오랜 시간 동안 <code>redis 성능에 심각한 영향을 미칩니다. 이 명령은 사용이 금지되지는 않지만 사용할 때는 특별한 주의가 필요합니다.

키 사양

Redis는 문제가 발생했을 때 쉽게 찾을 수 있도록 표준화되어야 합니다. Redisscheme이 없는 KV 데이터베이스에 속하므로 규칙에 따라 scheme 의미를 설정합니다. 이점: 🎜
  1. 🎜특정 유형의 키를 기반으로 데이터를 정리할 수 있습니다🎜
  2. 🎜특정 유형의 키를 기반으로 데이터를 업데이트할 수 있습니다🎜
  3. 🎜특정 키 유형의 소유권 및 적용 시나리오를 이해할 수 있습니다🎜
  4. 🎜통합 및 플랫폼화에 대비하고 기술 변경을 줄입니다🎜
🎜일반적으로 에는 비즈니스, 키 목적, 변수 등의 차원이 있어야 합니다. 각 차원은 다음으로 구분됩니다. 다음은 여러 키의 예입니다. 🎜🎜🎜user:sex 사용자 성별 10002232🎜🎜🎜 🎜msg:achi 201712의 사용자 댓글 순위🎜🎜

위 내용은 Redis 사양은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제