저는 최근 비즈니스 개발에 푹 빠져 한동안 블로그를 업데이트하지 않았습니다. 이전 블로그 게시물에서는 비즈니스 시나리오의 실용적인 솔루션이나 더 나은 디자인 아이디어를 공유할 계획입니다. 한 주제에 초점을 맞춘 글이라 관련 내용을 정리하는 데 시간이 많이 걸립니다(큰 트릭을 억제함). 후속 기사의 내용은 그다지 풍부하지 않을 수 있지만, 이에 대한 좀 더 자세하고 심층적인 분석을 시도해보세요. 원포인트, 지속적인 공유와 자체 검토를 통해 경험을 축적하고 블로그 공유 빈도를 높여보세요
Scenario
시나리오 1
留言功能限制,30秒 内只能评论 10次,超出次数不让能再评论,并提示:过于频繁
시나리오 2
点赞功能限制,10秒 内只能点赞 10次,超出次数后不能再点赞,并禁止操作 1个小时,提示:过于频繁,被禁止操作1小时
시나리오 3
上传记录功能,限制一天只能上传 100次,超出次数不让能再上传,并提示:超出今日上线
본질을 분리
하는 과정에서 비즈니스 개발에 지속적으로 참여합니다. 다양한 비즈니스 시나리오에 대한 솔루션을 설계할 때 매우 유사한 시나리오에 직면하기 쉬운 경우가 많지만 실제로 이러한 요구 사항의 본질은 동일한 문제에 직면할 때 발생합니다. 그러한 시나리오에서는 자신의 경험을 바탕으로 수요의 본질적인 문제를 분석하고 추출하고, 보편적인 솔루션을 구현하고, 솔루션을 더욱 가치있게 만들어야 합니다. 이것이 영혼을 가진 엔지니어인지 아니면 영혼을 가진 엔지니어인지의 차이일 수 있습니다. 최강 CP(복사 붙여넣기) 왕.
위의 세 가지 비즈니스 시나리오를 분석하면 유사한 문제라고 부르는 유사한 논리가 있음을 알 수 있습니다. 이제 이 문제를 분리하고 일반적인 솔루션을 설계하고 동일한 논리 흐름도를 개략적으로 설명하겠습니다.
위의 수요 시나리오를 분석하여 필요한 모든 조건을 추출합니다.
제한된 개체: 사용자 제한 작업(댓글, 좋아요, 기록 등) 제한 작업 수가 X초 범위 내에서 Y회를 초과합니다. 금지된 작업 시간 Z(초/특정 시간)을 초과한 후에는 더 이상 작업이 허용되지 않으며 프롬프트
(最小时间单位用秒:天/小时/分钟都可换算成秒,用秒可以解决更多的场景)
함수를 일반 함수로 추출하면 아마도 다음과 같을 것입니다.
<?php /** * 频率限制 * @param string $action 操作动作 * @param int $userId 发起操作的用户ID * @param int $time 时间范围X秒内 * @param int $number 限制操作数Y次 * @param array $expire 超出封印时间Z ['type'=>1,'ttl'=>过期时间/秒] ['type'=>2,'ttl'=>具体过期时间戳] 二选一 * @return bool * @throws \Exception */public static function frequencyLimit(string $action, int $userId, int $time, int $number, $expire = []){ // todo 根据用户操作动作时间范围,进行频率的控制和失效释放}
The 솔루션이 구현되었습니다
기능 사용자가 시작한 작업과 시간은 물론 누적 횟수도 저장해야 하며, 이때 저장을 mysql에 의존한다면 상당히 고통스럽습니다. 생각해 보세요. 여기서 주인공은 redis 기능, incr의 원자적 작동 및 키 지원 만료 메커니즘을 기반으로 하는 redis가 마침내 등장했으며, 메모리 저장의 효율성 이점을 통해 상대적으로 간단하고 유연하며 효율적으로 목적을 달성할 수 있다는 것입니다.
다음은 단순히 공통 기능을 구현하는 코드입니다.
<?php /** * 频率限制 * @param string $action 操作动作 * @param int $userId 发起操作的用户ID * @param int $time 时间范围X秒内 * @param int $number 限制操作数Y次 * @param array $expire 超出封印时间Z ['type'=>1,'ttl'=>过期时间/秒] ['type'=>2,'ttl'=>具体过期时间戳] 二选一 * @return bool * @throws \Exception */public function frequencyLimit(string $action, int $userId, int $time, int $number, $expire = []){ if (empty($action) || $userId get($key)); if ($current >= $number) return false; //累计并返回最新值 $current = $r->incr($key); //第一次累加,设置控制操作频率的有效时间 if ($current === 1) $r->expire($key, $time); //未超出限制次数先放过 if ($current 0 && in_array($type, [1, 2])) { if ($type === 1) $r->expire($key, $ttl); if ($type === 2) $r->expireAt($key, $ttl); } return false; }//场景1/** * 评论限制 * @param int $userId * @return bool|string */public function doComment(int $userId){ try { $pass = FrequencyLimit::doHandle('comment', $userId, 30, 10); if (!$pass) return '过于频繁'; // todo 评论逻辑 return true; } catch (\Exception $e) { return $e->getMessage(); } }//场景2/** * 点赞限制 * @param int $userId * @return bool|string */public function doLike(int $userId){ try { $pass = FrequencyLimit::doHandle('like', $userId, 10, 10, ['type' => 1, 'ttl' => 1 * 60 * 60]); if (!$pass) return '过于频繁,被禁止操作1小时'; // todo 点赞逻辑 return true; } catch (\Exception $e) { return $e->getMessage(); } }//场景3/** * 上传限制 * @param int $userId * @return bool|string */public function doUpload(int $userId){ try { $expire = strtotime(date('Y-m-d', strtotime(+1 . 'days'))); $pass = FrequencyLimit::doHandle('upload', $userId, 1 * 24 * 60 * 60, 100, ['type' => 2, 'ttl' => $expire]); if (!$pass) return '超出今日上线'; // todo 上传逻辑 return true; } catch (\Exception $e) { return $e->getMessage(); } }//场景N
编码上可以根据你设计这个通用方案的复杂度进行进一步抽象,如抽象成频率限制的功能类等
요약
유사한 비즈니스 시나리오를 분석하고, 필수적인 문제를 발견하고, 일반적인 솔루션을 설계하세요.
솔루션의 가치를 높이고 영혼을 갖춘 개발자가 되세요.
에 능숙하세요. redis를 사용하여 기능과 장점을 최대한 활용해 보세요
더 많은 Redis 관련 기술 기사를 보려면 Redis Tutorial 칼럼을 방문하여 알아보세요!
위 내용은 Redis 실제 전투 제한 작동 빈도의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

redisoutperformstraditionaldatabasesinspeedforread/writeoperationsduetoitsin-memorynature, whiletraditionaldatabasesexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexexceleclexquer

useredisinsteadofatraditionaldatabasewhenyorapplicationrequiresspeedandreal-timedataprocessing, suchasforcaching, sessionmanagement, orreal-timeanalytics.rediesxcelsin : 1) Caching, Retoadon-PrimaryDatabases; 2) 세션 관리, 단순화 datahandlon

Redis는 고성능과 유연성으로 인해 SQL 데이터베이스를 뛰어 넘습니다. 1) Redis는 메모리 스토리지를 통해 매우 빠른 읽기 및 쓰기 속도를 달성합니다. 2) 복잡한 데이터 처리에 적합한 목록 및 컬렉션과 같은 다양한 데이터 구조를 지원합니다. 3) 단일 스레드 모델은 개발을 단순화하지만 높은 동시성은 병목 현상이 될 수 있습니다.

Redis는 동시성이 높은 기존 데이터베이스보다 우수하고 대기 시간 시나리오가 낮지 만 복잡한 쿼리 및 트랜잭션 처리에는 적합하지 않습니다. 1.Redis는 메모리 저장, 빠른 읽기 및 쓰기 속도, 높은 동시성 및 낮은 대기 시간 요구 사항에 적합합니다. 2. 전통적인 데이터베이스는 디스크를 기반으로하며 복잡한 쿼리 및 트랜잭션 처리를 지원하며 데이터 일관성과 지속성이 강합니다. 3. Redis는 기존 데이터베이스의 보충 또는 대체물로 적합하지만 특정 비즈니스 요구에 따라 선택해야합니다.

redisisahigh-performancein-memorydatrscructurestorestorethexcelscelsspeedandversitility

Redis는 주로 데이터베이스이지만 단순한 데이터베이스 이상입니다. 1. 데이터베이스로서 Redis는 지속성을 지원하고 고성능 요구에 적합합니다. 2. 캐시로서 Redis는 응용 프로그램 응답 속도를 향상시킵니다. 3. 메시지 중개인으로서 Redis는 실시간 커뮤니케이션에 적합한 Publish-Subscribe 모드를 지원합니다.

redisiSamultifacetedToolthatservesAsadatabase, Server 및 more.ItfunctionsAnin-memoryDatrastRuctureStore, SupportSvariousDatastructures, andCanbeusedAsacache, MessageBroker, SessionStorage, 및 FordiptributedLocking을 지원합니다.

redisisanopen-source, in-memorydatructurestorestoreusedasadatabase, cache 및 messagebroker, excell


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는