Redis 다시 만난 구덩이 로

read timeout:참고:http://bert82503.iteye.com/blog/2184225
문제.
그 동안 파충 류 를 하 다가 redis 로 URL 을 만 들 었 더 니 문제 가 자주 발생 했 습 니 다.먼저 몇 가지 이상 을 보 겠 습 니 다.
redis.clients.jedis.exceptions.JedisDataException: ERR Protocol error: invalid multibulk length
    at redis.clients.jedis.Protocol.processError(Protocol.java:127)
    at redis.clients.jedis.Protocol.process(Protocol.java:161)
    at redis.clients.jedis.Protocol.read(Protocol.java:215)
    at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)
    at redis.clients.jedis.Connection.getIntegerReply(Connection.java:265)
    at redis.clients.jedis.Jedis.zadd(Jedis.java:1385)
    at com.shu2man.service.RedisServiceImpl.zadd(RedisServiceImpl.java:73)
    at com.shu2man.crawler.Crawler.doCrawl(Crawler.java:68)
    at com.shu2man.crawler.CrawlManager$WorkTask.run(CrawlManager.java:138)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

그리고 이거.
redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Connection reset
    at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:202)
    at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40)
    at redis.clients.jedis.Protocol.process(Protocol.java:151)
    at redis.clients.jedis.Protocol.read(Protocol.java:215)
    at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)
    at redis.clients.jedis.Connection.getIntegerReply(Connection.java:265)
    at redis.clients.jedis.Jedis.zadd(Jedis.java:1385)
    at com.shu2man.service.RedisServiceImpl.zadd(RedisServiceImpl.java:73)
    at com.shu2man.crawler.Crawler.doCrawl(Crawler.java:68)
    at com.shu2man.crawler.CrawlManager$WorkTask.run(CrawlManager.java:138)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

좋 은 레 디 스 연결,한 조작 에 아무 문제 가 없 으 며,파충류 가 뛰 자마자 잘못 보고 합 니 다.
분석(추측)
글 의 첫 번 째 글 을 참고 하면 문 제 는 Redis 가 입력 흐름 을 사용자 정의 한 것 으로 보인다.파충류 프로그램 에서 여러 개의 스 레 드 가 달리 고 있 는데 여러 스 레 드 가 동시에 명령 을 보 낼 때 명령 이 혼 란 스 러 워 이상 을 초래 했다.
해결 하 다.
레 디 스 를 봉 인 했 기 때문에 봉 인 된 함 수 를 synchronized 로 수식 하면 상술 한 문 제 를 피 할 수 있 습 니 다.
synchronized 가 수식 하면 상기 문 제 를 피 할 수 있 지만 저 는 경험 에 따 르 면 많은 병발 이 높 은 상황 에서 명령 이 교차 하지 않 습 니 다.제 파충류 가 1 초 에 몇 십 여 개의 요 구 를 했 기 때문에 이 문 제 를 야기 하지 않 을 것 입 니 다.그러나 문 제 는 객관 적 으로 존재 하기 때문에 열심히 연구 해 야 합 니 다.
이상 의 문 제 는 개인 적 인 추측 분석 입 니 다.고견 이 있 으 면 아낌없이 가르쳐 주 십시오.댓 글 을 환영 합 니 다.

좋은 웹페이지 즐겨찾기