精华内容
下载资源
问答
  • 一把钥匙开一把锁①一把钥匙开一把锁,这是人人皆知的生活常识。当你拿错钥匙开不开锁的时候,就甭提有着急了。但是钥匙和锁配不上,再着急也没用。②在人体内部所进行的各种生物化学反应,也像一把把锁一样,需要...

    一把钥匙开一把锁

    ①一把钥匙开一把锁,这是人人皆知的生活常识。当你拿错钥匙开不开锁的时候,就甭提有多着急了。但是钥匙和锁配不上,再着急也没用。

    ②在人体内部所进行的各种生物化学反应,也像一把把锁一样,需要有一把把相应的钥匙来打开。不然的话,反应就无法进行,生命活动也就停止了。那么,到哪里去找钥匙呢?这一把把“钥匙”就是酶!也就是说,一种酶一般只对一种生物化学反应起作用。科学上把酶的这种“一把钥匙开一把锁”的特性叫做专一性。例如淀粉酶只对淀粉起作用,使淀粉很快地分解成麦芽糖;脂肪酶只对脂肪起作用,使脂肪分解成为甘油和脂肪酸。蛋白质有很多种,相应的蛋白酶也就有很多种。例如,人胃肠中的蛋白酶能加速食物中的蛋白质分解成为氨基酸,而寄生在肠道中的蛔虫也含蛋白质,胃肠里的蛋白酶对蛔虫就丝毫不起作用,这就是锁和钥匙不配对。如果让蛔虫遇到从木瓜树果实中提炼出来的木瓜蛋白酶,蛔虫体内的蛋白质会被它分解得支离破碎,这就是锁和钥匙配对了。

    ③说来也有趣,每一种酶的表面都有自己特殊的形状,这些形状与它们所催化的物质的形状恰好咬合,就像锁和钥匙配对一样,参加化学变化的物质和酶一经配好对,钥匙插入锁孔,一扭动,“咔嚓”一声,生命之锁就打开了!

    ④人体中有多少种“锁”,需要配多少种“钥匙”,细胞核中蛋白质制造厂的总工程师早已胸有成竹。当需要某种钥匙的时候。总工程师就下达密码指令,细胞质就按指令生产。

    ⑤其实,酶在反应中只是催促反应的快速进行,自身并不消耗掉。这样是不是每种酶只生产一次就够用了呢?不是的。就像钥匙有时会丢失或折断一样,酶也会受到破坏。不过,这不要紧,蛋白质制造厂会随时生产出新的酶来补充的。

    (6)我们完全可以这么说:没有酶,就没有生命。

    (1)本文最主要说明的内容是 B

    A、生命活动离不开酶。

    B、一种酶一般只对一种生物化学反应起作用。

    C、酶是生物化学反应中的“钥匙”。

    D、蛋白质制造厂能随时生产新的酶。

    (2)第(2)段主要运用了 举例子 说明方法,其作用是 具体说明了酶具有专一性的特点

    (3)第(2)段中“一种酶一般只对一种生物化学反应起作用。”中的“一般”是否可以去掉?为什么?

    (4)根据文中提供的信息,完成有关酶的科学知识卡片。

    分类:生物

    内容:酶

    编号(016)

    特 性: 专一性

    形状特征: 与它们所催化的物质的形状恰好咬合

    作 用: 催化作用

    答案:

    (1) B

    (2)举例子具体说明了酶具有专一性的特点.(或一种酶一般只对一种生物化学反应起作用的特点.)

    (3)不能.在正常情况下,一种酶只对一种生物化学反应起作用;不排除有的酶在特殊情况下对多种生物化学反应起作用,说明了说明文语言的准确性.

    (4) 特性:专一性(或“一种酶一般只对一种生物化学反应起作用“).

    形状特征:与它们所催化的物质的形状恰好咬合.

    作用:催化作用( 催促反应的快速进行).

    【一把钥匙开一把锁阅读附答案】相关文章:

    0d3467279ea0a00fb701680306da4176.png

    4263cd3e9fc1a714acfc32c3f6973b48.png

    《一把钥匙开一把锁阅读附答案》

    将Word文档下载到电脑上,方便打印和查看本文

    推荐度:

    557693d14a41177dc8021eac81e57c1b.png

    557693d14a41177dc8021eac81e57c1b.png

    557693d14a41177dc8021eac81e57c1b.png

    557693d14a41177dc8021eac81e57c1b.png

    557693d14a41177dc8021eac81e57c1b.png

    2a05585d6b89e753a2333dfe609d7876.png

    点击下载文档

    文档为doc格式

    展开全文
  • 《一把钥匙开一把锁》的阅读答案一把钥匙开一把锁,这是人人皆知的生活常识。当你拿错钥匙开不开锁的时候,就甭提有着急了。但是钥匙和锁配不上,再着急也没用。在人体内部所进行的各种生物化学反应,也像一把把锁...

    《一把钥匙开一把锁》的阅读答案

    一把钥匙开一把锁,这是人人皆知的生活常识。当你拿错钥匙开不开锁的时候,就甭提有多着急了。但是钥匙和锁配不上,再着急也没用。

    800d7913c35c2d0dcaa450eb342cf5dd.png

    在人体内部所进行的各种生物化学反应,也像一把把锁一样,需要有一把把相应的钥匙来打开。不然的话,反应就无法进行,生命活动也停止了。那么,到哪里去找钥匙呢?这一把把“钥匙”就是酶!也就是说,一种酶一般只对一种生物化学反应起作用。科学上把酶的这种“一把钥匙开一把锁”的特性叫做专一性。例如淀粉酶只对淀粉起作用,使淀粉很快地分解成麦牙糖;脂肪酶只对脂肪起作用,使脂肪分解成为甘油和脂肪酸。蛋白质有很多种,相应的蛋白酶也就有很多种。例如,人胃肠中的蛋白酶能加速食物中的蛋白质分解成为氨基酸,而寄生在肠道中的蛔虫也含蛋白质,胃肠里的蛋白酶对蛔虫就丝毫不起作用,这就是锁和钥匙不配对。如果让蛔虫遇到从木瓜树果实中提炼出来的木瓜蛋白酶,蛔虫体内的蛋白质会被它分解得支离破碎,这就是锁和钥匙配对了。

    说来也有趣,每一种酶的表面都有自己特殊的形状,这些形状与它们所催化的物质的形状恰好咬合,就像锁和钥匙配对一样,参加化学变化的物质和酶一经配好对,钥匙插入锁孔,一扭动,“咔嚓”一声,生命之锁就打开了!

    人体中有多少种“锁”,需要配多少种“钥匙”,细胞核中蛋白质制造厂的总工程师早已胸有成竹。当需要某种钥匙的时候,总工程师就下达密码指令,细胞质就按指令生产。

    其实,酶在反应中只是催促反应的快速进行,自身并不消耗掉。这样是不是每种酶只生产一次就够用了呢?不是的。就像钥匙有时会丢失或折断一样,酶也会受到破坏。不过,这不要紧,蛋白质制造厂会随时生产出新的酶来补充的.。

    我们完全可以这么说:没有酶,就没有生命。

    1.本文所阐释的主要事理是()(3分)

    A、生命活动离不开酶

    B、一种酶一般只对一种生物化学反应起作用

    C、酶是生物化学反应中的“钥匙”

    D、蛋白质制造厂能随时生产新的酶

    2.下面句中的加点词不能去掉,结合科技作品语言的特点,作具体分析。(3分)

    一种酶一般只对一种生物化学反应起作用。

    3.根据文中提供的信息,完成有关酶的科学知识卡片。(5分)

    分类:生物内容:酶编号(3)

    特性:

    形状特征:

    作用:

    4.人体汗液分泌出的蛋白质,浸渍到衣服上很难清洗,因此市场上出现了加酶洗衣粉。请综合文中知识,用简洁准确的语言解释加酶洗衣粉的洗衣原理。(3分)

    答案:

    1、B

    2、正常情况下,一种酶只对一种生物化学反应起作用;不排除有的酶在特殊情况下对多种生物化学反应起作用,因此,加上“一般”能体现语言的准确性。

    3、专一性(或“一种酶一般只对一种生物化学反应起作用”)、与它们所催化的物质的形状恰好咬合、催化作用(催促反应的快速进行)

    4、因为洗衣粉中的酶能加速汗液中蛋白质的分解,因此,衣服就洗得干净。(语言不简洁、准确酌情扣分)

    【《一把钥匙开一把锁》的阅读答案】相关文章:

    展开全文
  • 设有个名为GZ.DBF的表文件,包含以下字段:姓名(C,8)、职务(C,10)、工资(N,6,2)、出生日期(D,8)和正式工(L,l)。阅读以下程序:USE GZDO WHILE.NOT.EOF____IF 职务=“工程师”.AND.出生日期>{10/20/60}D=...

    设有一个名为GZ.DBF的表文件,包含以下字段:姓名(C,8)、职务(C,10)、工资(N,6,2)、出生日期(D,8)和正式工(L,l)。阅读以下程序:USE GZDO WHILE.NOT.EOF____IF 职务=“工程师”.AND.出生日期>{10/20/60}D=出生日期NAME=姓名SALARY=工资EXITENDIFSKIPENDDOY=YEAR(DATE____)-YEAR(D)

    A、显示一位1960年10月20日后出生的工程师姓名,年龄及工资

    B、显示一位1960年10月20日后出生的工程师姓名,年龄

    C、显示1960年10月20日后出生的工程师姓名,年龄及工资

    D、显示所有1960年10月20日后出生的工程师姓名,年龄及工资

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    下列哪一项不是DBMS的组成部分?()

    A、DDL及其翻译处理程序

    B、DML及其编译、解释程序

    C、数据库运行控制程序

    D、宿主语言及其编译、处理程序

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    在命令窗口中执行____命令,可以打开默认文件夹下的“学生成绩”项目。

    A、CREATE PROJECT 学生成绩

    B、MODIFY PROJECT 学生成绩

    C、OPEN PROJECT 学生成绩

    D、双击“学生成绩.PRG”文件名

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    触发器是一种特殊的()。

    A、索引

    B、视图

    C、基本表

    D、存储过程

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    下列四项中说法不正确的是()。

    A、数据库减少了数据冗余

    B、数据库中的数据可以共享

    C、数据库避免了一切数据的重复

    D、数据库具有较高的数据独立性

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    数据库系统中除了可用层次模型和关系模型表示实体类型及实体间联系的数据模型以外,还有()。

    A、E-R模型

    B、信息模型

    C、网络模型

    D、物理模型

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    对视图的查询,最终要转化为对()的查询。

    A、索引

    B、元组

    C、基本表

    D、数据库

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    在关系数据模型中,通常可以把字段称为属性,而把____称为关系模式。

    A、记录

    B、记录类型

    C、元组

    D、元组集

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    ()是对用户所用到的那部分数据的描述。

    A、模式

    B、外模式

    C、内模式

    D、关系模式

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    SKIP-2的执行行为是____。

    A、当前记录向文件尾移动2个记录

    B、当前记录向文件头移动2个记录

    C、不作任何移动

    D、当前记录从文件尾后退2个记录

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    假定有关系学生(学号、姓名、年龄、班级号),课程(课程号、课称名、学分),考试(学号、课程号、成绩),查询20岁的学生的学号、姓名和年龄。使用()关系。

    A、学生

    B、课程

    C、考试

    D、学生和课程

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    数据库管理系统中用于定义和描述数据库逻辑结构的语言称为____。

    A、数据库模式描述语言

    B、数据库子语言

    C、数据操纵语言

    D、数据结构语言

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    下面关于命令DO FORM. XX NAME YY LINKED的陈述中,正确的是()。

    A、产生表单对象引用变量XX,在释放变量XX时自动关闭表单

    B、产生表单对象引用变量XX,在释放变量XX时并不关闭表单

    C、产生表单对象引用变量YY,在释放变量YY时自动关闭表单

    D、产生表单对象引用变量YY,在释放变量YY时并不关闭表单

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    表单名为myForm的表单中有一个页框myPageFrame,将该页框的第3页(Page3)的标题设置为“修改”,可以使用代码()。

    A、myForm.Page3.myPageFrame.Caption="修改"

    B、myForm.myPageFrame.Caption.Page3="修改"

    C、Thisform.myPageFrame.Page3.Caption="修改"

    D、Thisform.myPageFrame.Caption.Page3="修改"

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    设关系R=(A,B,C),与SQL语句select distinct A from R where B=17等价的关系代数表达式是()。

    A、πA(σB=17(R))

    B、σB=17(πA(R))

    C、σB=17(πA,C(R))

    D、πA,C(σB=17(R))

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    对关系模式进行分解的目的是使模式更加()。

    A、规范化

    B、结构化

    C、标准化

    D、简单化

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    ()是对数据库中全体数据的逻辑结构和特征的描述。

    A、模式

    B、子模式

    C、外模式

    D、内模式

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    在数据库系统中,通常用三级模式来描述数据库,____描述了数据的物理结构

    A、外模式

    B、概念模式

    C、内模式

    D、逻辑结构

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    按钮的Name属性用于____。

    A、作为按钮上的文字

    B、按钮对象的引用名

    C、按钮的属性名

    D、以上都不是

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    数据的管理方法主要有____。

    A、批处理和文件系统

    B、文件系统和分布式系统

    C、分布式系统和批处理

    D、数据库系统和文件系统

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    设有一个关系:DEPT(DNO,DNAME),如果要找出倒数第三个字母为W,并且至少包含4个字母的DNAME,则查询条件子句应写成WHERE DNAME LIKE()。

    A、‘_ _ W _ %’

    B、‘_ % W _ _’

    C、‘_ W _ _’

    D、‘_ W _ %’

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    若事务T对数据R已加X锁,则其他对数据R____。

    A、可以加S锁不能加X锁

    B、不能加S锁可以加X锁

    C、可以加S锁也可以加X锁

    D、不能加任何锁

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    SQL中使用()语句创建索引。

    A、CREATE PROC

    B、CREATE VIEW

    C、CREATE TABLE

    D、CREATE INDEX

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    执行at(“fp”,“VFP计算机”)的结果是____。

    A、0

    B、2

    C、.T.

    D、.F.

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    数据库的基本特点是____。

    A、(1)数据可以共享(或数据结构化)(2)数据独立性(3)数据冗余大,易移植(4)统一管理和控制

    B、(1)数据可以共享(或数据结构化)(2)数据独立性(3)数据冗余小,易扩充(4)统一管理和控制

    C、(1)数据可以共享(或数据结构化)(2)数据互换性(3)数据冗余小,易扩充(4)统一管理和控制

    D、(1)数据非结构化(2)数据独立性(3)数据冗余小,易扩充(4)统一管理和控制

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    在数据库技术中,反映现实世界中事物的存在方式和运动状态的是()。

    A、信息

    B、数据

    C、消息

    D、命令

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    E-R模型中的一个联系(非ISA联系)转换为一个关系模式。如果联系是1:1的,则与该联系相连的各()的键均可作为关系模式的键。

    A、属性集

    B、实体集

    C、联系集

    D、规则集

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    数据库系统的核心是____。

    A、编译系统

    B、数据库

    C、操作系统

    D、数据库管理系统

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    对并发操作若不加以控制,可能会带来____问题。

    A、不安全

    B、死锁

    C、死机

    D、不一致

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    ()是用来设置与SQL Server2000连接的网络配置。

    A、企业管理器

    B、事件探测器

    C、查询分析器

    D、客户端网络实用工具

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    在Visual FoxPro中,以下关于查询的描述正确的是()。

    A、不能用自由表建立查询

    B、只能使用自由表建立查询

    C、不能用数据库表建立查询

    D、可以用数据库表和自由表建立查询

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    执行下列命令:HZ=“中华人民共和国”?SUBSTR(HZ,LEN(HZ)/2-2,4)输出的结果是____。

    A、中华

    B、人民

    C、共和

    D、和国

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    如果运行一个表单,以下事件首先被触发的是()。

    A、Load

    B、Error

    C、Init

    D、Click

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    有数据库A、B、C,已建立了A→B的关联,欲再建立B→C的关联,以构成A→B→C的关联____。

    A、必须使用带ADDITIVE子句的SET RELATION命令

    B、使用不带ADDITIVE子句的SET RELATION命令即可

    C、在保持A→B关联的基础上不能再建立B→C的关联

    D、在保持A→B关联的基础上不能再建立B→C的关联,但可以建立A→C的关联

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    设关系R和S的属性个数为r和s,则(R×S)操作结果的属性个数为()。

    A、r+s

    B、r-s

    C、r*s

    D、max(r,s)

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    ()结构中至少有一个结点有多于一个的父结点。

    A、层次模型

    B、网络模型

    C、关系模型

    D、面向对象模型

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    在数据库中,产生数据不一致的根本原因是____。

    A、没有严格保护数据

    B、数据存储量太大

    C、未对数据进行完整性控制

    D、数据冗余

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    数据库(DB)、数据库系统(DBS)和数据库管理系统(DBMS)三者之间的关系是____。

    A、DBS包括DB和DBMS

    B、DBMS包括DB和DBS

    C、DB包括DBS和DBMS

    D、DBS就是DB,也就是DBMS

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    在FoxPro系统状态下,有下列命令序列:Z=“X*Y”X=5Y=10?&Z执行后,输出结果是____。

    A、50

    B、X*Y

    C、Z

    D、5*10

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    为了防止一个用户的工作不适当地影响另一个用户,应该采取()。

    A、完整性控制

    B、安全性控制

    C、并发控制

    D、访问控制

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    DBMS对数据库进行封锁时采用的基本锁类型是()。

    A、N锁

    B、S锁

    C、X锁

    D、Y锁

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    关系模型允许定义()三类完整性约束。

    A、结构完整性

    B、实体完整性

    C、参照完整性

    D、系统完整性

    E、用户定义的完整性

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    用户定义的完整性约束条件的作用对象可以是()。

    A、元组

    B、关系

    C、属性列

    D、数据库

    E、基本表

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    事务是DBMS的执行单位,一般具有哪些性质?()

    A、原子性

    B、一致性

    C、隔离性

    D、持久性

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    在关系数据中,三级模式结构包括()。

    A、内模式

    B、概念模式

    C、存储模式

    D、外模式

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    下面关于函数依赖的叙述中,正确的是()。

    A、若X→Y,X→Z,则X→YZ

    B、若XY→Z,则X→Z,Y→Z

    C、若X→Y,WY→Z,则XW→Z

    D、若X→Y,则XZ→YZ

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    数据模型按照不同的应用层次可将其划分为()。

    A、概念模型

    B、逻辑数据模型

    C、局部模型

    D、物理模型

    E、全局模型

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    E-R模型的设计又分为()E-R模型的设计和()E-R模型的设计两个步骤。

    A、局部

    B、全局

    C、上层

    D、下层

    E、系统

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    关系数据库的物理结构主要是指数据的()。

    A、查询方法

    B、排序方法

    C、存取方法

    D、存储结构

    E、统计方法

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    若事务T对数据R已经加了排它锁,则下面说法错误的是()。

    A、其他事务对数据R可以加共享锁不能加排它锁

    B、其他事务对数据R不能加共享锁可以加排它锁

    C、其他事务对数据R可以加共享锁也可以加排它锁

    D、其他事务对数据R不能加任何锁

    查看答案

    467542f076af1fe92b6bc5cf0ed43e68.png参考答案

    展开全文
  • 1、什么场景会用到分布式(用本地举例,分布式场景在并发情况下存在的问题) 2、redis为什么可以实现分布式 3、假设分布式场景,运用redis分布式并剖析各种坑 结合视频157、158

    下一篇:Redis分布式锁原理(二)——Redisson分布式锁源码浅析

            虽然目前Redisson框架已经帮我们封装好了分布式锁的实现逻辑,我们可以直接像调用本地锁一样使用即可,但本文并不直接剖析Redisson源码,而是首先分析在分布式场景下实现redis分布式锁需要注意哪些问题,这样之后阅读Redisson源码也会变得更容易。

    目录

    一、什么场景会用到分布式锁?

    二、redis为什么可以实现分布式锁?

    三、实现redis分布式锁需要注意哪些问题?


    一、什么场景会用到分布式锁?

            在分布式场景下,我们不同的业务功能放在不同的服务器上,而这些不同的业务可能会去操作同一个数据库资源,如果这时候大并发进来,就可能会出现同时操作共享资源的情况,为了避免这种情况发生,我们想到的是加锁,如果这时候是在各自服务器的代码实现上加本地锁能够解决这种问题吗?

            答案当然是不能,来分析一下上述场景:

            整个系统的业务1、业务2、业务3放在不同的服务器上构成了分布式场景,这三个业务底层都会去操作同一个数据库,现在对这三个业务的代码实现上加上本地锁,即synchronized、ReentrantLock等,此时100个并发请求进入这个系统,假设到达这三个服务器的请求量分别为30、30、40,由于三个业务是在不同的服务器上,所以对于它们而言使用本地锁锁住的不会是同一个对象,因此能进入业务1的请求只有1条,进入业务2的请求也有1条,同理进入业务3的请求也是1条,最终数据库会同时接收到3条访问请求,出现了同时操作共享资源的情况。

            分布式锁是怎么解决这种问题的呢?就好比在这三个业务外边放一把大锁,这把锁也就脱离了“本地”的概念,三个服务器都可以去这个公共的地方抢这把锁,谁抢到了这把锁谁就可以去执行业务操作数据库,其他业务只能等待。

    二、redis为什么可以实现分布式锁?

            上面所提到的公共的地方可以用redis代替,也就是说所有的服务器都连接上同一个redis,redis是一个缓存数据库,我们通过往这个缓存中存取标记的手段达到锁的获取和释放的效果,说到这里就不得不引出这个关键的命令了:set NX,它是一个原子性的命令,它能保证如果缓存中如果没有这个key时才会对其进行设置,如果这个key已经存在了那么这个命令就会执行失败。

            下面可以用xshell连接虚拟机后进行进行一个简单的测试,需要提前在虚拟机中安装好redis。首先复制多份会话模拟多个用户去抢redis锁,在确保redis在虚拟中正常运行的前提下输入命令“docker exec -it redis redis-cli”并发送到全部会话,使所有的会话都进入到redis容器中,接着输入命令“set locktest 123 NX”并同时发送到全部会话,模拟同一时刻多个会话去抢同一把锁。结果如下,会话1抢占锁成功,而会话2和会话3抢锁失败,而打开redis可以看到的确只有一条锁记录插入成功。

            这样看来,redis的确是可以用来实现分布式锁,原理就是使用set nx命令进行设值,若返回成功则代表拿锁成功,返回失败则代表拿锁失败。

    三、实现redis分布式锁需要注意哪些问题?

            首先来看这样一段代码。

        @Override
        public List<Map<String, Object>> findList() {
            //尝试获取分布式锁,步骤一
            Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", "齐天小圣");
            if (lock) {
                //加锁成功,执行业务,步骤二
                List<Map<String, Object>> resultList = findListByDB();
                //删除锁,步骤三
                redisTemplate.delete("lock");
                return resultList;
            } else {
                //加锁失败,自旋重试,即重新调用本方法。
                try {
                    Thread.sleep(300);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return findList();
            }
        }

            乍一看用redis完成一个分布式锁的整体逻辑好像也不是很复杂,无非就是先去获取分布式锁,如果拿到锁了就去执行相应的业务,没有拿到锁就自旋重试。但其实上面这段代码漏洞百出,实际想要完成一个完美的分布式锁是很复杂的,我们需要注意以下问题:

            1、死锁问题:如果某服务器拿锁成功,执行到步骤二时突然宕机没能正常的执行步骤三释放锁,那么其他正在等待锁的服务器则永远也拿不到锁了,这就是死锁问题。

            解决这个问题很简单,只需要在拿锁之后给锁上一个超时时间即可,即使业务过程中出现问题导致不能释放锁,到了过期时间redis也会自动帮我们去把这个锁删除。需要注意的是,千万不能把“获取锁”和“设置超时时间”在代码中分成两步执行,如下:

            原因在于这两个步骤分开执行没有保证原子性,拿锁到设置过期时间之间是存在时间差的,如果在这之间机器宕机了还是会存在上述问题,解决办法就是在占锁的同时设置过期时间。

            2、业务时间 > 超时时间:假设这样一个场景,业务1拿锁成功并设置过期时间30s,但业务1比较复杂需要花费40s,那么到了30s后业务1的锁就已经失效了,此时业务2抢到了锁也进来执行相应的逻辑,那么此时业务1和业务2都在执行各自的业务逻辑,可能会操作相同的数据资源造成违反资源互斥的现象。问题还没完,又过去了10s,业务1执行完了,理所当然的就去删锁,那么自然就会把业务2手里的锁删掉,业务2一脸懵逼。。。这就造成了锁误删的现象。

            先解决锁误删的问题,其实很简单,只需要保证谁拿的锁谁就有资格删就可以了,我们在获取锁的时候设置了一个value,此时就派上了用场,把每个业务的value都设置uuid,最后删锁的时候先去redis获取锁对应的值,如果这个值等于uuid才有资格执行删锁命令。需要注意的是这里也需要保证原子性,因为去远程redis获取锁对应的值再返回来也是有时间差的,如果业务1去远程获取到锁的value为“1111”,回来的过程中锁过期了,此时业务2拿到了锁开心的去执行它的业务去了,好景不长,业务1回来判断出锁的value是等于自己的uuid,于是又理所当然的把锁删掉了,业务2又一脸懵逼。。。。这里就需要使用lua脚本解锁,lua脚本就是为了保证这两段操作的原子性,解锁脚本内容如下:

    if redis.call("get",KEYS[1]) == ARGV[1]
    then
        return redis.call("del",KEYS[1])
    else
        return 0
    end

            最后优化后的代码如下:

        @Override
        public List<Map<String, Object>> findList() {
            //尝试获取分布式锁,并设置过期时间
            String uuid = UUID.randomUUID().toString();
            Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid, 30, TimeUnit.SECONDS);
            if (lock) {
                //加锁成功,执行业务
                List<Map<String, Object>> resultList;
                try{
                    resultList = findListByDB();
                } finally {
                    //获取值进行对比,若对比成功则有资格进行删锁,需使用lua脚本保证原子性
                    String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1]\n" +
                            "then\n" +
                            "    return redis.call(\"del\",KEYS[1])\n" +
                            "else\n" +
                            "    return 0\n" +
                            "end";
                    Long result = redisTemplate.execute(new DefaultRedisScript<Long>(script, Long.class)
                            , Arrays.asList("lock"), uuid);
                }
    
                return resultList;
            } else {
                //加锁失败,自旋重试,即重新调用本方法。
                try {
                    Thread.sleep(300);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return findList();
            }
        }

            其实我们还遗漏了一个问题,上面优化后的代码并没有解决业务时间 > 超时时间造成的违反资源互斥的现象,解决这个问题的办法是如果业务还没有结束,那么这期间每隔一段时间就给锁进行延时,即“锁续命”,但这涉及到定时任务,异步编排,所以就不再往下继续优化,到了这里不得不请Redisson分布式锁隆重登场了。

            在实际开发中我们并不会像上面这样用原生redis代码去实现分布式锁,而是使用已经封装好的框架——Redisson,Redisson已经为我们解决了上述细节问题,包括用定时任务实现“看门狗”机制为锁延时,我们只需要像平时使用本地锁一样进行调用即可。

            有了上述的思考,我们在下篇再来探析Redisson源码就会变得更加明朗了。

    下一篇:Redis分布式锁原理(二)——Redisson分布式锁源码浅析 

    展开全文
  • Python 面试的时候,会涉及到很的八股文,我结合自己的经验,整理Python 最强面试题。 Python 最强面试题主要包括以下几方面: Python 基础(已完成) Python 进阶 Python 后台开发 爬虫 机器学习 对每道面试题...
  • 前言synchronized是jvm内部的一把隐式,一切的加锁和解锁过程是由jvm虚拟机来控制的,不需要我们认为的干预,我们大致从了解锁,到synchronized的使用,到的膨胀升级过程三个角度来说一下synchronized。...
  • 、前言 数学离程序员有近? ifelse也好、for循环也罢,代码可以说就是对数学逻辑的具体实现。所以敲代码的程序员几乎就离不开数学,难易不同而已。 那数学不好就写不了代码吗?????不,一样可以写代码,可以写出...
  • 多核时代摩尔定律告诉我们:当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加倍,性能也将提升倍。...所以现在的芯片制造商改变了策略,转而在个电路板上集成更的处理器,也就是我们现...
  • 这篇文章我想和你聊聊,关于 Redis 分布式的「安全性」问题。Redis 分布式的话题,很文章已经写烂了,我为什么还要写这篇文章呢?因为我发现网上 99% 的文章,并没有这个问...
  • Mysql 分析

    2021-01-18 22:33:22
    本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍种思路,运用此思路,拿到任何条SQL语句,都能完整的分析出这条语句会加什么?会有什么样的使用风险?甚至是分析线上的个死锁...
  • 当我刷到这条脉脉的时候,想到当年老板面试我的时候,拿...无锁、偏向、轻量级、重量级有什么差别? 如何正确的启动和停止个线程? 线程和纤程的区别的是什么?为什么纤程比较轻量级? ThreadLocal有.
  • 也就是说使用主键索引需要加一把锁,使用二级索引需要在二级索引和主键索引上各加一把锁。 根据索引对单行数据进行更新的加锁原理了解了,那如果更新操作涉及个行呢,比如下面 SQL 的执行场景。 update user set ...
  • 哈喽,大家好,我是江湖人送外号[道格牙]的子牙...市面上关于synchronized的资料已经很了,我这个专栏跟那些资料有啥差别呢: 更系统。市面上目前虽然资料众多,但都是零散的。有些资料讲得东西甚至是相互冲突的,
  • 下面是Java程序员相关的热门面试题,你可以用它来好好准备面试。1) 什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含...Java在语言层面对线程提供了卓越的支持,它也是个很好的卖点。2) 线程和...
  • Mysql行级

    2021-01-19 03:24:14
    蓝色“深入原理”,关注并“设为星标”技术干货,第时间推送在上篇文章中,我跟你介绍了 MySQL 的全局和表级,今天我们就来讲讲 MySQL 的行锁。MySQL 的行锁是在引擎层由各个引擎自己实现的。但并不是所有的...
  • 最近针对互联网公司面试问到的知识点,总结出了Java程序员面试涉及到的绝大部分面试题及答案分享给大家,希望能帮助到你面试前的复习且找到个好的工作,也节省你在网上搜索资料的时间来学习。 内容涵盖:Java、...
  • 、我也曾后悔过踏入程序员这职业 相信大家考上大学时应该都有面临过选专业这一道难题吧,我同样没有避免,但是我还是算比较果断的,因为我从初中开始就对计算机感兴趣,然后就很佛的报了计算机专业,大学时,我...
  • 财务数据库被死,用户没有部署CDP持续数据保护产品时,如果想要恢复数据,只能乖乖地缴纳赎金。这绝非危言耸听,下面这位用户的Oracle数据库被恶意死时,就出现了下面的缴纳赎金的提示:幸运的是,用户没有向...
  • 数据分为乐观和悲观它们使用的场景如下:乐观适用于写少读的情景,因为这种乐观相当于JAVA的CAS,所以条数据同时过来的时候,不用等待,可以立即进行返回。悲观适用于写读少的情景,这种情况也...
  • 静态代理和动态代理的区别 JDK动态代理和CGLIB动态代理的区别 微信扫码,关注公众号 回复“答案”,即可查看答案 答案已整理成pdf,方便您阅读 Java线程 说说synchronized的实现原理 ReentrantLock与synchronized...
  • redis 分布式的正确实现方式

    万次阅读 2018-09-05 11:57:34
    虽然网上已经有各种介绍Redis分布式实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式。 可靠性 首先,为了确保分布式可用,我们至少要确保...
  • 最近做的个小项目中有这样的需求:整个项目有份config.json保存着项目的一些配置,...与传统不同的是读写的规则是可以共享读,但只能个写,总结起来为:读读不互斥,读写互斥,写写互斥,而一般的独占是...
  • 当我们遇到并发问题时候,第个想到的就是用,在JAVA里面使用synchronized解决并发问题已经是程序员潜意识的解决方案了,但是如果要问起synchronized解决了哪些问题时候,大部分人知道的都是
  • Java 读写实现原理

    2021-02-12 13:44:57
    原标题:Java 读写实现原理作者:牛李链接:https://my.oschina.net/editorial-story/blog/1928306本文为作者投稿文章,转载请注明上述信息最近做的个小项目中有这样的需求:整个项目有份config.json保存着...
  • 从互联网发展以来,线程一直是java不可避免的个阑槛,现在的项目几乎没有不用到线程的了,所以了解了解线程的相关面试题对面试相信会有非常大的帮助,下面起来看看常问到的线程面试题有哪些吧。...
  • 前段时间写了篇关于 MySQL 的文章,一些小伙伴们在阅读之后产生了一些疑问,这些问题还挺有代表性的,所以在这里做个实验,来用事实探究一番。 那篇文章提到了记录(Record Locks),顾名思义的是记录,作用...
  • mysql事务和InnoDB

    2021-01-19 20:22:09
    本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍种思路,运用此思路,拿到任何条SQL语句,都能完整的分析出这条语句会加什么?会有什么样的使用风险?甚至是分析线上的个死锁...
  • 总结一下 O/S 课程里面和相关的内容. 本文是 6.S081 课程的相关内容总结回顾, 前置知识是基本的操作系统知识以及部分组成原理知识. 举例如: 线程与并发的概念, 中断与管态用户... 比如个链表在个线程的读写过...
  • 1.分布式如何实现的?存在什么问题? 2.事务一致性怎么保证的? 3.你觉得微服务存在什么问题? 第二点呢?可以关注我的公众号-面试怪圈,回复3fkw从视频教程:微服务架构的分布式事务控制解决方案,找到你想要的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,677
精华内容 7,870
关键字:

多了一把锁阅读答案