美文网首页
Redis去重遇到的坑

Redis去重遇到的坑

作者: shu2man | 来源:发表于2018-11-18 14:03 被阅读0次

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连接,单个操作什么问题都没有,爬虫一跑起来就报错。

分析(猜想)

参考了文首的那篇文章,问题应该是Redis自定义了输入流,爬虫程序中起了很多个线程在跑,当多个线程同时发送命令的时候,造成命令混乱,导致异常。

解决

因为我把Redis封装了,只要把封装函数用synchronized修饰就能避免上述问题。

虽说synchronized修饰一下就能避免以上问题,但根据鄙人经验,很多并发很高的情况都不至于导致命令交织,我的爬虫一秒才几个十来个请求,显然不至于导致这个问题,但问题确实客观存在,还应努力探究出个所以。

以上问题是个人猜想分析,如有高见,还请不吝赐教,欢迎留言。

相关文章

  • Redis去重遇到的坑

    read timeout:参考:http://bert82503.iteye.com/blog/2184225 问...

  • redis遇到的坑

    PUBSUB发布订阅模式的listen坑 demo 上面代码订阅者进入监听, 如果要停止监听在windows环境和...

  • redis遇到的坑

    1、遇到的问题: 护士提交了一封院内压疮文书,应该提交给护士长的,但是护士长却没有看到。每一封文书通过绑定不同的流...

  • React 中数组去重遇到的坑

    本人reactx小白,刚开始用react学些项目,目前在react项目中想要写一个数组去重的小方法,寻思直接使用f...

  • Redis中zadd方法参数变化

    搭建代理池的时候遇到的坑。 redis-py 3.0之前写法: redis-py 3.0之后写法: 代理池搭建参考...

  • redis访问优化

    一、使用redis进行去重的时候用到了setnx原先的写法是 那么一条去重的数据会访问2次redis 修改为 一次...

  • 使用Python操作redis遇到的坑

    原文链接:使用Python操作redis遇到的坑--Chichele's Blog 写在前面 基于Python3....

  • centos7 下搭建 php7+nginx+redis的记录(

    搭建php7+nginx很容易,没有什么坑,但是在配置redis的时候遇到了很多的坑。参照网上的前辈教程,然后根据...

  • scrapy redis url去重

    scrapy redis url去重 看到网上有很多有关标题的文章,也想实现这个功能,(虽然没看懂),本人小白一名...

  • centos系统搭建redis集群

    排坑 坑1 更换境内gem源 坑2 ruby版本升级 在安装redis官方给的工具:redis-trib.rb 这...

网友评论

      本文标题:Redis去重遇到的坑

      本文链接:https://www.haomeiwen.com/subject/ctwefqtx.html