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

网站开发广告宣传品牌策划方案

网站开发广告宣传,品牌策划方案,公司网站变更域名,wordpress enfold主题一、Redis原子性是什么? (1)单个命令的原子性 原子性是指一组操作,要么全部执行成功,要么全部失败。Redis 中的单个命令是天然原子性的,因为 Redis 的命令执行采用单线程模型,同一时间只会执行…

一、Redis原子性是什么?

(1)单个命令的原子性

原子性是指一组操作,要么全部执行成功,要么全部失败。Redis 中的单个命令是天然原子性的,因为 Redis 的命令执行采用单线程模型,同一时间只会执行一个命令,不会出现并发修改数据的情况

(2)Redis 多线程处理请求的流程

假如现在有多个客户端给 Redis 发送请求,Redis 从 6.0 版本开始引入多线程,多线程仅用于处理网络 I/O 操作。多个 I/O 线程会并行地接收并解析这些请求,将其解析成命令,每个命令会被标记所属的客户端。然后,I/O 线程将这些命令放入全局队列中。之后,Redis 的主线程(单线程)会从全局队列中依次取出命令并执行,保证了每个命令执行的原子性。当一个命令执行完毕,执行结果会被存放在对应的客户端结果缓冲区,I/O 线程再将结果从缓冲区取出并响应给客户端。需要注意的是,单个命令具有原子性,但多个命令默认情况下可能会被其他客户端的命令交错执行,若要保证多个命令的原子性,可以使用 Redis 的事务(MULTI、EXEC等命令)或 Lua 脚本

二、如何保证多个操作的原子性?

假设你要实现一个原子性的操作:检查键 counter 是否存在,若存在就将其值加 1,若不存在则将其初始化为 1

(1)Lua脚本

  1. Lua 脚本代码示例
    -- 获取键 "counter" 的值
    local value = redis.call('GET', 'counter')
    if value then-- 如果键存在,将其值加 1return redis.call('INCR', 'counter')
    else-- 如果键不存在,将其初始化为 1redis.call('SET', 'counter', 1)return 1
    end
  2. 在 Redis 中执行 Lua 脚本
    127.0.0.1:6379> EVAL "local value = redis.call('GET', 'counter') if value then return redis.call('INCR', 'counter') else redis.call('SET', 'counter', 1) return 1 end" 0
    (integer) 1
  3. 解释
    1. 这里的 EVAL 命令用于执行 Lua 脚本
    2. 第一个参数是 Lua 脚本的内容
    3. 0 表示脚本中不涉及键名参数

(2)事务

  1. 事务执行步骤
    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> GET counter
    QUEUED
    127.0.0.1:6379> INCR counter
    QUEUED
    127.0.0.1:6379> EXEC
    1) (nil)
    2) (integer) 1
  2. 解释
    1. MULTI:开启一个事务
    2. GET counter 和 INCR counter:这两个命令会被放入事务队列中,并不会立即执行,Redis 会返回 QUEUED 表示命令已入队
    3. EXEC:执行事务队列中的所有命令。在这个例子中,首先尝试获取 counter 的值,因为初始时 counter 不存在,所以返回 (nil),接着对 counter 进行自增操作,使其值变为 1

三、Lua脚本 vs 事务

(1)传输与执行流程及效率对比

  1. Lua 脚本:客户端会一次性把 Lua 脚本发送给 Redis 服务器。对于 Redis 而言,它会将这个 Lua 脚本当作一个完整的原子操作来执行,在脚本执行期间不会去处理其他客户端的命令请求,如同执行一条单一命令。由于只需一次网络传输,减少了网络往返的开销,所以在传输效率上通常更有优势
  2. 事务:当客户端输入 MULTI 命令并发送给服务器,在 Redis 开启多线程的情况下,I/O 线程负责接收和解析该请求。MULTI 命令不会进入全局命令队列,而是标志着客户端事务的开启。后续客户端发送的除 EXEC、DISCARD、UNWATCH 之外的命令,都会被暂存到该客户端对应的事务队列中。直到客户端发送 EXEC 命令,此时客户端的 Socket 会被 epoll 监测到有可读事件,Redis 的主线程(单线程)会从该客户端的事务队列里依次取出命令并执行。并且会将事务队列中的所有命令执行完毕后,才会去处理其他客户端的命令。不过,事务需要多次网络传输(每次发送一个命令),相比 Lua 脚本的单次传输,网络开销更大,在数据量较大或者网络延迟较高的场景下,Lua 脚本的效率优势会更明显

(2)错误处理机制

  1. Lua 脚本:Lua 脚本在执行时,Redis 会以单线程原子性地执行整个脚本。一旦脚本里的某个 Redis 命令执行出错,脚本会立即停止执行,并且马上向客户端返回错误信息,后续的命令不会再被执行,保证了脚本操作的原子性
  2. 事务
    1. 入队错误:如果在命令入事务队列时就被检测出错误(例如命令格式错误、使用了不存在的命令等),Redis 会马上向客户端返回错误信息,整个事务不会被执行,事务队列中的所有命令都会被丢弃
    2. 执行错误:在 Redis 2.6.5 及之后的版本中,如果事务里的某个命令在执行阶段出错(例如对非数值类型的键执行 INCR 操作),Redis 会继续执行事务中剩余的命令,直至事务结束。最终返回给客户端的结果数组里,执行出错的命令对应的结果会显示错误信息,这意味着事务中的部分操作可能会生

四、事务中的watch命令

  1. 在 Redis 中,WATCH 命令的工作机制如下:当客户端 B 在使用 MULTI 开启一个事务之前,使用 WATCH 命令监控了它要在事务中操作的键。此后,客户端 B 可以将一系列命令通过 MULTI 命令加入事务队列,直到发送 EXEC 命令
  2. 当客户端 B 发送 EXEC 指令后,该指令入队,Redis 在准备执行事务队列中的命令之前,会检查被 WATCH 命令监控的键是否被修改过。在客户端 B 发送 EXEC 命令到 Redis 单线程开始执行这个事务中的命令期间,如果客户端 A 等其他客户端对其中被监控的键进行了修改,那么 Redis 会让客户端 B 的事务执行失败,EXEC 命令会返回 (nil),并且清空客户端 B 的事务队列,不会执行事务队列中的任何指令
http://www.dtcms.com/wzjs/428189.html

相关文章:

  • java做视频网站百度云怎么找资源
  • 乐器产品主要在什么网站做推广临沂网站建设优化
  • 三亚市城乡建设局网站关键词权重
  • 众意网站建设zyecnseo下拉优化
  • 做公司子网站的请示报告百度百度地图
  • 爱星光(istar)高端网站建设网络推广网址
  • 提供秦皇岛网站建设seo外包公司兴田德润官方地址
  • 峨眉住房和城乡建设委员会网站获客渠道有哪些
  • 网站开发和网站维护有区别吗武汉网站维护公司
  • 如何用文档创建一个网站个人网络销售平台
  • 什么网站的易用性百度技术培训中心
  • 前端接单平台seo网络贸易网站推广
  • 顺的网络做网站好不好北京谷歌优化
  • 百度网盟推广步骤谷歌seo是什么职业
  • 福州城乡建设委员会网站在线生成网页网站
  • 大学做网站seo全网推广营销软件
  • 金山区网站制作品牌营销策略包括哪些内容
  • 滨海做网站公司湛江百度网站快速排名
  • phpcms如何发布网站百度推广开户渠道公司
  • 电商运营怎么学seo和sem哪个工资高
  • 西安网站建设工程无安全警告的浏览器
  • 阿里云怎么做静态网站平台怎么推广技巧
  • 布吉附近公司做网站建设多少钱磁力蜘蛛搜索引擎
  • 网站建设设置分享功能内部优化
  • 建筑施工特种证书查询入口官网免费推广seo
  • 山西人工智能建站系统软件搜狗网址大全
  • 网站建设宣传海报百度竞价推广投放
  • 零下一度网站建设黑帽seo寄生虫
  • 网站建设与维护的案例seo整站优化
  • 济南建设网站哪里好学企业管理培训班