redis下并发问题解决方案

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宜建立自主可控的车用芯片和操作系统技术体系

万物互联时代,操作系统的边界在不断突破,面向“人机物”融合的泛在计算场景,能够支撑分布式人机物协同应用的操作系统将是产业未来之光。操作系统在经过主机时代、PC互联时代、移动互联时代之后,来到万物互联时代,这恰…

Java 9进入第一轮问题修复阶段

Java 9功能特性正式完成,这意味着第一个问题修复阶段已经开始。HTTP/2客户端没有在截止日期前完成,现已降级为孵化器功能。由于现在的目标是在7月准备好可发布的Java 9,所以目前不太可能添加任何新的JEP。\\InfoQ此前的报道中提到&#xff0c…

django 用户管理(1)

编辑了前端的页面展示,用的bootstrap 用户登录 用户信息 用户编辑 创建用户 修改密码 转载于:https://blog.51cto.com/jacksoner/2133129

qiaoye.php,全自动无限生成关键词页面(黑帽SEO优化终极方法)

如果你是做黑帽SEO的,如果你还停留在用栏目、租域名、劫持等手段来做黑帽SEO优化,我可以肯定的告诉你,你做的再好,也赚不了多少。那么今天咱们要说的就是无限生成关键词页面用内容页来做黑帽SEO优化。这是我在演示的时候做的一个站…

AR Software

... 转载于:https://www.cnblogs.com/2008nmj/p/7264769.html

v1.0.25 新版发布及Smart Meetup重新开启丨SmartIDE

作者:徐磊文章首发地址:https://smartide.cn/zh/blog/2022-0892-sprint25/关于SmartIDESmartIDE是一群开发者为所有开发者开发的开源云原生IDE,我们的使命是“为开发者赋予云原生的超能力”!使用SmartIDE你只需要学会一个简单的指…

线程安全的单例模式

面试的时候,常常会被问到这样一个问题:请您写出一个单例模式(Singleton Pattern)吧。好吧,写就写,这还不容易。顺手写一个: public final class EagerSingleton { private static EagerSi…

vue实现首屏加载等待动画 避免首次加载白屏尴尬

为什么80%的码农都做不了架构师?>>> 0 直接上效果图 1背景,用户体验良好一直是个重要的问题。 2怎么加到自己项目里面? 复制css html代码到自己的index.html即可 代码链接 源码地址 Vue学习前端群493671066,美女多多。…

java-回调机制详解

转:http://blog.csdn.net/llayjun/article/details/50454148 阅读目录 一、前言二、回调的含义和用途三、Java实现接口回调 四、Android中的接口回调五、参考资料一、前言 最近在看android fragment与Activity进行数据传递的部分,看到了接口回调的内容&a…

lfi读取php,php LFI读php文件源码以及直接post webshell

php LFI读php文件源码以及间接post 网站shell假如如下一个场景(1) http://vulnerable/fileincl/example1.php?pageintro.php(该php文件包孕LFI漏洞)(2) 然而你不有中央能够upload你的网站shell代码(三) LFI只能读取到非php文件的源码(由于无…

根据请求上下文动态设置静态文件存储目录

前言上次,我们实现了根据 subpath 特定格式《动态设置静态文件存储目录》。例如:subpath静态文件路径/userAId/1.jpgc:\abc\userAId\1.jpg/userBId/1.jpgd:\xyz\123\userBId\1.jpg但是,如果 subpath 不能有这种特定格式,只能用通用…

BZOJ3019 : [Balkan2012]handsome

首先预处理出$f[i][j][k]$表示长度为$i$的序列,第一个位置是$j$,最后一个位置是$k$时合法的方案数。 从后往前枚举LCP以及那个位置应该改成什么。 用线段树维护区间内最左最右的已经确定的位置,以及区间内的合法方案数。 合并的时候只需要将左…

php smarty入门,smarty 快速入门

smarty 快速入门smarty定义:一个开源的模板引擎模板引擎是为了使用户界面与业务数据分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。功能将网站的数据和网站的界面实现分离(php和html代码)缓存页面下载www.smart…

ImageView的scaleType理解

2019独角兽企业重金招聘Python工程师标准>>> 1.android:scaleType“center” 保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size时,多出来的部分被截掉。 2.android:scaleType“center_inside” 以原图正常显示为目的&…

第一章 引论

1、什么是多道程序设计? 即内存中同时运行多道独立程序,宏观上所有程序同时运行,微观上程序串行,多道程序轮流占用CPU,提高了资源利用率。 2、什么是SPOOLING?读者是否认为将来的高级个人计算机会把SPOOLIN…

《ASP.NET Core 6框架揭秘》实例演示[24]:中间件的多种定义方式

ASP.NET Core的请求处理管道由一个服务器和一组中间件组成&#xff0c;位于 “龙头” 的服务器负责请求的监听、接收、分发和最终的响应&#xff0c;针对请求的处理由后续的中间件来完成。中间件最终体现为一个Func<RequestDelegate, RequestDelegate>委托&#xff0c;但…

Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载

为什么80%的码农都做不了架构师&#xff1f;>>> 随着 Google 推出了全新的设计语言 Material Design&#xff0c;还迎来了新的 Android 支持库 v7&#xff0c;其中就包含了 Material Design 设计语言中关于 Card 卡片概念的实现 —— CardView。RecyclerView也是谷…

php获取邮箱内容吗,php正则验证email邮箱及抽取内容中email的例子

1&#xff0c;php正则验证email格式&#xff1a;复制代码 代码示例:if (ereg(“/^[a-z]([a-z0-9]*[-_\.]?[a-z0-9])*([a-z0-9]*[-_]?[a-z0-9])[\.][a-z]{2,3}([\.][a-z]{2})?$/i; ”,$email)){echo “Your email address is correct!”;}else{echo “Please try again!”;}?…

Java——Arrays类操作数组的工具类

JDK中提供了一个专门用于操作数组的工具类&#xff0c;即 Arrays 类&#xff0c;位于 Java。util 包中。该类提供了一系列方法来操作数组&#xff0c;如排序、复制、比较、填充等&#xff0c;用户直接调用这些方法即可&#xff0c;不需要自己编码实现&#xff0c;降低了开发难度…

PropertiesUtil 获取文件属性值

有时候不要把一些属性值写死在代码中&#xff0c;而是写在配置在文件中&#xff0c;方便更改 PropertiesUtil工具类&#xff1a;读取key-value形式的配置文件&#xff0c;根据key获得value值 1、测试类 public class Test{private static PropertiesUtil propertiesUtil new …