当前位置: 首页 > news >正文

网站横幅背景图片源码网站排行

网站横幅背景图片,源码网站排行,oss怎么做网站,app开发公司怎么收费概述 使用 Redis 时#xff0c;不可避免地会遇到并发访问的问题#xff0c;比如说如果多个用户同时下单#xff0c;就会对缓存在 Redis 中的商品库存并发更新。一旦有了并发写操作#xff0c;数据就会被修改#xff0c;如果我们没有对并发写请求做好控制#xff0c;就可…概述 使用 Redis 时不可避免地会遇到并发访问的问题比如说如果多个用户同时下单就会对缓存在 Redis 中的商品库存并发更新。一旦有了并发写操作数据就会被修改如果我们没有对并发写请求做好控制就可能导致数据被改错影响业务的正常使用例如库存数据错误导致下单异常。 为了保证并发访问的正确性Redis 提供了两种方法分别是加锁和原子操作。当一个客户端获得锁后就会一直持有这把锁直到客户端完成数据更新才释放这把锁。 但是用锁会有两个问题 一个是如果加锁操作多会降低系统的并发访问性能。第二个是Redis 客户端需要加锁时需要用到分布式锁而分布式锁实现复杂需要用额外的存储系统来提供枷锁解锁操作。 原子操作是另一种提供并发访问控制的方法。原子操作是指执行过程保持原子性的操作而且原子操作执行时并不需要加锁实现了无锁操作。这样一来既能保证并发控制还能减少对系统并发性能的影响。 1.并发访问中需要对什么进行控制 并发访问控制是指对多个客户端访问操作同一份数据的过程进行控制以保证任何一个客户端发送的操作在 Redis 实例上执行具有互斥性。 并发访问控制对应的操作主要是数据修改操作。当客户端需要修改数据时基本流程分成两步 客户端先把数据读取到本地在本地进行修改客户端修改完数据后再写回 Redis。 这个流程叫做“读取 - 修改 - 写回”操作Read-Modify-Write简称为 RMW 操作。当有多个客户端对同一份数据执行 RMW 操作的话我们就需要让 RMW 操作 涉及的代码以原子性方式执行。访问同一份数据的 RMW 操作 的代码就叫做临界区代码。 不过当有多个客户端并发执行临界区代码时就会存在一些潜在问题。例如客户端要对商品库存执行扣减 1 的操作伪代码如下 current GET(id) current-- SET(id, current)可以看到客户先根据商品 id从 Redis 中读取商品当前的库存值 current对应 Read然后客户端对库存值减 1对应 Modify再把库存值写回 Redis 对应 Write 如果我们对临界区代码的执行没有控制机制就会出现数据更新错误。在刚才的例子中假设现在有两个客户端 A 和 B同时执行刚才的临界区代码就会出现错误。 在客户端 A 在 t1 时读取库存值 10 并扣减 1在 t2 时客户端 A 还没有把扣减值后的库存值 9 写回 Redis。此时客户端 B 读取到库存值 10也扣减了 1 B 记录的库存值也为 9 了。等到 T3 时刻 A 往 Redis 写回了库存值 9。T4 时刻B 也写回了库存值 9。 如果按正确的逻辑处理客户端 A 和 B 对库存值各做了一次扣减库存值应该为 8.所以这里的库存值明显更新错了。 出现这个现象的原因是临界区代码中的客户端读取、更新、再写回涉及了三个操作而这三个操作执行时并不具有互斥性多个客户端基于相同的初始值进行修改而不是基于前一个客户端修改后的值再修改。 前面我们已经解释过虽然加锁保证了互斥性但是加锁也会导致系统并发性能降低。接下来我们了解下 Redis 中的原子操作。 2.Redis 的两种原子操作方法 Redis 的原子操作采用了两种方法 把多操作在 Redis 中实现成一个操作也就是单命令操作。把多个操作写到 Lua 脚本中以原子性方式执行单个脚本。 单命令操作 Redis 使用单线程来串行处理客户端的请求命令所以当 Redis 执行某个命令操作时其他命令是无法执行的这相当于命令操作是互斥执行的。 当然Redis 的快照生成、AOF 重写这些操作可以使用后台线程或子进程执行也就是和主线程的操作并行执行。不过他们都是只读操作不会修改数据所以不需要对它们进行并发控制。 虽然 Redis 的单个命令可以原子性地执行但是在实际应用中数据修改时可能包含多个操作至少包括读数据、数据增减、写回数据三个操作这显然不是单个命令。 Redis 提供了 INCR/DECR 命令把这三个操作变为一个原子操作了。INCR/DECR 命令可以对数据进行增值 / 减值操作而它们本身就是单个命令操作Redis 在执行它们时本身就具有互斥性。 比如说在刚才的库存扣减例子中客户端可以使用下面的代码也不用担心出现库存值扣减错误的问题。 DECR id所以如果我们执行的 RMW 操作对数据增减值的话 Redis 提供的原子操作 INCR 和 DECR 可以直接绑我们进行并发控制。 Lua 脚本 如果我们要执行的操作不是简单地增减数据而是有更新复杂的判断逻辑或者其他操作那么 Redis 的单命令操作已经无法保证多个操作的互斥执行了。这个时候就需要用到 Lua 脚本。 Redis 会把整个 Lua 脚本 作为一个整体执行在执行过程中不会被其他命令打断从而保证了 Lua 脚本 中操作的原子性。如果我们有多个操作要执行但是又无法使用 INCR/DECR 这种命令操作来实现就可以把这些要执行的命令编写到一个 Lua 脚本 中。然后我们可以使用 Redis 的 EVAL 命令来执行脚本。这样一来这些操作在执行的时就具有了互斥性。 我们可以把 访问次数加 1、判断访问次数是否为 1以及设置过期时间这三个操作写入一个 Lua 脚本如下所示 local current current redis.call(incr, KEYS[1]) if tonumber(current) 1 thenredis.call(expire, KEYS[1], 60) end return current假设编写的脚本的名称为 lua.script我们就接着使用 Redis 客户端带上 eval 选项来执行该脚本。脚本所需要的参数通过以下命令中的 key 和 arg 进行传递。 redis-cli --eval lua.script [key key2 ...] , [arg arg2 ...]另外还可以在 Redis 客户端内执行脚本eval lua.script key-num [key key2 ...] [arg arg2 ...] [key key2 ...] 表示在脚本中所用到的那些 Redis 键(key)这些键名参数可以在 Lua 中通过全局变量 KEYS 数组用 1 为基址的形式访问( KEYS[1] KEYS[2] 以此类推)。[arg arg2 ...] 附加参数在 Lua 中通过全局变量 ARGV 数组访问访问的形式和 KEYS 变量类似( ARGV[1] 、 ARGV[2] 诸如此类)。 例如上面的 Lua 脚本的实际执行如下其中 KEYS[1] 为 lua1 chenjianDESKTOP-Q24SEP3:~$ vim lua.script chenjianDESKTOP-Q24SEP3:~$ ./redis-6.2.12/src/redis-cli --eval lua.script lua1 , (integer) 1 chenjianDESKTOP-Q24SEP3:~$ ./redis-6.2.12/src/redis-cli --eval lua.script lua1 , (integer) 2这样一来访问次数加 1、判断访问次数是否为 1以及设置过期时间这三个操作就可以原子性的执行了。即使客户端有多个线程同时执行这个脚本Redis 也会依次串行的执行脚本代码避免并发操作带来的数据错误。 不过需要注意的是如果把很多操作都放在 Lua 脚本中原子执行会导致 Redis 执行脚本的时间增加同样也会降低 Redis 。所以给你一个小建议在编写 Lua 脚本时你要避免把不需要做并发控制的操作写入 Lua 脚本中。
http://www.zqtcl.cn/news/649529/

相关文章:

  • 社交网站的优点和缺点个人网页制作软件
  • 做一家算命的网站有没有专门做淘宝客的网站
  • 网站站点管理在哪里建筑施工图设计
  • 众筹网站开发周期网页云原神
  • 哪些网站可以免费做h5东莞制作企业网站
  • 帝国cms 网站地址设置深圳住房和建设部网站
  • 专业网站建设价格最优网页游戏大全电脑版在线玩
  • 建设租车网站wordpress+js插件开发
  • 定制网站开发与模板商务酒店设计网站建设
  • php 网站部署后乱码wordpress禁止调用头部
  • 网站权重低营销型企业网站建站
  • 大港油田建设网站长春市网站优化公司
  • 嘉峪关市建设局建管科资质网站室内设计入门教程
  • 久久建筑网会员登陆中心百度的搜索引擎优化
  • 做网站好还是做程序员好wordpress new图标
  • 秀洲住房与建设局网站徐州建设工程招投标官方网站
  • 做公司网站要注意哪些问题做章的网站
  • 南京建设网站维护洛阳最新通告今天
  • 网站名称创意大全wordpress公开课插件
  • 淮安市城市建设档案馆网站可以做网页的软件
  • 网站空间服务器wordpress 排除置顶文章
  • 有域名后怎么做网站邯郸做移动网站的地方
  • 商标可以做网站吗网站开发的大学生应届简历
  • 长沙长沙网站建设公司saas系统架构
  • 成都销售型网站长春财经学院多大
  • 手机自己制作表白网站app项目网络计划图怎么画
  • 品牌网站如何做seo浏览器正能量网址
  • 开封做网站哪家好网页设计制作网站大一素材
  • 河南网站域名备案莱芜新闻电视台节目表
  • 长春网站建设新格做天猫还是做网站推广