电子商务的网站建设过程上海seo网站排名优化公司

diannao/2026/1/25 5:49:41/文章来源:
电子商务的网站建设过程,上海seo网站排名优化公司,asp保险网站源码,乐陵seo优化信目录 一、 Lua 脚本 1、初始化 Lua 环境 2、脚本的安全性 3、脚本的执行 4、 EVAL 命令的实现 定义 Lua 函数 执行 Lua 函数 5、 EVALSHA 命令的实现 二、 小结 一、 Lua 脚本 Lua 脚本功能是 Reids 2.6 版本的最大亮点#xff0c;通过内嵌对 Lua 环境的支持#xf…目录 一、 Lua 脚本 1、初始化 Lua 环境 2、脚本的安全性 3、脚本的执行 4、 EVAL 命令的实现 定义 Lua 函数 执行 Lua 函数 5、 EVALSHA 命令的实现 二、 小结 一、 Lua 脚本 Lua 脚本功能是 Reids 2.6 版本的最大亮点通过内嵌对 Lua 环境的支持Redis 解决了长久 以来不能高效地处理 CAS (check-and-set)命令的缺点并且可以通过组合使用多个命令轻 松实现以前很难实现或者不能高效实现的模式。 本章先介绍 Lua 环境的初始化步骤然后对 Lua 脚本的安全性问题、以及解决这些问题的方 法进行说明最后对执行 Lua 脚本的两个命令——EVAL 和 EVALSHA 的实现原理进行介绍。 1、初始化 Lua 环境 在初始化 Redis 服务器时对 Lua 环境的初始化也会一并进行。 为了让 Lua 环境符合 Redis 脚本功能的需求Redis 对 Lua 环境进行了一系列的修改包括添 加函数库、更换随机函数、保护全局变量等等。 整个初始化 Lua 环境的步骤如下: 1. 调用 lua_open 函数创建一个新的 Lua 环境。 2. 载入指定的 Lua 函数库包括: 基础库(base lib)。 表格库(table lib)。 字符串库(string lib)。 数学库(math lib)。 调试库(debug lib)。 用于处理 JSON 对象的 cjson 库。 在 Lua 值和 C 结构 (struct) 之间进行转换的 struct 库 (www.inf.puc- rio.br/ roberto/struct/)处理 MessagePack 数据的 cmsgpack 库(github.com/antirez/lua-cmsgpack)。 3. 屏蔽一些可能对 Lua 环境产生安全问题的函数比如 loadfile 。 4. 创建一个 Redis 字典保存 Lua 脚本并在复制(replication)脚本时使用。字典的键为 SHA1 校验和字典的值为 Lua 脚本。 5. 创建一个 redis 全局表格到 Lua 环境表格中包含了各种对 Redis 进行操作的函数包 括: • 用于执行 Redis 命令的 redis.call 和 redis.pcall 函数。 • 用于发送日志(log)的redis.log函数以及相应的日志级别(level): – redis.LOG_DEBUG – redis.LOG_VERBOSE – redis.LOG_NOTICE – redis.LOG_WARNING• 用于计算 SHA1 校验和的 redis.sha1hex 函数。 • 用于返回错误信息的redis.error_reply函数和redis.status_reply函数。 用 Redis 自己定义的随机生成函数替换 math 表原有的 math.random 函数和 math.randomseed 函数新的函数具有这样的性质:每次执行 Lua 脚本时除非显 式地调用 math.randomseed 否则 math.random 生成的伪随机数序列总是相同的。 创建一个对 Redis 多批量回复(multi bulk reply)进行排序的辅助函数。 对 Lua 环境中的全局变量进行保护以免被传入的脚本修改。 因为 Redis 命令必须通过客户端来执行所以需要在服务器状态中创建一个无网络连接 的伪客户端(fake client)专门用于执行 Lua 脚本中包含的 Redis 命令:当 Lua 脚本需 要执行 Redis 命令时它通过伪客户端来向服务器发送命令请求服务器在执行完命令 之后将结果返回给伪客户端而伪客户端又转而将命令结果返回给 Lua 脚本。 将 Lua 环境的指针记录到 Redis 服务器的全局状态中等候 Redis 的调用。 以上就是 Redis 初始化 Lua 环境的整个过程当这些步骤都执行完之后Redis 就可以使用Lua 环境来处理脚本了。 严格来说步骤 1 至 8 才是初始化 Lua 环境的操作而步骤 9 和 10 则是将 Lua 环境关联到服务器的操作为了按顺序观察整个初始化过程我们将两种操作放在了一起。 另外步骤 6 用于创建无副作用的脚本而步骤 7 则用于去除部分 Redis 命令中的不确定性(non deterministic)关于这两点请看下面一节关于脚本安全性的讨论。 2、脚本的安全性 当将 Lua 脚本复制到附属节点或者将 Lua 脚本写入 AOF 文件时Redis 需要解决这样一个 问题:如果一段 Lua 脚本带有随机性质或副作用那么当这段脚本在附属节点运行时或者从 AOF 文件载入重新运行时它得到的结果可能和之前运行的结果完全不同。 考虑以下一段代码其中的 get_random_number() 带有随机性质我们在服务器 SERVER 中 执行这段代码并将随机数的结果保存到键 number 上: # 虚构例子不会真的出现在脚本环境中 redis EVAL return redis.call(set, KEYS[1], get_random_number()) 1 number OK redis GET number 10086 现在假如 EVAL 的代码被复制到了附属节点 SLAVE 因为 get_random_number() 的随机 性质它有很大可能会生成一个和 10086 完全不同的值比如 65535 :  # 虚构例子不会真的出现在脚本环境中 redis EVAL return redis.call(set, KEYS[1], get_random_number()) 1 numberOK redis GET number 65535 可以看到带有随机性的写入脚本产生了一个严重的问题:它破坏了服务器和附属节点数据之 间的一致性。 当从 AOF 文件中载入带有随机性质的写入脚本时也会发生同样的问题。 Note: 只有在带有随机性的脚本进行写入时随机性才是有害的。 如果一个脚本只是执行只读操作那么随机性是无害的。 比如说如果脚本只是单纯地执行 RANDOMKEY 命令那么它是无害的;但如果在执行RANDOMKEY 之后基于 RANDOMKEY 的结果进行写入操作那么这个脚本就是有害的。 和随机性质类似如果一个脚本的执行对任何副作用产生了依赖那么这个脚本每次执行所产 生的结果都可能会不一样。 为了解决这个问题Redis 对 Lua 环境所能执行的脚本做了一个严格的限制——所有脚本都必 须是无副作用的纯函数(pure function)。 为此Redis 对 Lua 环境做了一些列相应的措施: • 不提供访问系统状态状态的库(比如系统时间库)。 • 禁止使用 loadfile 函数。 • 如果脚本在执行带有随机性质的命令(比如 RANDOMKEY )或者带有副作用的命令 (比如 TIME )之后试图执行一个写入命令(比如 SET )那么 Redis 将阻止这个脚本 继续运行并返回一个错误。 • 如果脚本执行了带有随机性质的读命令(比如 SMEMBERS )那么在脚本的输出返回给Redis 之前会先被执行一个自动的字典序排序从而确保输出结果是有序的。 用 Redis 自己定义的随机生成函数替换 Lua 环境中 math 表原有的 math.random 函数 和 math.randomseed 函数新的函数具有这样的性质:每次执行 Lua 脚本时除非显式 地调用 math.randomseed 否则 math.random 生成的伪随机数序列总是相同的。 经过这一系列的调整之后Redis 可以保证被执行的脚本: 1. 无副作用。 2. 没有有害的随机性。 3. 对于同样的输入参数和数据集总是产生相同的写入命令。 3、脚本的执行 在脚本环境的初始化工作完成以后Redis 就可以通过 EVAL 命令或 EVALSHA 命令执行 Lua脚本了。 其中EVAL 直接对输入的脚本代码体(body)进行求值: redis EVAL return hello world 0 hello world 而 EVALSHA 则要求输入某个脚本的 SHA1 校验和这个校验和所对应的脚本必须至少被EVAL 执行过一次: redis EVAL return hello world 0 hello world redis EVALSHA 5332031c6b470dc5a0dd9b4bf2030dea6d65de91 0 // 上一个脚本的校验和 hello world 或者曾经使用 SCRIPT LOAD 载入过这个脚本: redis SCRIPT LOAD return dlrow olleh d569c48906b1f4fca0469ba4eee89149b5148092 redis EVALSHA d569c48906b1f4fca0469ba4eee89149b5148092 0 dlrow olleh 因为 EVALSHA 是基于 EVAL 构建的所以下文先用一节讲解 EVAL 的实现之后再讲解 EVALSHA 的实现。 4、 EVAL 命令的实现 EVAL 命令的执行可以分为以下步骤: 1. 为输入脚本定义一个 Lua 函数。 2. 执行这个 Lua 函数。以下两个小节分别介绍这两个步骤。 定义 Lua 函数 所有被 Redis 执行的 Lua 脚本在 Lua 环境中都会有一个和该脚本相对应的无参数函数:当 调用 EVAL 命令执行脚本时程序第一步要完成的工作就是为传入的脚本创建一个相应的 Lua 函数。 举个例子当执行命令 EVAL return hello world 0 时Lua 会为脚本 return hello world 创建以下函数: 其中函数名以 f_ 为前缀后跟脚本的 SHA1 校验和(一个 40 个字符长的字符串)拼接而 成。而函数体(body)则是用户输入的脚本。 以函数为单位保存 Lua 脚本有以下好处: 执行脚本的步骤非常简单只要调用和脚本相对应的函数即可。 Lua 环境可以保持清洁已有的脚本和新加入的脚本不会互相干扰也可以将重置 Lua 环境和调用 Lua GC 的次数降到最低。 如果某个脚本所对应的函数在 Lua 环境中被定义过至少一次那么只要记得这个脚本的 SHA1 校验和就可以直接执行该脚本——这是实现 EVALSHA 命令的基础稍后在介 绍 EVALSHA 的时候就会说到这一点。 在为脚本创建函数前程序会先用函数名检查 Lua 环境只有在函数定义未存在时程序才创建函数。重复定义函数一般并没有什么副作用这算是一个小优化。 另外如果定义的函数在编译过程中出错(比如脚本的代码语法有错)那么程序向用户返回 一个脚本错误不再执行后面的步骤。 执行 Lua 函数 在定义好 Lua 函数之后程序就可以通过运行这个函数来达到运行输入脚本的目的了。 不过在此之前为了确保脚本的正确和安全执行还需要执行一些设置钩子、传入参数之类 的操作整个执行函数的过程如下: 将 EVAL 命令中输入的 KEYS 参数和 ARGV 参数以全局数组的方式传入到 Lua 环境中。 设置伪客户端的目标数据库为调用者客户端的目标数据库:fake_client-db caller_client-db 确保脚本中执行的 Redis 命令访问的是正确的数据库。 为 Lua 环境装载超时钩子保证在脚本执行出现超时时可以杀死脚本或者停止 Redis 服务器。 执行脚本对应的 Lua 函数。 如果被执行的 Lua 脚本中带有 SELECT 命令那么在脚本执行完毕之后伪客户端 中的数据库可能已经有所改变所以需要对调用者客户端的目标数据库进行更新: caller_client-db fake_client-db 。 执行清理操作:清除钩子;清除指向调用者客户端的指针;等等。 将 Lua 函数执行所得的结果转换成 Redis 回复然后传给调用者客户端。 对 Lua 环境进行一次单步的渐进式 GC 。 以下是执行 EVAL return hello world 0 的过程中调用者客户端(caller)、Redis 服务 器和 Lua 环境之间的数据流表示图: 上面这个图可以作为所有 Lua 脚本的基本执行流程图不过它展示的 Lua 脚本中不带有 Redis 命令调用:当 Lua 脚本里本身有调用 Redis 命令时(执行 redis.call 或者 redis.pcall ) Redis 和 Lua 脚本之间的数据交互会更复杂一些。 举个例子以下是执行命令 EVAL return redis.call(DBSIZE) 0 时调用者客户端 (caller)、伪客户端(fake client)、Redis 服务器和 Lua 环境之间的数据流表示图: 因为 EVAL return redis.call(DBSIZE) 只是简单地调用了一次 DBSIZE 命令所以 Lua 和伪客户端只进行了一趟交互当脚本中的 redis.call 或者 redis.pcall 次数增多时Lua 和伪客户端的交互趟数也会相应地增多不过总体的交互方法和上图展示的一样。 5、 EVALSHA 命令的实现 前面介绍 EVAL 命令的实现时说过每个被执行过的 Lua 脚本在 Lua 环境中都有一个 和它相对应的函数函数的名字由 f_ 前缀加上 40 个字符长的 SHA1 校验和构成:比如 f_5332031c6b470dc5a0dd9b4bf2030dea6d65de91 。 只要脚本所对应的函数曾经在 Lua 里面定义过那么即使用户不知道脚本的内容本身也可以 直接通过脚本的 SHA1 校验和来调用脚本所对应的函数从而达到执行脚本的目的——这就是 EVALSHA 命令的实现原理。 可以用伪代码来描述这一原理: def EVALSHA(sha1):# 拼接出 Lua 函数名字func_name f_ sha1# 查看该函数是否已经在 Lua 中定义if function_defined_in_lua(func_name): # 如果已经定义过的话执行函数return exec_lua_function(func_name) else:# 没有找到和输入 SHA1 值相对应的函数则返回一个脚本未找到错误 return script_error(SCRIPT NOT FOUND) 除了执行 EVAL 命令之外SCRIPT LOAD 命令也可以为脚本在 Lua 环境中创建函数: redis SCRIPT LOAD return hello world 5332031c6b470dc5a0dd9b4bf2030dea6d65de91 redis EVALSHA 5332031c6b470dc5a0dd9b4bf2030dea6d65de91 0 hello world 二、 小结 • 初始化 Lua 脚本环境需要一系列步骤其中最重要的包括: – 创建 Lua 环境。 – 载入 Lua 库比如字符串库、数学库、表格库等等。 – 创建 redis 全局表格包含各种对 Redis 进行操作的函数比如 redis.call 和redis.log 等等。 – 创建一个无网络连接的伪客户端专门用于执行 Lua 脚本中的 Redis 命令。 • Reids 通过一系列措施保证被执行的 Lua 脚本无副作用也没有有害的写随机性:对于 同样的输入参数和数据集总是产生相同的写入命令。 • EVAL 命令为输入脚本定义一个 Lua 函数然后通过执行这个函数来执行脚本。 • EVALSHA 通过构建函数名直接调用 Lua 中已定义的函数从而执行相应的脚本。

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

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

相关文章

宁阳网站建设网站管理员招聘

目录 1、问题描述 2、安卓app发生崩溃,需要查看汇编代码上下文去辅助分析 3、使用IDA打开.so动态库文件,提示Relocations for this machine are not implemented 4、IDA版本较老,不支持ARM64的指令集,使用7.0版本就可以了 5、…

电商网站的设计与实现视频教程软件开发业务流程图

1、view下的 Cmmand Palette 下的Change file Encoding simplifiled chinese GB2312

知名的传媒行业网站开发网页界面设计中常用的中英文字体有哪些

解析卷积神经网络—深度学习实践手册从实用角度着重解析了深度学习中的一类神经网络模型——卷积神经网络,向读者剖析了卷积神经网络的基本部件与工作机理,更重要的是系统性的介绍了深度卷积神经网络在实践应用方面的细节配置与工程经验。笔者希望本书“…

通辽市北京网站建设wordpress做成app

正确而合理的配置IIS是构建一个高性能和高可扩展应用的基础。虽然很多的时候采用默认的配置就已经可以处理一般的情况,但是随着站点应用的发展,特别是当访问量稍微大一点的时候,就会暴露出很多我们认为的“奇奇怪怪”的问题。 所以&#xff0…

做婚宴的网站有哪些网站开发要服务器吗

葡萄酒可以在许多不同的场合成为很好的礼物,因为它可以用来庆祝许多不同的事情。当被邀请去别人家时,你可以带酒去吃饭。葡萄酒可以用来纪念婚礼、出生、毕业和各种纪念日,来自云仓酒庄品牌雷盛红酒分享这是一个非常合适的专业礼物。但是你怎…

泉州做网站企业产品网站开发流程图

服务器端:编辑/etc/ssh/sshd_config中的以下内容 启用AllowTcpForwarding 启用X11Forwarding 将X11DisplayOffset设定为10. 启用X11UseLocalhost 客户机端:编辑/etc/ssh/ssh_config中的以下内容 启用X11Forwarding 连接时ssh -X或者ssh -Y就可以了…

宁波网站优化公司hao123网址之家官网电脑版

由于用到 RFileWriteStream 写入汉字到文件中,之前没有处理过,等写入文件后才发现是乱码。 问了问群里的朋友也没有解决,后来就上网搜,终于找到一个解决方法,就是用 CCnvCharacterSetConverter 类 这个类是用来转换Uni…

苏州建设银行招聘网站手机网站域名解析怎么做

参考: 大数据中台架构以及建设全流程一(Paas层设计) 大数据中台架构以及建设全流程二(Daas层设计)

大创意网站拼多多采用了哪些网络营销方式

由于双链表中大部分操作其实和单链表操作类似,所以这里只挑关键的一些函数 1、定义与初始化 typedef struct DNode {ElementType data;struct DNode *prior,*next; }DNode,*DLinkList;bool InitialDLinkList(DLinkList &L){L (DNode *)malloc(sizeof(DNode));…

用php做购物网站视频单片机编程入门基础知识

匿名函数 简介 匿名函数:为了解决那些功能很简单的需求而设计的一句话函数。 python 使用 lambda 来创建匿名函数。 所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。 1 lambda 只是一个表达式,函数体比 def 简单很多。 2 lambda…

服装移动网站策划案phpcms网站建设

纯手写,如果哪写错了,还希望指正 IP地址192.168.127.101,子网掩码255.255.255.192,计算网络地址,主机号,广播地址和主机最大数 255.255.255.192子网掩码转换成二进制为 11111111.11111111.11111111.11000…

河北网站备案 多长时间通过钓鱼网站怎么做

目录 问题描述输入格式输出格式代码实现 问题描述 小蓝拥有n n大小的棋盘,一开始棋盘上全都是白子。小蓝进行了m.次操作,每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色,黑色棋子变为白色)。请输出所…

远丰做网站怎么样2015网站设计风格

2014-09-25 Created By BaoXinjian 一、摘要 集合是Oracle开发中经常遇到的情况,Oracle集合分为三种情况:索引表集合(index by table)、嵌套表集合(nested table)、可变集合(varry table)。 PL/SQL中没有数组的概念,他的集合数据类型和数组是…

沧州北京网站建设如何在网站后台备份数据库表

前言 关于 Android 车机,之前分析过方控上自定义按键的输入机制和中控上旋钮输入的原理,但都局限于 Car Service 内 Input 相关模块。 一文了解 Android 车机如何处理中控的旋钮输入从实体按键看 Android 车载的自定义事件机制 本文将结合 Android 系…

建湖做网站哪家最好开通网站空间

在C和C中,int main(int argc, char* argv[])语句作为程序的入口,在main函数中常常用到。 argc:argument count,参数的数量。argc是一个整型数,代表传入程序的命令行参数的数量。程序名称是第一个参数,所以…

只做衬衣网站网站推广策划的策略

维护API很难。 我们正在维护非常复杂的jOOQ API。 但是就语义版本而言,我们遵循相对宽松的规则 。 当您阅读Brian Goetz和其他人关于在JDK中保持向后兼容性的评论时,我只能对他们的工作表示敬意。 显然,我们都希望最终移除Vector &#xff…

中国在数码网站注册域名好>软件工程师证书报考网站

C# 中的 Task< T> 是一个非常强大的并发编程工具&#xff0c;它允许我们异步执行操作并返回一个结果。在这篇博客中&#xff0c;我们将详细介绍 Task< T> 的应用&#xff0c;包括它的基本概念、创建方式、等待和取消等操作&#xff0c;以及一些常见的使用场景。 基…

专门做旅游攻略的网站抖音seo公司

npm - 软件包管理器 定义 npm是Node.js标准的软件包管理器 npm仓库中包含大量软件包,使其成为世界上最大的单一语言代码仓,并且可以确定几乎可用于一切的软件包 最初是为了下载和管理Node.js包依赖的方式,但其现在已成为前端JavaScript中使用的工具 使用: 1.初始化清单文…

wordpress在线仿站杭州 做网站

本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测&#xff08;人脸识别&#xff09;。人脸检测可以说是学术界的宠儿&#xff0c;在不少EI&#xff0c;SCI高级别论文都能看到它的身影。甚至很多高校学生的毕业设计都会涉及到人脸检测。当然人脸检测的巨大实用价值也让…

对门户网站建设情况的报告省交通建设质安监督局网站

1.把client目录复制到服务器 .next和node_modules文件夹不用上传到服务器 在服务器目录运行 docker build -t fastgpt:1.0.3 . 构建服务 再运行 docker ps 就可以看到容器了