multi OK > set bookName "Redis" QUEUED > get" />
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Redis中的使用

科技绿洲 来源:Java威廉希尔官方网站 指北 作者:Java威廉希尔官方网站 指北 2023-10-08 15:27 次阅读

Redis 作为内存的存储中间件,已经是面试的面试题必问之一了,今天一起来看看 Redis 的事务吧。

事务提供了一种"将多个命令打包,一次性提交并按顺序执行"的机制,提交后在事务执行中不会中断。只有在执行完所有命令后才会继续执行来自其他客户的消息。

Redis 中的使用

Redis 通过 multi,exec,discard,watch 实现事务功能。

  1. multi:开始事务
  2. exec:提交事务并执行
  3. discard:取消事务
  4. watch:事务开始之前监视任意数量的键
> multi
OK
 > set bookName "Redis"
QUEUED
 > get bookName
QUEUED
 > sadd tag "Redis" "New Book"
QUEUED
 > smembers tag
QUEUED
 > exec
1) OK
2) "Redis"
3) (integer) 2
4) 1) "Redis"
   2) "New Book"

开始事务

> multi
OK

这个命令将 Redis_multi 选项打开,让客户端从非事务状态变为事务状态

图片

命令入队

> set bookName "Redis"
QUEUED
 > get bookName
QUEUED
 > sadd tag "Redis" "New Book"
QUEUED
 > smembers tag
QUEUED

在事务状态中,Redis 命令并不是立即执行的,而是进入一个先进先出的事务队列。QUEUED 表示这个命令已经入了事务队列。

执行事务

> exec
1) OK
2) "Redis"
3) (integer) 2
4) 1) "Redis"
   2) "New Book"

当执行 exec 命令时,Redis 根据客户端所保存的事务队列, 以先进先出的方式执行事务队列中的命令:最先入队的命令最先执行, 而最后入队的命令最后执行。当 exec 命令执行完毕时,Redis 会将结果保存到一个回复队列,并将回复队列返回给客户端。客户端从事务状态退出,一个事务执行完毕。

discard 命令

> multi
OK
 > set author "lisi"
QUEUED
 > discard
OK
 > get author
(nil)

discard 取消一个事务的命令,表示这个事务被取消。客户端从事务状态退出,回到非事务状态,Redis_multi 选项关闭。

图片

watch 命令

# Redis 客户端1
 > watch letter
OK
 > multi
OK
 > set letter a
QUEUED
 > exec
(nil)


# Redis 客户端2
 > set letter b
OK

# Redis 客户端1
 > get letter
"b"

设置监控 letter 键,客户端1进入事务,设置 letter 的 value 为 a,未提交事务。客户端2设置 letter 的 value 为 b。回到客户端1提交事务返回的结果为 nil,调用 get 命令得到 letter 为 b。这说明当 letter 键在其他客户端改变后,事务被取消了,不会被执行,返回失败。

watch 命令在事务开始之前监视任意数量的键:当调用 exce 命令执行事务时,如果任意一个被监视的键已经被其他客户端修改了,那么整个事务不再执行,直接返回失败。

图片

事务异常

命令错误

> set letter ac
QUEUED
> get letter ac
(error) ERR wrong number of arguments for 'get' command
> exec
(error) EXECABORT Transaction discarded because of previous errors.

事务中命令异常属于语法错误,将导致事务无法执行。

运行时异常

> multi
OK
 > lpush books "Redis"
QUEUED
 > incr books
QUEUED
 > lpush books "Python"
QUEUED
 > lrange books 0 -1
QUEUED
 > exec
1) (integer) 1
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) (integer) 2
4) 1) "Python"
   2) "Redis"

上面的例子是事务执行到中间遇到失败了,因为不能对一个字符串进行 incr 命令,事务在遇到命令执行失败后,后续的命令还继续执行,所以 books 的值能继续得到设置。这种异常只有程序员在代码中避免。

事务的 ACID

原子性

原子意味着要么一起成功执行,要么一起失败回滚。Redis 提供的所有 API 都是原子操作。那么 Redis 事务只要保证在一批操作中保证原子性,但是在运行时异常中,在一个事务中一个命令出现异常,其他命令还是会继续执行,事务没有回滚机制,所以 Redis 事务是不保证原子性的。

一致性

事务异常

如果命令错误事务无法执行,如果是运行时异常,Redis 会将错误包含在返回结果中,并不影响后续执行,所以事务是一致性的。

Redis 进程被终结

在纯内存模式下,Redis 没有做持久化,重启之后数据库是空白的,所以是事务一致性的。

在 RDB 模式下,事务并不会在中途执行保存 RDB 文件的工作,只有在事务执行完后,RDB 工作才可能会开始。所以在事务执行过程中 Redis 进程被杀死,不管成功多少都不会保存到 RDB 文件中,所以是一致性的。

在 AOF 模式下,事务部分语句被写入 AOF 文件并保存成功,不完整的事务被保存到了 AOF 文件,当重启 Redis 时,检查 AOF 文件不完整,Redis 退出并报错。需要把这段不完整的事务删除后才能重启成功,所以是一致性的。

在 AOF 模式下,事务并未被写入 AOF 文件,所以重启后 Redis 数据库是最近一次成功保存到 AOF 文件中的数据。并没有这次事务的数据,所以是以一致性的。

隔离性

Redis 是单进程程序,并且它保证在执行事务时,不会对事务进行中断,事务可以运行直到执行完所有事务队列中的命令为止。所以事务是带有隔离性的。

持久

在纯内存模式下,事务肯定不是持续性的。

在 RDB 模式下,服务器可能在事务执行之后、RDB 文件更新之前的这段时间失败,所以 RDB 模式下的事务也是不持久的。

在 AOF 模式下,将命令添加到 AOF 文件中,但是对文件进行写入并不会马上写到磁盘上,而是先存储到缓冲区。所以数据保存到磁盘上有一段非常小的时间间隔。这种模式下事务也不是持久的。

结语

本文介绍了 Redis 的事务的 multi,exec,discard,watch 命令用法和 它的 ACID。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储
    +关注

    关注

    13

    文章

    4298

    浏览量

    85809
  • DISCARD
    +关注

    关注

    0

    文章

    2

    浏览量

    6458
  • 客户端
    +关注

    关注

    1

    文章

    290

    浏览量

    16684
  • Redis
    +关注

    关注

    0

    文章

    374

    浏览量

    10871
收藏 人收藏

    评论

    相关推荐

    #硬声创作季 SSG分布式锁视频教程:20.演示Redis的超卖现象

    数据库Redis
    Mr_haohao
    发布于 :2022年10月02日 23:08:26

    Simple Dynamic Strings (简称 SDS) 是什么

    语言字符串处理的能力。设计 SDS 原本是为了满足设计者自身日常的 C 编程,后来又被转移到 Redis ,在 Redis 中被广泛使用并对其进行了修改以适合于高性能操作。现在,它又被从
    发表于 07-16 06:45

    如何使得redis的数据不再有

    嵌入式Linux系统重启后如何使得redis的数据不再有今天在工作遇到一个问题:网页展示redis的数据,然而再Linux系统重启后网
    发表于 11-05 08:50

    关于redis数据存储的机制解析

    不同于memcached等完全基于内存的缓存中间件,Redis同时还提供了持久化功能,这也是为什么Redis不仅可以用来做数据缓存还可以用来做数据存储,服务器节点宕机之后可以通过事先持久化的数据还原数据到某个时间点的状态。
    发表于 09-02 10:46 1124次阅读
    关于<b class='flag-5'>redis</b><b class='flag-5'>中</b>数据存储的机制解析

    嵌入式Linux系统重启后如何使得redis的数据不再有

    嵌入式Linux系统重启后如何使得redis的数据不再有今天在工作遇到一个问题:网页展示redis的数据,然而再Linux系统重启后网
    发表于 11-02 15:06 11次下载
    嵌入式Linux系统重启后如何使得<b class='flag-5'>redis</b><b class='flag-5'>中</b>的数据不再有

    Redis的数据类型为何同时采用两种数据结构来进行分别存储呢

    Redis 的集合对象是一个包含字符串类型元素的无序集合,集合中元素唯一不可重复。
    的头像 发表于 08-17 11:26 1166次阅读
    <b class='flag-5'>Redis</b>的数据类型为何同时采用两种数据结构来进行分别存储呢

    基于排行榜功能使用redis的有序集合实现

    排行榜功能是一个很普遍的需求,对于这类需求如果数据总量过大用mysql实现的话会很浪费性能。
    的头像 发表于 10-21 09:59 1015次阅读

    如何使用Redis更节省内存?

    当你的业务应用在 Redis 存储数据很少时,你可能并不太关心内存资源的使用情况。但随着业务的发展,你的业务存储在 Redis 的数据就会越来越多。
    的头像 发表于 12-19 15:41 947次阅读

    SpringBoot+Redis实现点赞功能的缓存和定时持久化(附源码)

    用户对浏览内容进行【点赞/取赞】,并发送【点赞/取赞】请求到后端,这些信息先存入Redis缓存,再每隔两小时将Redis的内容直接写入数据库持久化存储。
    的头像 发表于 02-09 16:38 4565次阅读

    为什么要使用Redis做缓存?

    Java里提供了HashMap,Redis也有类似的数据结构,就是哈希类型。但是要注意,哈希类型的映射关系叫作field-value,注意这里的value是指field对应的值,不是键对应的值。
    的头像 发表于 03-13 09:50 2452次阅读

    如何从0到1构建一个稳定、高性能的Redis集群?

    这个架构非常简单,你的业务应用可以把 Redis 当做缓存来使用,从 MySQL 查询数据,然后写入到 Redis ,之后业务应用再从 Redi
    的头像 发表于 07-19 15:19 632次阅读
    如何从0到1构建一个稳定、高性能的<b class='flag-5'>Redis</b>集群?

    Redis架构演化之路

    这个架构非常简单,你的业务应用可以把 Redis 当做缓存来使用,从 MySQL 查询数据,然后写入到 Redis ,之后业务应用再从 Redi
    的头像 发表于 08-03 16:54 609次阅读
    <b class='flag-5'>Redis</b>架构演化之路

    redis查看主从节点命令

    Redis是一种开源的内存数据结构存储系统,常被用作数据库、缓存和消息中间件。在Redis,可以通过一些命令来查看主从节点的信息,以便进行监控和管理。 Redis 主从复制是指将一个
    的头像 发表于 12-04 11:44 1320次阅读

    redis hash底层实现原理

    Redis是一个开源的内存数据库,使用键值对存储数据。其中,Redis的数据结构之一就是哈希(Hash),它提供了一种将多个字段(Field)存储在一个键(Key)的方法。那么
    的头像 发表于 12-04 16:27 581次阅读

    redis容器运行时间久了会自动执行flushdb

    Redis是一种开源的内存数据库,常用于缓存、消息传递、持久化等场景。在Redis,flushdb命令用于清空当前数据库的所有数据。然而,Red
    的头像 发表于 12-05 10:12 956次阅读