Redis数据库高级实用特性:事务控制 (redis数据类型)

技术教程 2025-05-07 21:25:19 浏览
事务控制

redis对事务的支持目前还比较简单。redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。 由于redis是单线程来处理所有client的请求的所以做到这点是很容易的。一般情况下redis在接受到一个client发来的命令后会立即处理并 返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一个队列中。当从此连接受到exec命令后,redis会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给client.然后此连接就 结束事务上下文。

1、简单事务控制

下面可以看一个例子:

从这个例子我们可以看到2个set age命令发出后并没执行而是被放到了队列中。调用exec后2个命令才被连续的执行,最后返回的是两条命令执行后的结果。

2、如何取消一个事务

我们可以调用discard命令来取消一个事务,让事务回滚。接着上面例子:

可以发现这次2个set age命令都没被执行。discard命令其实就是清空事务的命令队列并退出事务上下文,也就是我们常说的事务回滚。

3、乐观锁复杂事务控制

在本小节开始前,我们有必要向读者朋友简单介绍一下乐观锁的概念,并举例说明乐观锁是怎么工作的。

乐观锁:大多数是基于数据版本(version)的记录机制实现的。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表添加一个 “version”字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号加1。

此时,将提交数据的版本号与数据库表对应记录的当前版本号进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

乐观锁实例:假设数据库中帐户信息表中有一个version字段,当前值为1;而当前帐户余额字段(balance)为$100。下面我们将用时序表的方式来为大家演示乐观锁的实现原理:

操作员A 操作员B
(1)、操作员A此时将用户信息读出(此时version=1),并准备从其帐户余额中扣除$50($100-$50) (2)、在操作员A操作的过程中,操作员B也读入此用户信息(此时version=1),并准备从其帐户余额中扣除$20($100-$20)
(3)、操作员A完成了修改工作,将数据版本号加1(此时version=2),连同帐户扣除后余额(balance=$50),提交至数据库更新,此时由于提交数据版本大于数据库记录当前版本,数据被更新,数据库记录version更新为2
(4)、操作员B完成了操作,也将版本号加1(version=2)并试图向数据库提交数据(balance=$80),但此时比对数据库记录版本时发现,操作员B提交的数据版本号为2,数据库记录当前版本也为2,不满足“提交版本必须大于记录当前版本才能执行更新”的乐观锁策略,因此,操作员B的提交被驳回

这样,就避免了操作员B用基于version=1的旧数据修改的结果来覆盖操作员A的操作结果的可能。

即然乐观锁比悲观锁要好很多,redis是否也支持呢?答案是支持, redis从2.1.0开始就支持乐观锁了,可以显式的使用watch对某个key进行加锁,避免悲观锁带来的一系列问题。

Redis乐观锁实例:

假设有一个age的key,我们开2个session来对age进行赋值操作,我们来看一下结果如何。

(1)第1步 redis 127.0.0.1:6379> get age “10” redis 127.0.0.1:6379>watch age OK redis 127.0.0.1:6379> multi OK redis 127.0.0.1:6379>
(2)第2步 redis 127.0.0.1:6379>set age 30 OK redis 127.0.0.1:6379> get age “30” redis 127.0.0.1:6379>
(3)第3步 redis 127.0.0.1:6379>set age 20 QUEUED redis 127.0.0.1:6379> exec (nil) redis 127.0.0.1:6379> get age “30” redis 127.0.0.1:6379>

从以上实例可以看到在

第一步,Session 1 还没有来得及对age的值进行修改

第二步,Session 2 已经将age的值设为30

第三步,Session 1 希望将age的值设为20,但结果一执行返回是nil,说明执行失败,之后我们再取一下age的值是30,这是由于Session 1中对age加了乐观锁导致的。

watch命令会监视给定的key,当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败。也可以调用watch多次监视多个key.这 样就可以对指定的key加乐观锁了。注意watch的key是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。当然了exec,discard,unwatch命令都会清除连接中的所有监视。

redis的事务实现是如此简单,当然会存在一些问题。第一个问题是redis只能保证事务的每个命令连续执行,但是如果事务中的一个命令失败了,并不回滚其他命令,比如使用的命令类型不匹配。下面将以一个实例的例子来说明这个问题:

从这个例子中可以看到,age由于是个数字,那么它可以有自增运算,但是name是个字符串,无法对其进行自增运算,所以会报错,如果按传统关系型数据库的思路来讲,整个事务都会回滚,但是我们看到redis却是将可以执行的命令提交了,所以这个现象对于习惯于关系型数据库操作的朋友来说是很别扭的,这一点也是redis今天需要改进的地方。

【编辑推荐】


计算机二级报哪个

“C语言程序设计C++语言程序设计Java语言程序设计Visual Basic语言程序设计”这四门语言都是比较好的。 尤其是Java和VB是现在用的比较多的。 其中最简单的应该算是VB,而c++是很难的,Java是极有前途的。 现在学计算机的以后都不一定从事软件开发,哥们想好。

怎样强制开启windows2003的1433端口

在XP系统下,安装MSsql,默认是不打开1433端口的。 这对一些用XP的个人站长,想用第二台机连接本机的数据库时,提示找不到服务,原因在于没有开放1433端口。

2) 在windows server 2008的IIS 7.0中,若要限制站点的网络连接,无法通过"高级设置"的()实现.(

一、准备工作


1、所需软件:


mysql数据库、php、zendoptimizer

将上述软件网上搜索下载后置于同一目录中,比如:webTools


2、安装iis7,简要步骤如下:


(1)在控制面板中,选择程序-》打开关闭windows功能;
(2)在弹出的windows功能中,选中internet信息服务;
(3)展开-万维网服务-应用程序开发功能,选中isapi扩展(重要);
(4)确定后自动安装;
(5)在ie地址栏里输入
二、php环境部署攻略


数据库部署


(1)安装mysql数据库
进入x:\webtools目录点击开始安装文件复制完毕后,进入mysql设置界面,单击finish(完成)。 在接下的安装对话框中选择detailedconfiguration(详细配置),选择mysql运行模式,选择servermachine(服务器模式);然后选择mysql数据库默认存储方式-non-transonly;再设置最大连接数;设置mysql网络参数,strictmode就不要选择;再设置默认字符集,按照自己的需要选择即可;再进行windows服务模式设定、修改设定Root用户密码(remotemachines不要启动),这时mysql就安装完毕了。
(2)测试mysql数据库。 在命令行模式下(开始-运行-cmd)输入:
mysql–uroot–p
按照提示输入密码后,如能进入mysql控制台则说明mysql安装正常,否则需要检查先前安装步骤和相应服务是否启动,进行重新安装。
(3)更改mysql数据库目录:

1)打开cmd命令提示符窗口,输入命令:
netstopmysql
停止mysql服务运行;
2)打开x:\web\mysql\
找到:
datadir=x:\web\mysql\data
修改为:
datadir=x:\database
3)将x:\web\mysql\data目录复制到x:\,并重命名为x:\database;
4)打开cmd命令提示符窗口,输入命令:netstartmysql启动mysql服务,重新测试mysql是否工作正常。
5)准备libmysql动态链接库
将x:\web\mysql\bin\文件复制到c:\windows\system32即可。


服务部署


(1)解压缩文件并将其复制到:x:\web\php目录、将-dist重命名为;
(2)打开文件,找到:extension_dir=./
将其改为;
 extension_dir=x:\web\php\ext
(3)找到:windowsextensions:(去掉模块配置每行前面的;号即可)
extension=php_
extension=php_
extension=php_
(4)找到:
disable_functions=
改为:
disable_functions=phpinfo,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,
openlog,syslog,readlink,symlink,popepassthru,stream_socket_server
保存文件,并将其复制到windows安装目录下。

7整合php-新建站点

(1)启动iis管理器,选择新建-网站,
(2)输入网站名称,可任意输入。 网站ip地址不用填写,端口如没有特殊要求则保持80即可,最后正确输入网站域名。
(3)在网站分区中建立wwwroot以及下级站点目录。
(4)给予该站点读取和运行脚本的权限以便php应用。
至此,我们已经成功的新建了一个站点。


整合php-使站点支持php

(1)打开刚刚建立的网站属性
(2)在站点属性窗口中,单击主目录页签,单击配置按钮,在新弹出的应用程序配置对话框中,单击添加按钮,加入php的isapi支持,选择可执行文件:x:\web\php\、扩展名为、限制动作为:get,post。 单击确定添加,并在应用程序配置窗口中查看扩展是否加载成功。 若成功,则单击确定关闭配置窗口,回到站点属性主窗口。
(3)单击文档页签,在默认内容文档中添加例如、、三个文件。
(4)右键单击web服务扩展,添加php扩展支持。
(5)在如下图的新建web服务扩展对话框中,扩展名填写php,文件选择x:\web\php\,并设置该php扩展默认为允许。
(6)重启iis服务


5、测试php

iis与php的整合已经完毕,下面需要测试php支持是否正常。
(1)进入x:\wwwroot\bbs\目录,新建一个文件,内容为:
phpinfo();
?>
(2)打开ie浏览器,输入:
iis7下php环境部署基本完成。 还需安装zendoptimizer,按照提示一路下一步即可。 至此,整个mysql服务器的php环境配置完毕。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐