RedisAPI原子性操作及原理解析

 更新时间:2020年12月11日 09:21:14   作者:ノGHJ  
这篇文章主要介绍了RedisAPI原子性操作及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在学习Redis的常用操作时,经常看到介绍说,Redis的set、get以及hset等等命令的执行都是原子性的,但是令自己百思不得其解的是,为什么这些操作是原子性的?

原子性

原子性是数据库的事务中的特性。在数据库事务的情景下,原子性指的是:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。【维基百科】

对于Redis而言,命令的原子性指的是:一个操作的不可以再分,操作要么执行,要么不执行。

Redis操作原子性的原因

Redis的操作之所以是原子性的,是因为Redis是单线程的。

由于对操作系统相关的知识不是很熟悉,从上面这句话并不能真正理解Redis操作是原子性的原因,进一步查阅进程与线程的概念及其区别。

进程与线程

进程

计算机中已执行程序的实体。【维基百科】。比如,一个启动了的php-fpm,就是一个进程。

线程

操作系统能够进行运算调度的最小单元。它被包含在进程之中,是进程的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。【维基百科】。比如,mysql运行时,mysql启动后,该mysql服务就是一个进程,而mysql的连接、查询的操作,就是线程。

进程与线程的区别

  • 资源(如打开文件):进程间的资源相互独立,同一进程的各线程间共享资源。某进程的线程在其他进程不可见。
  • 通信:进程间通信:消息传递、同步、共享内存、远程过程调用、管道。线程间通信:直接读写进程数据段(需要进程同步和互斥手段的辅助,以保证数据的一致性)。
  • 调度和切换:线程上下文切换比进程上下文切换要快得多。

线程,是操作系统最小的执行单元,在单线程程序中,任务一个一个地做,必须做完一个任务后,才会去做另一个任务。

Redis在并发中的表现

Redis的API是原子性的操作,那么多个命令在并发中也是原子性的吗?

看看下面这段代码:

  $redis = new Redis();
  $redis->connect('127.0.0.1', 6379);
  for($i = 0; $i < 1000; $i++) {
      $num = (int) $redis->get('val');
      $num++;
      $redis->set('val', $num);
      usleep(10000);
  }

用两个终端执行上面的程序,发现val的结果是小于2000的值,那么可以知道,在程序中执行多个Redis命令并非是原子性的,这也和普通数据库的表现是一样的。

如果想在上面的程序中实现原子性,可以将get和set改成单命令操作,比如incr,或者使用Redis的事务,或者使用Redis+Lua的方式实现。

总结

综上所述,对Redis来说,执行get、set以及eval等API,都是一个一个的任务,这些任务都会由Redis的线程去负责执行,任务要么执行成功,要么执行失败,这就是Redis的命令是原子性的原因。

Redis本身提供的所有API都是原子操作,Redis中的事务其实是要保证批量操作的原子性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Redis实现分布式锁的实例讲解

    Redis实现分布式锁的实例讲解

    在本篇文章里小编给大家整理了一篇关于Redis实现分布式锁的实例讲解内容,有兴趣的朋友们可以学习参考下。
    2021-12-12
  • Redis RDB技术底层原理详解

    Redis RDB技术底层原理详解

    为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中以某种形式同步到硬盘中,这一过程就是持久化,本文重点给大家介绍Redis RDB技术底层原理实现方法,一起看看吧
    2021-09-09
  • redis分布式锁之可重入锁的实现代码

    redis分布式锁之可重入锁的实现代码

    相信大家都知道可重入锁的作用防止在同一线程中多次获取锁而导致死锁发生,本文通过几个例子给大家分享redis分布式锁之可重入锁的实现代码,对redis分布式锁的相关知识,感兴趣的朋友一起看看吧
    2021-05-05
  • redis如何实现清空缓存

    redis如何实现清空缓存

    这篇文章主要介绍了redis如何实现清空缓存,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 浅谈Redis的异步机制

    浅谈Redis的异步机制

    命令操作、系统配置、关键机制、硬件配置等会影响 Redis 的性能,还要提前准备好应对异常的方案,本文主要介绍了Redis的异步机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • redis反序列化报错原因分析以及解决方案

    redis反序列化报错原因分析以及解决方案

    这篇文章主要介绍了redis反序列化报错原因分析以及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 使用Redis实现向量相似度搜索

    使用Redis实现向量相似度搜索

    在自然语言处理领域,有一个常见且重要的任务就是文本相似度搜索,所以本文为大家介绍一下如何利用Redis实现向量相似度搜索,解决文本、图像和音频之间的相似度匹配问题,需要的可以了解下
    2023-07-07
  • redis源码分析教程之压缩链表ziplist详解

    redis源码分析教程之压缩链表ziplist详解

    ziplist结构在redis运用非常广泛,是列表、字典等数据类型的底层结构之一。ziplist的优点在于能够一定程度地节约内存。下面这篇文章主要给大家介绍了关于redis源码分析教程之压缩链表ziplist的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • redis命令行查看中文不乱码的方法(十六进制字符串处理)

    redis命令行查看中文不乱码的方法(十六进制字符串处理)

    这篇文章主要给大家介绍了关于redis命令行查看中文不乱码的方法,其中详细介绍了十六进制字符串处理的相关资料,文中给出了详细的示例代码,供大家参考学习,下面随着小编来一起学习学习吧。
    2017-10-10
  • Redis BloomFilter实例讲解

    Redis BloomFilter实例讲解

    这篇文章主要介绍了Redis BloomFilter实例。BloomFilter不需要存储key,节省空间,在某些对保密要求非常严格的场合有优势。想要进一步了解BloomFilter运用实例的小伙伴可以了解一下这篇文章
    2021-09-09

最新评论