美文网首页我爱编程
Redis如何保证原子性

Redis如何保证原子性

作者: 老骥成长 | 来源:发表于2018-05-23 23:19 被阅读116次

众所周知,Redis是一个key-value存储系统,它有一些特性,例如基于内存、单线程、非阻塞、操作原子性、高性能等。

不做过多展开,本篇主要记录我对Redis如何保证原子性问题的思考,以及此问题衍生出的问题,如有错误和疑问欢迎大家在底部留言。

问题一、Redis如何保证原子性?

答案很简单,因为redis是单线程。

问题来了,既然Redis是单线程,可以保证原子性,那么它的异步和非阻塞是什么?单线程如何实现异步和非阻塞?

问题二、Redis单线程,如何实现异步和非阻塞

再查阅了很多资料之后,我发现我对于同步/异步阻塞/非阻塞以及单线程/多线程的概念有些不清晰,下面给出简单解释。

同步/异步:首先同步和异步主要是从消息通知机制来讲起的。

    同步:一个任务的完成必须依赖另一个任务,两个要么都成功要么都失败,是一种可靠的任务序列。当一个同步调用发生后,调用者必须等待返回结果,才能继续后面任务的执行。

    异步:不需要等待被依赖任务的完成,只需要完成自己的任务就可以,所以是不可靠任务序列。当一个异步调用发生后,调用者不必等待返回结果,调用者可以去做其他的事情,被调用部件在处理完成后,通过(状态、通知、回调)来通知调用者。

阻塞/非阻塞:阻塞和非阻塞和调用者等待消息通知时的状态有关。很重要,不要和同步混淆。

     阻塞:调用者在等待通知的过程中,不能执行其他业务,傻傻的等待通知到来。

     非阻塞:和阻塞相反,调用者可以去执行其他业务。

我没有阅读源码,参考下面文章Redis 网络架构及单线程模型

总结一下:对于Redis的网络请求,Redis会有一个EventLoop,里面有两个数组events,fired。events存放被注册的事件,fired用于存放EventLoop从多路复用器(epoll)中读取到的,将要执行的事件。

异步和非阻塞就反映在这里,注册到多路复用器(epoll)后去做其他事,之后通过主动轮询多路复用器,来逐个取出将要执行的事件,放入fired,逐个执行,这个过程是单线程的,因此不会出现并发问题。

问题三:什么是多路复用?select 、poll、epoll的区别(待解决)

主要问题已经解决,这个问题等我整理好再发出来。

相关文章

  • Redis如何保证原子性

    众所周知,Redis是一个key-value存储系统,它有一些特性,例如基于内存、单线程、非阻塞、操作原子性、高性...

  • Redis事务

    1. 概述 Redis单条命令的执行可以保证原子性,但是如果需要保证多个命令执行的原子性,就需要使用到Redis的...

  • redis事务,乐观锁

    一.Redis事务介绍 Redis单条命令是保证原子性的(要么一起成功,要么一起失败),但是事务不保证原子性 Re...

  • redis常见题目

    redis 分布式锁常见问题 注意:redis的单个指令是原子性,但是多个指令就不能保证原子性了。这个时候如果要保...

  • 【Redis 系列】redis 学习六,redis 事务处理和监

    【Redis 系列】redis 学习六,redis 事务处理和监控事务 写在前面 我们学过的事务都是保证原子性的,...

  • 2021-08-06_lua脚本学习笔记

    20210806_lua脚本学习笔记 1概述 1.1为什么lua脚本具有原子性 Redis保证以原子方式执行脚本,...

  • 分布式限流 - 基于redis

    1,基于redis计数器 1)普通redis incr限流。不能保证原子性image.png2)lua脚本实现计数...

  • Redis实例发生故障,而Redis使用RDB机制,事务的原子性

    Redis实例发生故障,而Redis使用的RDB机制,事务的原子性还能否得到保证? 干货:[公粽号:堆栈futur...

  • redis操作原子性

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

  • Sychronized & Volatile

    Synchronized 保证了可见性 ,并且保证了原子性Volatile只保证了可见性,不能保证原子性,即只能保...

网友评论

    本文标题:Redis如何保证原子性

    本文链接:https://www.haomeiwen.com/subject/hgbdjftx.html