사용자 포인트, 게시물 수, 댓글 수 등, 섹션의 총 게시물 수, 총 댓글 수 등과 같은 데이터에 대한 일부 통계를 구현하고 싶습니다.
예: 사용자 게시물에 대한 포인트 증가, 게시물 수 통계 업데이트, 동일한 섹션의 게시물 통계 변경 또는 기타 통계 변경이 있을 수 있습니다.
이 경우 필요한 곳에 데이터 테이블 count() 통계를 직접 사용해야 할까요, 아니면 테이블에 다양한 통계 필드를 추가하고 트리거될 때 트랜잭션을 통해 완료해야 할까요?
저는 개인적으로 후자를 선호하는데, 통계의 일관성을 보장하기 위해 트랜잭션을 이용하는 것은 좀 무리라고 생각합니다. ?
그런데 또 트랜잭션이 사용되지 않으면 페이징 오류 등 일부 위치의 통계 오류로 인해 일부 오류가 발생하게 됩니까?
좋은 아이디어나 제안이 있으신가요? 조언 좀 부탁드려요!
카운트를 사용하지 않는 것이 가장 좋습니다. 데이터 양이 많으면 데이터베이스가 이러한 종류의 쿼리, 특히 사용자에게 이러한 종류의 쿼리를 처리할 수 없습니다.
정기적으로 카운트한 후 캐시에 넣어두세요
저는 마스터는 아니지만 해보면 이런 데이터를 Redis에 넣어놓을 겁니다.
[배경]
1 이 문제는 데이터베이스 성능이 기존 비즈니스 시나리오를 충족할 수 없기 때문에 발생합니다
2 제공하신 비즈니스 시나리오에 따르면 데이터에 특정 오류가 허용됩니다
【프로그램 구조】
기존 프로그램 구조는 데이터베이스를 직접 호출하여 작동하지만, 데이터베이스의 성능이 요구 사항을 충족할 수 없습니다. 이때 데이터베이스에만 의존할 수는 없으므로 데이터베이스 사이에 [카운터] 레이어를 추가해야 합니다
으아악프로그램 조정 전후에 데이터베이스의 [추가], [삭제], [수정] 세 개의 링크에 [aspect]를 추가해야 하는데, 이는 afterSave 이벤트이며, 이는 후크로도 이해될 수 있습니다. Redis는 일반적으로 [카운터]에 사용됩니다. 지속성이 가능하기 때문입니다
【주의 사항】1 db 작업은 정상일 수 있지만 redis 작업이 실패하면 데이터 오류가 발생할 수 있습니다.
2 오류가 있을 수 있으므로 오류 수정 메커니즘이 필요합니다. 이 메커니즘은 서버에 대한 부담을 줄일 수 있습니다. . 작은 경우에는 mysql의 개수 또는 합계를 사용하여
3을 업데이트하거나 다른 [트랜잭션 메커니즘]을 사용하여 DB 및 Redis 작업의 원자성을 보장합니다.
InnoDB의 카운트는 모든 데이터 행을 실시간으로 스캔해야 하기 때문에 속도가 느립니다.
Myisam은 너무 많이 사용하면 안 됩니다.
권장
数据表添加统计字段
통계는 백엔드 서비스를 사용하여 처리됩니다. 예를 들어 백엔드는 슬레이브에 연결되어 있어 비즈니스에 영향을 미치지 않습니다.
첫 번째 분은 데이터 축적을 위해 count() 형식을 사용하는 것을 권장하지 않으며, 누적 형식을 선호해야 합니다.
새 데이터가 추가될 때마다 count()를 사용하여 개수를 계산해야 하기 때문에 이는 데이터베이스에 매우 부담이 됩니다.
따라서 다음을 수행하는 것이 좋습니다.
1. nosql을 사용하여 모든 통계 데이터를 유지합니다.
2. 새 데이터를 추가할 때 모듈을 트리거하여 해당 데이터를 축적하고 원본 데이터를 덮어씁니다.
3. nosql 다운 문제가 발생하는지 확인하려면 해당 통계 데이터를 데이터베이스에 저장하고 정기적으로 nosql 데이터를 데이터베이스에 저장하는 논리 모듈을 작성하는 것이 좋습니다.
4. 물론 정기적으로 count를 사용하여(서버가 유휴 상태일 때도 가능) 통계가 올바른지 다시 확인할 수 있습니다