2019独角兽企业重金招聘Python工程师标准>>>

http://redisbook.readthedocs.io/en/latest/

redis为什么会有高并发问题

  • redis的出身决定

redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以redis本身并没有锁的概念,多 个客户端连接并不存在竞争关系,但是利用jedis等客户端对redis进行并发访问时会出现问题。发生连接超时、数据转换错误、阻塞、客户端关闭连接等 问题,这些问题均是由于客户端连接混乱造成。

同时,单线程的天性决定,高并发对同一个键的操作会排队处理,如果并发量很大,可能造成后来的请求超时。

在远程访问redis的时候,因为网络等原因造成高并发访问延迟返回的问题。

解决办法

  • 在客户端将连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。
  • 服务器角度,利用setnx变向实现锁机制。这个方法在实际环境中如何使用,本人并不清楚。

jedis常见错误分析

异常代码1:

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

问题分析:redis.clients.util.Pool.getResource会从JedisPool池中返回一个可用的redis连接,关于JedisPool中可用连接的配置有几个重要的参数如下:

MaxActive:可用连接实例的最大数目,为负数的时候没有限制。

MaxIdle:空闲连接实例的最大数目,为负值时没有限制。

MaxWait:等待获取链接的超时时间。

也就是说当连接池中没有active/idle的连接时,会等待maxWait时间,如果等待超时还没有可用连接,则抛出Could not get a resource from the pool异常。所以为避免这样的错误,
我们应该根据程序实际情况合理设置这三个参数的值,同时在我们获取一个连接的程序方法中也应该合理的处理这个异常,当没有连接可用时,等待一段时间再获取也许是个比较好的选择。

异常代码2:

redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out

遇到这个异常,可能会比较疑惑,redis是对内存的操作,速度一个在毫秒级别,在对redis操作出现秒级别的操作时会让人感觉疑惑,但是本文开头已经说过了,在一些特殊情况下,redis出现超时并不奇怪。jedis在初始化JedisPool时应该根据实际情况通过redis.clients.jedis.JedisPoolConfig合理设置连接池参数,通过redisPool构造方法,设置socket读取输入InputStream的超时时间。

`pool = new JedisPool(config, host, port, 100000)`;

第四个参数是time out,单位是毫秒。可以通过合理的设置这个值来规避问题。但是这不能完全解决超时的为题。有些高并发情况下,延时返回时间甚至会达到几十秒的极端情况。 这个问题要通过代码层面解决redis单线程本身不支持锁,在对同一个键进行并发操作会产生竞争的问题。

转载于:https://my.oschina.net/iioschina/blog/746675

redis学习笔记二相关推荐

  1. StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用

    StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 原文: StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 Connec ...

  2. Redis学习笔记(二) [配置文件,3种新的数据类型,Jedis操作]

    近期计划对redis再进行一段详细的学习, 在B站找到了尚硅谷的redis教学视频->[尚硅谷]Redis 6 入门到精通 超详细 教程,进行学习记录 文章目录

  3. Redis学习笔记(二)SpringBoot整合

    Redis学习笔记(二) SpringBoot整合 测试 导入依赖 查看底层 配置连接 测试连接 自定义`RedisTemplate` 在开发中,一般都是以json来传输对象: 所以实际开发中所有对象 ...

  4. Redis学习笔记(B站狂神说)(自己总结方便复习)

    Redis学习笔记B站狂神说 redis: 非关系型数据库 一.NoSQL概述 1.为什么要用Nosql 1.单机Mysql的年代 思考一下,这种情况下:整个网站的瓶颈是什么? 1.数据量如果太大,一 ...

  5. Redis学习笔记-GEO经纬度编码原理地理划分

    文章目录 Redis学习笔记-GEO经纬度编码原理&地理划分 1.笔记图 2.GEO 应用场景 3.GEO 数据特点举例 4.GeoHash 的编码方法(二分区间,区间编码) 5.GEO 经纬 ...

  6. Redis(学习笔记)

    Redis学习笔记 1.NoSQL数据库 1.1解决的问题 1.1.1解决CPU及内存压力 1.1.2解决IO压力 1.2NoSQL数据库概述 1.2.1什么是NoSQL数据库 1.2.2适用与不适用 ...

  7. Redis学习笔记①基础篇_Redis快速入门

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 资料链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA( ...

  8. Redis学习笔记(八)redis之lua脚本学习

    redis系列文章目录 使用spring-data-redis实现incr自增 Redis 利用Hash存储节约内存 Redis学习笔记(九)redis实现时时直播列表缓存,支持分页[热点数据存储] ...

  9. zset获取指定score_redis zset更新score redis学习笔记5 - Redis - 服务器之家

    redis zset更新score redis学习笔记5 发布时间:2017-04-03 来源:服务器之家 一:概述 zset全称为sorted-sets类型,和set数据类型有极为相似,都是字符串的 ...

最新文章

  1. Safari 有望支持 WebP
  2. Linux的19 个装B的命令,记得搂一遍!!!
  3. python3.5升级_python升级 (2.6升级到3.5)
  4. 接口作为参数,不同的接口调用不同的方法,例如:输出“I love Game”或输出“我喜欢游戏”...
  5. 设计模式笔记 10.Facade 外观模式(结构型模式)
  6. adf平稳性检测_ADF声明性组件示例
  7. 【转】LCS和LCS服务器应用程序概述
  8. Centos 7 定时关机
  9. 如何删除在Github中创建的项目
  10. Vosviewer图谱相关指标详细解释1
  11. android 静默安装实现,Android 中静默安装实现详解
  12. 成都Uber优步司机奖励政策(3月10日)
  13. uva-10041-水题
  14. 茶叶蛋大冒险全部攻略
  15. [渝粤教育] 西南科技大学 统计学原理 在线考试复习资料(2)
  16. syscall常量解释(持续完善中)
  17. ddn高性能服务器,HPE牵手DDN打造整合的高性能服务器存储产品组合
  18. 无路可逃java攻略_孤岛惊魂5
  19. PHP苹果支付以及事件通知-周期订阅实现
  20. 2014校园招聘_百度2014校园招聘

热门文章

  1. 分布式事务及分布式系统一致性解决方案
  2. 第一部分 线性表的链式存储(三)--静态链表
  3. linux命名管道进程间通信,《Linux 进程间通信》命名管道:FIFO
  4. Linux下SVN 命令操作手册
  5. 在GitHub上分享和展示你的代码
  6. 基于注解的Spring MVC与JPA如何解决实体的延时加载问题
  7. JS:The Definitive Guide JavaScript 和 XML
  8. 为实现电动车长途旅行,特斯拉超级充电站将大幅升级
  9. 可以完成99%的静态页面的HTML标签
  10. Oracle学习总结2-数据处理