>  기사  >  데이터 베이스  >  Redis 분산 잠금이 캐시 고장을 방지하는 방법

Redis 분산 잠금이 캐시 고장을 방지하는 방법

王林
王林앞으로
2023-06-03 19:04:371406검색

캐시 분해

캐시 침투와는 다르게, 캐시 분해는 캐시에는 없지만 데이터베이스에 존재하는 핫 데이터를 말합니다.

예를 들어 홈페이지의 핫 뉴스, 동시 방문 수가 매우 많은 핫 데이터, 캐시가 만료되면 서버는 DB에 동시 쿼리가 많이 발생하면 쿼리합니다. , DB가 즉시 압도될 수 있습니다.

아래와 같이 간단한 다이어그램을 그렸습니다.

Redis 분산 잠금이 캐시 고장을 방지하는 방법

해결책: DB 쿼리와 분산 잠금.

잠금 해제 상황

문제 해결에 앞서 먼저 처리되지 않은 코드와 동작 조건을 살펴보세요.

제품 ID를 기준으로 제품 세부 정보 코드를 쿼리

Redis 분산 잠금이 캐시 고장을 방지하는 방법

Redis 캐시를 지우고 동시 액세스 테스트를 위해 5개의 스레드를 엽니다. 테스트 코드는 다음과 같습니다.

Redis 분산 잠금이 캐시 고장을 방지하는 방법


DB가 한 번만 쿼리되고 다음 4개 쿼리는 Redis 캐시에서 가져올 수 있지만 결과는 다음과 같습니다.
Redis 분산 잠금이 캐시 고장을 방지하는 방법
분산 잠금이 추가되지 않습니다. 결과도 예상되지만 이 컨테이너는 캐시에 많은 부담을 줍니다. DB.

단일 서버라면 그냥 Java의 동기화 잠금을 직접 사용하세요

Redis 분산 잠금이 캐시 고장을 방지하는 방법

안타깝게도 일반적으로 백엔드는 클러스터를 배포하며 Java의 동기화 잠금은 분산 잠금을 구현할 수 없습니다.

Redis 분산 잠금은 캐시 고장을 해결합니다.

Java의 내장 잠금은 단일 시스템에만 적용할 수 있으며 배포할 수 없습니다. Redis를 사용하여 분산 잠금을 구현할 수 있습니다.

분산 잠금을 추가한 후의 코드

//根据ID查询商品
@GetMapping("/{id}")
public R id(@PathVariable String id){
	//先查Redis缓存
	Object o = redisTemplate.opsForValue().get(id);
	if (o != null) {
		//命中缓存
		System.err.println("id:"+id+",命中redis缓存...");
		return R.success(o);
	}

	//缓存未命中 查询数据库
	String lockKey = "lock" + id;
	//加锁,10s后过期
	for (;;) {
		if (redisTemplate.opsForValue().setIfAbsent(lockKey, System.currentTimeMillis(), 10L, TimeUnit.SECONDS)) {
			//加锁成功的线程,再次检查
			o = redisTemplate.opsForValue().get(id);
			if (o != null) {
				//命中缓存
				System.err.println("Thread:" + Thread.currentThread().getName() + ",id:"+id+",命中redis缓存...");
				//释放锁
				redisTemplate.delete(lockKey);
				return R.success(o);
			}

			//仍未命中
			System.err.println("Thread:" + Thread.currentThread().getName() + ",id:" + id + ",查询DB...");
			Goods goods = goodsMapper.selectById(id);
			//结果存入Redis
			redisTemplate.opsForValue().set(id, goods);
			//释放锁
			redisTemplate.delete(lockKey);
			return R.success(goods);
		}
		//竞争不到锁,暂时让出CPU资源
		Thread.yield();
	}
}

동시 액세스를 위해 5개의 스레드를 시작하면 다음과 같습니다.

Redis 분산 잠금이 캐시 고장을 방지하는 방법

위 내용은 Redis 분산 잠금이 캐시 고장을 방지하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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