在学习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中的事务其实是要保证批量操作的原子性。

原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

如果本文对你有帮助,请点下推荐吧,谢谢^_^

转载于:https://www.cnblogs.com/hoohack/p/6666844.html

[深入学习Redis]RedisAPI的原子性分析相关推荐

  1. Redis API的原子性分析

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

  2. 【Redis笔记】一起学习Redis | 如何利用Redis实现一个分布式锁?

    一起学习Redis | 如何利用Redis实现一个分布式锁? 前提知识 什么是分布式锁? 为什么需要分布式锁? 分布式锁的5要素和三种实现方式 实现分布式锁 思考思考 基础方案 改进方案 保证setn ...

  3. Redis数据库教程——系统详解学习Redis全过程

    Redis数据库教程--系统详解学习Redis全过程 Redis快速入门:Key-Value存储系统简介 Key-Value存储系统:     Key-Value Store是当下比较流行的话题,尤其 ...

  4. redis批量操作及性能分析

    redis批量操作及性能分析 用过redis的小伙伴都知道,这东西是C/S的,就单纯的ser key vvv 就要走一次TCP,记得官方是说redis的qps将近10W,这...我不太敢相信,一秒钟之 ...

  5. 深入学习Redis(1):Redis内存模型

    前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字符串 ...

  6. 使用elk+redis搭建nginx日志分析平台(引)

    http://www.cnblogs.com/yjf512/p/4199105.html elk+redis 搭建nginx日志分析平台 logstash,elasticsearch,kibana 怎 ...

  7. 深入学习Redis(3):主从复制

    原味链接:https://www.cnblogs.com/kismetv/p/9236731.html 前言 在前面的两篇文章中,分别介绍了Redis的内存模型和Redis的持久化. 在Redis的持 ...

  8. Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍

    Hadoop学习笔记-20.网站日志分析项目案例(一)项目介绍 网站日志分析项目案例(一)项目介绍:当前页面 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edis ...

  9. ELK+redis搭建nginx日志分析平台

    ELK+redis搭建nginx日志分析平台 发表于 2015-08-19   |   分类于 Linux/Unix   |   ELK简介 ELKStack即Elasticsearch + Logs ...

最新文章

  1. Quartus II调用modelsim无缝仿真
  2. 计算机网络【wireshark抓包分析】
  3. springAop和AspectJ的关系
  4. json api_JSON模式在构建和部署API中的作用
  5. dotnet若干说明图片
  6. 我在全球最大的同性社交平台那点事
  7. 虚幻4 捏脸和换装系统实现
  8. ios开发学习--动画(Animation)效果源码分享--系列教程1
  9. [带权并查集] Jzoj P1503 体育场
  10. Docker 运行Tensorboard 和 jupyter的正确方法
  11. 一个网站的诞生- MagicDict开发总结1 [首页]
  12. justauth对接facebook、linkedin、twitter登陆
  13. phpwind9.0 read.php 修改,phpwind 9.0后台执行任意php代码
  14. python老男孩14期_老男孩Python完美实战课程 14期视频教程 28周Python视频教程 1-14周部分...
  15. 做自媒体4大免费网站,帮助我们更快上手运营
  16. 菜鸡哈屠教你合并果子
  17. 神经网络之 CNN 与 RNN 再梳理
  18. 测试攻击机伪装成目标机 IP 给目标机发送攻击报文是否成功
  19. 计算机登陆后如何防止自动注销,电脑自动注销怎么处理
  20. 细谈八种架构设计模式及其优缺点概述

热门文章

  1. Android 基本开发规范(必读)
  2. Android ListView 疯狂之旅 之 《自定义下拉刷新功能的ListView》
  3. JavaScript 变量提升
  4. Arcgis License的安装及破解
  5. Linux CentOS如何汉化系统
  6. JAVA笔记:Java常用类库
  7. C++重要知识点小结---3
  8. 初识 Oracle 11g
  9. C++中XMLHTTPRequest异步使用onreadystatuschange
  10. [Ajax] jQuery中的Ajax -- 01-jQuery中的Ajax