http://effective.blog.51cto.com/8296150/1671743

现在的计算机大都是多核的cpu,意味着可以并行执行多个进程.如果这多个运行的进程对同一份数据进行读写操作,那么就有可能出现两个或者多个进程读到的都是老的数据,这种情况下,再进行写入操作之后就会有一些进程写入的数据被覆盖掉,就导致最终的结果错误.这份数据对于这些进程来说就是临界区.

redis下处理并发问题.

1.通过使用setnx进行加锁,在操作系统以及数据库中处理并发都会用到锁机制,虽然加锁可以解决并发问题,但是会降低并发量,所以它们都会通过读写锁来降低锁的粒度.

加锁实际上就是把并行读写改成串行读写的方式来避免资源竞争

1
2
3
4
5
6
7
8
9
10
11
$redis new Redis();
$redis->connect('127.0.0.1', 6370);
if(!$redis->setnx('lock',1)){
    usleep(500000); //等待一段时间
    if(!$redis->setnx('lock',1)){
exit();
    }
}
redis->EXPIREAT('lock', 2); //设置一个过期时间,避免进程挂掉导致锁不能释放
//业务处理
$redis->del('lock');

2.watch + 事物,redis的事物不能自动回滚,所以在失败的情况下要处理回滚操作.如果事物中更新多个,那么回滚操作会比较麻烦,

1
2
3
4
5
6
7
8
$redis new Redis();
        $redis->connect('127.0.0.1', 6370);
        $redis->watch('test'); //必须在读之前进行watch
$redis->hGetAll('test')
       //业务处理
        $result $redis->multi()
                        ->hset()
                        ->exec();

3.减少写数据的粒度或者修改数据结构来避免并发,我们的业务中使用的是hset方式,把用户的数据都放到了一个filed中,这就导致一次更改要写入用户所有的数据,通过修改

使用hmset,更新数据的时候只更新需要更新的数据,降低写入的粒度来降低各个接口对临界区的读写访问.这种方式或许能避免部分接口对临界区的访问,不能避免的接口还需要另外

处理.

4.在并发量过大的情况下,可以通过消息中间件进行处理,把并行读写进行串行化.这种方式在一些高并发的场景中算是一种通用的解决方案,简单的方式可以通过redis的list实现,

在大规模的软件中就需要引入专门的消息中间层来处理了.

转载于:https://www.cnblogs.com/joshsung/p/7262335.html

redis下并发问题解决方案相关推荐

  1. 高并发架构解决方案总结

    高并发架构解决方案总结 一.关于高并发 高并发是指在同一个时间点,有很多用户同时访问URL地址,比如:淘宝的双11.双12,就会产生高并发.又如贴吧的爆吧,就是恶意的高并发请求,也就是DDOS攻击. ...

  2. 这可能是目前最全的Redis高可用技术解决方案

    转自:https://mp.weixin.qq.com/s/Z-PyNgiqYrm0ZYg0r6MVeQ 原作者:张东洪 常见的使用方式 Redis的几种常见的使用方式包括: Redis 单副本 Re ...

  3. Redis高可用技术解决方案大全

    近来一直在折腾redis高可用的方案,以及优缺点以及如何选择合适的方案线上使用, 刚好看到这篇,分享下 Redis常见的几种主要使用方式: Redis 单副本 Redis 多副本(主从) Redis ...

  4. JAVA面试题系列:如何解决Redis的并发竞争问题

    1 面试题 redis的并发竞争问题是什么?如何解决这个问题?了解Redis事务的CAS方案吗? 2 考点分析 这个也是线上非常常见的一个问题,就是多客户端同时并发写一个key,可能本来应该先到的数据 ...

  5. Redis Primer(1)基于JedisPool的Redis hset并发性能测试 - @钟超 · 技术博客专栏 - 博客频道 - CSDN.NET...

    Redis Primer(1)基于JedisPool的Redis hset并发性能测试 - @钟超 · 技术博客专栏 - 博客频道 - CSDN.NET Redis Primer(1)基于JedisP ...

  6. redis高并发原理_Java中的42行代码中的URL缩短服务— Java(?!)Spring Boot + Redis...

    redis高并发原理 显然,编写URL缩短服务是新的"世界,您好! "在物联网/微服务/时代的世界中. 一切始于在45行Scala中的URL缩短服务-整洁的Scala,以Spray ...

  7. redis抽奖并发_Redis优化高并发下的秒杀性能

    本文内容 使用Redis优化高并发场景下的接口性能 数据库乐观锁 随着双11的临近,各种促销活动开始变得热门起来,比较主流的有秒杀.抢优惠券.拼团等等. 涉及到高并发争抢同一个资源的主要场景有秒杀和抢 ...

  8. 29 Redis 应对并发访问的无锁原子操作

    29 Redis 应对并发访问的无锁原子操作 前言 一.并发访问中需要对什么进行控制? 二.Redis 的两种原子操作方法: 总结 前言 在使用 Redis 时,不可避免地会遇到并发访问的问题,比如说 ...

  9. 解决redis高并发问题的几种思路

    解决redis高并发问题的几种思路 1:布隆过滤器 首先,布隆过滤器能解决绝大部分恶意攻击的请求,比如我们数据库中的id通常都设为自增的,是有一定范围大小的,如果有黑客恶意用数据库中没有的id一直访问 ...

最新文章

  1. Jquery获取选中行的某个数据
  2. 苹果回应 XcodeGhost:暂未发现个人信息受影响
  3. linux 批量替换所有文件中包含的字符串
  4. Py之cupy:cupy的简介、安装、使用方法之详细攻略
  5. 从零开始开发 VS Code 插件之 Translator Helper
  6. Decorator模式
  7. [转载] python 简单示例说明os.walk和os.path.walk的不同
  8. postman连接mysql执行操作
  9. stm32实验报告心得体会_嵌入式第9次实验报告
  10. 数据库切换为mysql中出现的问题:Error loading MySQLdb module.
  11. 波形信号发生器设计 Proteus仿真--输出频率可调的正弦波、三角波、方波
  12. 计算机毕业设计——基于SSM框架的公寓租房管理系统的设计与实现
  13. python3-关于GitHub的最基本操作
  14. WCG2008科隆总决赛 公开票选你想要的游戏
  15. 使用Spring Validation 完成后端数据校验
  16. android设备检测组件,Device Info HW
  17. 计算机属性cmd命令,怎么用命令提示符打开系统属性
  18. oa项目经验描述_项目经验和总结
  19. Spring使用纯注解配置事务管理并实现简单的增删查改以及模拟转账功能
  20. 判断一个点是否在矩形内PtInRegion-解决PtInRect不能正确判断不同形式TRent的情况

热门文章

  1. 用于计算的计算机主机,一种用于区块链计算的计算机主机的制作方法
  2. flash和linux文件系统,面向大容量Flash的高效Linux文件系统改进和实现
  3. db设计专用excel_工程师必备:硬件EMC设计规范
  4. oracle高资源消耗sql,Oracle中定位重要(消耗资源多)的SQL
  5. 手机知识:手机的快充技术是什么,看完本文你就明白了!
  6. 后端技术:MyBatis动态SQL写法介绍
  7. 电脑技巧:键盘上的这几个键,不常用,但有必要了解一下!
  8. 收集实用的MySQL使用技巧
  9. 时下流行的9种恶意软件,你都了解吗?
  10. 【基础】SQL Server系统库的作用