Redis-redis的事务含义-解读-事务让操作更安全 (redis-server)

教程大全 2025-07-14 09:14:18 浏览

redis 事务是 Redis 中一种重要的机制,它允许将多个命令打包在一起执行,相当于一个原子操作,同时保证了操作的安全性和一致性。在 Redis 中,一次事务包含多个命令,只有在事务被 EXEC 命令执行时,所有这些命令才会一次性执行,如果其中任何一条命令出现错误,整个事务就会被回滚,返回到执行事务之前的状态。

使用 Redis 事务

Redis 事务包含四个命令:MULTI,DISCARD,EXEC 和 WATCH,其中 MULTI 用于开始一个事务,DISCARD 用于回滚一个事务,EXEC 则用于提交一个事务。而 WATCH 命令则可以在数据修改时进行监视,如果在 EXEC 执行事务时监视到数据被修改,则事务会被回滚。

下面我们来看一个简单的示例,创建一个 Redis 数据库,然后在其中存储一个 key 值为 test,value 值为 123 的键值对:

$ redis-cli

127.0.0.1:6379> SET test 123

127.0.0.1:6379> GET test

接下来,我们可以使用 MULTI 命令开始一个事务,将 INCRBY 命令和 GET 命令都打包在事务中:``` shell127.0.0.1:6379> MULTIOK127.0.0.1:6379> INCRBY test 100QUEUED127.0.0.1:6379> GET testQUEUED

在这里,MULTI 命令表示开始一个事务,INCRBY 和 GET 命令则是事务中的两个命令。我们可以使用 EXEC 命令提交这个事务:

127.0.0.1:6379> EXEC

1) (integer) 223

事务中的 INCRBY 命令执行成功,将 test 的值加上了 100,GET 命令也返回了新的值 223。如果其中任意一条命令执行失败,执行 EXEC 命令时返回的空列表就会告诉你这次事务执行失败了。Redis 事务使用示例下面我们来看一个稍微复杂一些的 Redis 事务使用示例。假设现在 Redis 中有一个账户,我们需要通过 Redis 事务来实现转账操作。我们需要为账户配置一个初始余额:``` shell127.0.0.1:6379> SET balance 200OK

然后,我们需要使用 WATCH 命令来监视两个账号,只有当两个账号的余额都大于等于转账金额时,才进行转账操作。这个操作可以利用 Redis 的 WATCH 命令和原子性来实现。当某一资源被修改时,其它对该资源的操作都将失败。这个操作主要看代码实现。

import redis

r = redis.StrictRedis(host=”localhost”, port=6379, db=0)

def transfer(from_account, to_account, amount):

with r.pipeline() as pipe:

while True:

# Watch the keys to make sure their values don’t change dURIng the transaction

pipe.watch(from_account, to_account)

from_balance = int(pipe.get(from_account))

to_balance = int(pipe.get(to_account))

if from_balance

pipe.unwatch()

return False

# Start transaction

pipe.multi()

pipe.decrby(from_account, amount)

pipe.incrby(to_account, amount)

# Execute transaction

pipe.execute()

return True

except redis.Watcherror:

# Retry if there was a race condition

解读
在这个示例中,我们首先定义了一个 Python 函数 transfer,接收三个参数 from_account,to_account 和 amount,其中 from_account 表示转出账户,to_account 表示转入账户,amount 表示转账金额。然后,在函数体内,我们使用 with r.pipeline() as pipe 语句来创建 Redis pipeline,并使用 while 循环来构建事务。在循环内部,我们使用 WATCH 命令来监视 from_account 和 to_account 两个账户,如果这两个账户的值在事务执行过程中发生了变化,则事务会被回滚。接下来,我们通过 MULTI 命令开始事务,将 DECRBY 和 INCRBY 命令打包在一起作为事务的原子操作,执行 EXEC 命令来提交事务,这样就完成了转账操作。总结通过本文的介绍,我们可以看到 Redis 事务在实现原子性操作方面很有价值。利用 Redis 事务,我们可以将多个命令打包在一起执行,保证数据的一致性和安全性。在实际开发中,Redis 事务可以帮助我们做很多事情,如保证数据操作的原子性、实现简单的锁机制等。同时,Redis 事务还有很多的注意事项和注意点,需要我们在使用时注意。

香港服务器首选树叶云,2H2G首月10元开通。树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。


Redis有哪些数据结构?

Redis有五种结构:1、String可以是字符串,整数或者浮点数,对整个字符串或者字符串中的一部分执行操作,对整个整数或者浮点执行自增(increment)或者自减(decrement)操作。 字符串命令:①get、获取存储在指定键中的值②set、设置存储在指定键中的值③del、删除存储在指定键中的值(这个命令可以用于所有的类型)2、list一个链表,链表上的每个节点都包含了一个字符串,虫链表的两端推入或者弹出元素,根据偏移量对链表进行修剪(trim),读取单个或者多个元素,根据值查找或者移除元素。 列表命令:①rpush、将给定值推入列表的右端②lrange、获取列表在指定范围上的所有值③lindex、获取列表在指定范围上的单个元素④lpop、从列表的左端弹出一个值,并返回被弹出的值3、set包含字符串的无序收集器(unordered collection)、并且被包含的每个字符串都是独一无二的。 添加,获取,移除单个元素,检查一个元素是否存在于集合中,计算交集,并集,差集,从集合里面随机获取元素。 集合命令:①sadd、将给定元素添加到集合②smembers、返回集合包含的所有元素③sismember、检查指定元素是否存在于集合中④srem、检查指定元素是否存在于集合中,那么移除这个元素4、hash包含键值对无序散列表,添加,获取,移除当键值对,获取所有键值对。 散列命令:①hset、在散列里面关联起指定的键值对②hget、获取指定散列键的值③hgetall、获取散列包含的所有键值对④hdel、如果给定键存在于散列里面,那么移除这个键5、zset字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定。 添加,获取,删除单个元素,根据分值范围(range)或者成员来获取元素。 有序集合命令:①zadd、将一个带有给定分值的成员添加到有序集合里面②zrange、根据元素在有序排列中所处的位置,从有序集合里面获取多个元素③zrangebyscore、获取有序集合在给定分值范围内的所有元素④zrem、如果指定成员存在于有序集合中,那么移除这个成员

服务贸易不同方式具体内容有哪些?

服务贸易可分为国内服务贸易和国际服务贸易。 在国际贸易领域里,所谓服务贸易,通常指的 是国际服务贸易。 它是一种跨越国境的服务行为,是服务在国际间的输出和输入,实际上是国际间 服务的提供与接受。 根据世界贸易组织的界定,国际服务贸易具体有四种提供方式:第一,“跨 境提供”方式。 “跨境提供”方式是指从一国境内向另一国境内提供服务。 这种服务不构成人员、物资或资金的流动,而是通过邮政、电讯、计算机网络实现的服务,如金融、信息和视听等。 第二,“国外消费”方式。 “国外消费”方式是指在一国境内向另一国的服务消费者(自然人或法人)提供服务,如接待外国游客、为国外病人提供医疗服务、接受外国留学生等。 第三,“商业存在”方式。 “商业存在”方式是指一国的服务提供者通过在另一国境内的商业存在(指任何类型的经营企业或专业机构)提供服务,如一国的公司到国外开办银行、商店,设立会计师事务所、律师事务所等。 第 四,“自然人存在”方式。 “自然人存在”方式是指一国的服务提供者通过自然人在另一国境内的 存在提供服务,如一国的医生、教授、艺术家到另一国办公事服务。 

redis lpush 和sadd的区别

lpush 操作的是队列sadd 操作的是集合 LPUSH key value [value ...]将一个或多个值 value 插入到列表 key 的表头如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a bc ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误。 SADD key member [member ...]将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。 假如 key 不存在,则创建一个只包含 member 元素作成员的集合。 当 key 不是集合类型时,返回一个错误。

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

发表评论

热门推荐