요구사항 설명
일부 페이지는 광고나 이벤트 프로모션 이미지로 구성되어야 합니다. 광고나 활동은 언제든지 온라인 및 오프라인으로 전환될 수 있어야 하며, 만료 후 자동으로 오프라인으로 전환되고, 때가 되면 자동으로 온라인으로 전환될 수 있어야 합니다.
예: 현재 시간은 2019-2-22 16:16:13입니다. 결제 완료 페이지에서 보상 수집 활동을 구성하려면 활동이 2019-3-10 00:00:00 시간에 온라인이어야 합니다. 2019-3-30 23 :59:59 활동 종료.
따라서 원하는 효과는 활동이 온라인으로 전환되기 전 언제든지 활동을 구성한 후 지정된 시간에 페이지가 자동으로 온라인으로 전환되는 것입니다. 또한, 여러 다른 활동이나 광고가 있을 수 있으며, 각 페이지의 광고 수는 다양하며, 페이지마다 온라인 및 오프라인 시간이 다를 수 있으며, 다른 페이지에서도 이러한 기능을 구현해야 하며 페이지 간 활동이 반드시 필요한 것은 아닙니다. 똑같다.
요구사항 분석
요구사항은 몇 단어에 불과하므로 자세히 분석해 보겠습니다.
키워드 추출
광고 또는 이벤트 프로모션 사진
온라인 및 오프라인 상시, 만료되면 자동 오프라인, 때가 오면 자동 온라인
각 페이지의 광고 수는 가변적입니다
다른 광고 온라인과 오프라인 시간은 다를 수 있습니다
페이지 간 활동이 반드시 동일하지는 않습니다
데이터베이스 분석
1. [광고 또는 이벤트 홍보 사진]
다른 광고를 설정하려면 페이지, 일부 페이지의 광고는 동일할 수 있습니다. 즉, 광고가 재사용되므로 광고 테이블이 있어야 합니다.
2. [페이지별 광고 개수는 가변적임] [광고별로 온라인 및 오프라인 시간이 다를 수 있음] [페이지 간 활동이 반드시 동일할 필요는 없음]
한 페이지에 여러 개의 광고가 구성될 수 있으며, 모두 그 중 페이지 구성 테이블이 필요하며, 광고와 페이지 간의 관계 테이블, 즉 페이지 광고 테이블이 필요합니다.
페이지 구성 테이블은 주로 페이지의 광고 수를 구성하여 [각 페이지의 광고 수는 가변적]을 구현합니다. 페이지 광고 테이블은 주로 페이지의 각 광고의 온라인 및 오프라인 시간을 구성하여 [ 온라인과 오프라인 광고 시간은 다를 수 있음]
간단한 분석을 통해 다음과 같은 테이블 구조를 생각해냈습니다: 광고 테이블(adv), 페이지 구성 테이블(page_config), 페이지 광고 테이블(page_adv)

Thinking
이 페이지에 구성된 광고는 일정 기간 동안 변경되지 않습니다. 페이지 요청 수가 많으면 광고 쿼리 수가 매우 빈번해져 데이터베이스에 불필요한 부담이 발생합니다. 따라서 캐싱을 도입하여 데이터베이스 요청 수를 줄이고 데이터베이스 부담을 완화할 수 있습니다. 여기서는 Redis를 사용합니다.
언제 캐시되나요?
서비스가 시작될 때 온라인 및 오프라인 시간 간격에 있던 광고를 캐시에 비동기적으로 로드하도록 선택하거나, 캐시가 존재하지 않는 경우 캐시를 가져오도록 선택할 수 있습니다. 라이브러리를 캐시에 넣습니다. 캐싱 시간은 상황에 따라 다릅니다.
여기서 선택할 수 있는 방법은 프로젝트가 시작될 때 적격 페이지의 광고 구성 정보를 Redis에 비동기적으로 저장하는 것입니다. 아직 지정된 시간에 도달하지 않은 페이지는 광고를 로드하기 위해 페이지에 액세스할 때 Redis에 먼저 저장되지 않습니다. Redis가 먼저 확인됩니다. 아무것도 없으면 조건(>=nowtime)을 눌러 데이터베이스를 확인하고 확인 후 Redis에 저장합니다.
인터페이스에서 광고 구성 정보를 얻은 후 현재 시간이 구성된 시간 간격 내에 있는지 확인합니다. 한 페이지에 여러 개의 광고가 구성되어 있으므로 광고 시간이 다르기 때문에 반복하여 반환해야 합니다. 일치하고 만료된 항목을 표시한 다음 Redis에서 전체 페이지의 구성 정보를 삭제합니다. (또는 시작 시 로드하도록 선택하지 않고 사용자가 요청할 때 캐시를 추가하기만 하면 됩니다. 그러나 로드를 새로 고칠 때 아래 1단계의 방법이 사용되므로 삭제할 수 없습니다.)
특정 구현
1단계, 프로젝트가 시작되면 먼저 Redis
a에 페이지 광고 구성 정보를 저장하고, 모든 pageIds
SELECT pageId FROM page_config page_adv WHERE nowtime<p>를 쿼리하고 두 테이블을 조인하여 List<pageid>를 가져옵니다. 얻는 것은 광고로 구성된 모든 페이지 ID이며 광고는 그렇지 않습니다. 만료되었습니다. </pageid></p><p>b. pegeId</p><pre class="brush:php;toolbar:false">SELECT 字段名 FROM page_adv adv WHERE begintime<p>에 해당하는 광고 이미지와 점프 링크를 쿼리한 다음, 찾은 구성 정보 List<adv>를 넣고(비어 있으면 작업이 수행되지 않음) pageId를 KEY로 캐시에 넣습니다. </adv></p><h4 id="단계-쿼리-페이지-광고에-대한-프런트-엔드용-인터페이스-작성">2단계: 쿼리 페이지 광고에 대한 프런트 엔드용 인터페이스 작성</h4><p>표준 제어 계층, 비즈니스 계층 및 데이터 액세스 계층에 따라 작성되었습니다. 첫 번째 단계의 논리는 비즈니스 계층에서 완성됩니다. </p><p>컨트롤 레이어: </p><p>컨트롤 레이어는 매개변수 pageId를 수신하고 비즈니스 레이어를 호출하여 해당 페이지에 구성된 광고 정보를 쿼리합니다. 비어 있으면 상태 코드 0을 직접 반환합니다. 즉, 광고가 발생하지 않습니다. 프론트 엔드에 표시됩니다. </p><p>비어 있지 않으면 비즈니스 로직(예: img의 URL과 도메인 이름)에 따라 데이터가 처리된 다음 상태 코드 1이 반환되고 프런트 엔드에 광고가 표시됩니다. 제어 계층은 여기에 광고 목록을 반복하고, 광고 시작 시간 내의 현재 시간을 반환하고, 광고가 만료되는 한 광고 목록 캐시는 반환하지 않는 논리를 추가할 수도 있습니다. 지워졌습니다. 만료된 항목을 삭제하는 것이 논리입니다. </p><p>비즈니스 계층: </p><p>먼저 캐시를 가져온 다음 데이터베이스를 확인하여 비어 있지 않은지 확인하고(이 페이지는 광고로 구성됨) 캐시에 넣은 다음(pageId가 KEY임) 반환합니다. </p><p>데이터 액세스 계층: </p><p>SQL:</p><pre class="brush:php;toolbar:false">SELECT 字段名 FROM page_config adv page_adv WHERE begintime<p>3개의 테이블 공동 쿼리, pageId를 기반으로 현재 페이지에 구성된 광고 캠페인 정보 쿼리(이미 광고 캠페인 시간 내에 있음)</p><h4 id="단계-새로고침-로드">3단계, 새로고침 로드</h4><p>사용하는 이유 새로고침 로딩? </p><p>因为有这样的场景:给页面A配置了一个广告(当前时间在广告的起始时间内),那么这个页面的广告已经在缓存里了,假如此时A页面要新加一个广告,在后台配置后如果不做其他操作,这个广告不会显示(假设缓存时间较长,为一天),因为库更新了,缓存没有同步更新。</p><p>解决方案</p><p>使用Redis的发布订阅机制实现缓存的刷新加载,使新配置的广告及时能够显示。刷新加载的回调方法即第1步中的方法。</p><h3 id="进一步优化">进一步优化</h3><p>想一想,目前的实现存在什么问题?</p><p>存在的问题</p><p>假如有页面需要配置广告,但是还没有配(前端已经开发完上线,每次都会调接口查广告信息),那么数据库肯定查不到,缓存也没有。如果这个页面访问量很大,那么缓存没命中就查库,这样对库的压力就会很大,这就是缓存穿透,请求上来了很容易击垮数据库。那怎么办呢?</p><p>解决方案</p><p>当页面没有配置广告时,在缓存存标志,查询时先看标志,在决定是否往下走。</p><p>具体方案</p><p>这时,上面的第1步就要改了。</p><p>1、首先改第1步的步骤a的SQL,把所有的pageId都查询出来。</p><p>使用左连接</p><pre class="brush:php;toolbar:false">SELECT pageId FROM page_config LEFT JOIN page_adv ON ... GROUP BY pageId
或者干脆查page_config
SELECT pageId FROM page_config
目的是把已在page_config表中配置,但关系表中page_adv未配置广告的pageId也查出来,这样才能给未配置广告的pageId在缓存里放标志
2、第1步的步骤b的SQL改为
SELECT 字段名 FROM page_adv adv WHERE nowtime<p>然后把查到的配置信息放入缓存之前判断【为空时的不做操作】改为【为空时存入一个标志】假如这个标志KEY为pageId+"_EMPTY_FLAG",value为"DB_IS_NULL"</p><p>为什么只判断小于结束时间</p><p>因为如果该页面配置的广告开始时间大于当前时间,那么这个是查不到的,会被处理为DATABASE_IS_NULL,如果在这个标志还没失效之前就到了配置的开始时间了,那么这个广告不会被展示。所有要让未到开始时间的也放入缓存,然后让控制层去判断在不在时间区间。</p><p>3、所以要在第2步也修改一下</p><p>在业务层里取缓存中的广告列表之前,先从缓存取pageId+"EMPTY_FLAG"的value判断为"DB_IS_NULL"直接返回空,这样就能避免缓存穿透的问题了。</p><p>继续修改第2步的业务层,查库的SQL同样要改:</p><pre class="brush:php;toolbar:false">SELECT 字段名 FROM page_config adv page_adv WHERE nowtime<p>然后判断为空的话,同上面的黄字那样处理。</p><p>4、最后,第3步的刷新加载调的是第1步的方法,不用改。<br><br>当然这个缓存穿透的优化方案只是其中一种。还可以这样:</p><p>1、控制层拦截:根据pageId查询page_adv表,查不到说明没配置,直接返回。</p><p>2、page_config 表增加字段,表示当前页面已经配置的广告个数,默认0,每配置一个该字段加1,把大于0的pageId缓存起来,调接口时前判断在不在缓存里。</p>
위 내용은 Redis는 실시간 페이지 업데이트와 자동 온라인 업데이트를 어떻게 실현합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Redis의 핵심 기능은 고성능 인 메모리 데이터 저장 및 처리 시스템입니다. 1) 고속 데이터 액세스 : Redis는 메모리에 데이터를 저장하고 마이크로 초 수준 읽기 및 쓰기 속도를 제공합니다. 2) 풍부한 데이터 구조 : 문자열, 목록, 컬렉션 등을 지원하며 다양한 응용 프로그램 시나리오에 적응합니다. 3) 지속성 : RDB 및 AOF를 통해 디스크에 데이터를 지속하십시오. 4) 구독 게시 : 메시지 대기열 또는 실시간 통신 시스템에서 사용할 수 있습니다.

Redis는 다음을 포함하여 다양한 데이터 구조를 지원합니다. 1. String, 단일 값 데이터 저장에 적합합니다. 2. 큐 및 스택에 적합한 목록; 3. 비면성 데이터 저장에 사용되는 세트; 4. 순서, 순위 목록 및 우선 순위 대기열에 적합한 순서 세트; 5. 해시 테이블, 객체 또는 구조화 된 데이터를 저장하는 데 적합합니다.

Redis Counter는 Redis Key-Value Pair 스토리지를 사용하여 다음 단계를 포함하여 계산 작업을 구현하는 메커니즘입니다. 카운터 키 생성, 카운트 증가, 카운트 감소, 카운트 재설정 및 카운트 얻기. Redis 카운터의 장점에는 빠른 속도, 높은 동시성, 내구성 및 단순성 및 사용 편의성이 포함됩니다. 사용자 액세스 계산, 실시간 메트릭 추적, 게임 점수 및 순위 및 주문 처리 계산과 같은 시나리오에서 사용할 수 있습니다.

Redis Command Line 도구 (Redis-Cli)를 사용하여 다음 단계를 통해 Redis를 관리하고 작동하십시오. 서버에 연결하고 주소와 포트를 지정하십시오. 명령 이름과 매개 변수를 사용하여 서버에 명령을 보냅니다. 도움말 명령을 사용하여 특정 명령에 대한 도움말 정보를 봅니다. 종금 명령을 사용하여 명령 줄 도구를 종료하십시오.

Redis Cluster Mode는 Sharding을 통해 Redis 인스턴스를 여러 서버에 배포하여 확장 성 및 가용성을 향상시킵니다. 시공 단계는 다음과 같습니다. 포트가 다른 홀수 redis 인스턴스를 만듭니다. 3 개의 센티넬 인스턴스를 만들고, Redis 인스턴스 및 장애 조치를 모니터링합니다. Sentinel 구성 파일 구성, Redis 인스턴스 정보 및 장애 조치 설정 모니터링 추가; Redis 인스턴스 구성 파일 구성, 클러스터 모드 활성화 및 클러스터 정보 파일 경로를 지정합니다. 각 redis 인스턴스의 정보를 포함하는 Nodes.conf 파일을 작성합니다. 클러스터를 시작하고 Create 명령을 실행하여 클러스터를 작성하고 복제본 수를 지정하십시오. 클러스터에 로그인하여 클러스터 정보 명령을 실행하여 클러스터 상태를 확인하십시오. 만들다

Redis의 대기열을 읽으려면 대기열 이름을 얻고 LPOP 명령을 사용하여 요소를 읽고 빈 큐를 처리해야합니다. 특정 단계는 다음과 같습니다. 대기열 이름 가져 오기 : "큐 :"와 같은 "대기열 : my-queue"의 접두사로 이름을 지정하십시오. LPOP 명령을 사용하십시오. 빈 대기열 처리 : 대기열이 비어 있으면 LPOP이 NIL을 반환하고 요소를 읽기 전에 대기열이 존재하는지 확인할 수 있습니다.

Redis 클러스터에서 ZSET 사용 : ZSET은 요소를 점수와 연관시키는 순서 컬렉션입니다. 샤딩 전략 : a. 해시 샤딩 : ZSET 키에 따라 해시 값을 배포하십시오. 비. 범위 샤딩 : 요소 점수에 따라 범위로 나누고 각 범위를 다른 노드에 할당합니다. 작업 읽기 및 쓰기 작업 : a. 읽기 작업 : ZSET 키가 현재 노드의 샤드에 속하는 경우 로컬로 처리됩니다. 그렇지 않으면 해당 샤드로 라우팅됩니다. 비. 쓰기 작업 : 항상 ZSET 키를 들고있는 파편으로 라우팅합니다.

Redis 데이터를 지우는 방법 : Flushall 명령을 사용하여 모든 키 값을 지우십시오. FlushDB 명령을 사용하여 현재 선택한 데이터베이스의 키 값을 지우십시오. 선택을 사용하여 데이터베이스를 전환 한 다음 FlushDB를 사용하여 여러 데이터베이스를 지우십시오. del 명령을 사용하여 특정 키를 삭제하십시오. Redis-Cli 도구를 사용하여 데이터를 지우십시오.


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

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

드림위버 CS6
시각적 웹 개발 도구

WebStorm Mac 버전
유용한 JavaScript 개발 도구
