这次我最快

飞的起来
应该飞的起来
碧海蓝天
只等风的到来


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

Redis整体架构

发表于 2019-12-15 | 分类于 redis | 阅读次数:

Redis简介

简介概览

作者:

antirez.png

Redis 由意大利人 Salvatore Sanfilippo(网名 Antirez) 开发,上图是他的个人照片。Antirez 不仅帅的不像实力派,也非常有趣。Antirez 今年已经四十岁了,依旧在孜孜不倦地写代码,为 Redis 的开源事业持续贡献力量。

Redis是一个开放源代码(BSD许可)内存中的数据结构存储,用作数据库、缓存和消息代理。它支持字符串、哈希、列表、集合、带范围查询的排序集合、位图、超日志和流的地理空间索引等数据结构Redis基本数据结构&内部编码 。Redis具有内置的复制、lua脚本、lru回收、事务和不同级别的磁盘上持久性,并通过Redis Sentinel和Redis集群的自动分区提供高可用性。

源码github:https://github.com/antirez/redis

Redis为什么这么快?

正常情况下,Redis执行命令的速度非常快,官方给出的数字是读写性能可以达到10万/秒,当然这也取决于机器的性能,但这里先不讨论机器性能上的差异,只分析一下是什么造就了Redis除此之快的速度,可以大致归纳为以下五点:

  1. Redis是用C语言实现的,一般来说C语言实现的程序“距离”操作系统更近,执行速度相对会更快。
  2. 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些时间复杂度为 O(n) 级别的指令,一定要谨慎使用,一不小心就可能会导致 Redis 卡顿。
  3. 数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
  4. 使用多路I/O复用模型,非阻塞IO,Redis 单线程处理大量的并发客户端连接的模型。 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
  5. 作者对于Redis源代码可以说是精打细磨,曾经有人评价Redis是少有的集性能和优雅于一身的开源代码。
  6. Redis为什么单线程?为什么Redis单线程
阅读全文 »

学习方法之技术学习

发表于 2019-11-30 | 分类于 方法论 | 阅读次数:

这个技术出现的背景、初衷和要达到什么样的目标或是要解决什么样的问题**。这个问题非常关键,也就是说,你在学习一个技术的时候,需要知道这个技术的成因和目标,也就是这个技术的灵魂。如果不知道这些的话,那么你会看不懂这个技术的一些设计理念。

这个技术的优势和劣势分别是什么,或者说,这个技术的 trade-off 是什么。任何技术都有其好坏,在解决一个问题的时候,也会带来新的问题。另外,一般来说,任何设计都有 trade-off(要什么和不要什么),所以,你要清楚这个技术的优势和劣势,以及带来的挑战。

这个技术适用的场景。任何技术都有其适用的场景,离开了这个场景,这个技术可能会有很多槽点,所以学习技术不但要知道这个技术是什么,还要知道其适用的场景。没有任何一个技术是普适的。注意,所谓场景一般分别两个,一个是业务场景,一个是技术场景。

技术的组成部分和关键点。这是技术的核心思想和核心组件了,也是这个技术的灵魂所在了。学习技术的核心部分是快速掌握的关键。

技术的底层原理和关键实现。任何一个技术都有其底层的关键基础技术,这些关键技术很有可能也是其它技术的关键基础技术。所以,学习这些关键的基础底层技术,可以让你未来很快地掌握其它技术。可以参看我在 CoolShell 上写的 Docker 底层技术那一系列文章。

已有的实现和它之间的对比。一般来说,任何一个技术都会有不同的实现,不同的实现都会有不同的侧重。学习不同的实现,可以让你得到不同的想法和思路,对于开阔思维,深入细节是非常重要的。

学习方法

发表于 2019-11-20 | 分类于 方法论 | 阅读次数:

主动学&被动学

主动学习和被动学习1946 年,美国学者埃德加·戴尔(Edgar Dale)提出了「学习金字塔」(Cone of Learning)的理论。之后,美国缅因州国家训练实验室也做了相同的实验,并发布了「学习金字塔」报告。

2020050415885903564000.png

人的学习分为「被动学习」和「主动学习」两个层次。

  • 被动学习:如听讲、阅读、视听、演示,学习内容的平均留存率为 5%、10%、20% 和 30%。
  • 主动学习:如通过讨论、实践、教授给他人,会将原来被动学习的内容留存率从 5% 提升到 50%、75% 和 90%。

这个模型很好地展示了不同学习深度和层次之间的对比。我们可以看到,你听别人讲,或是自己看书,或是让别人演示给你,这些都不能让你真正获得学习能力,因为你是在被别人灌输,在听别人说。只有你开始自己思考,开始自己总结和归纳,开始找人交流讨论,开始践行,并开始对外输出,你才会掌握到真正的学习能力。

知识地图

从知识树的主干开始做广度或是深度遍历,于是我就得到了一整棵的知识树。这种“顺藤摸瓜”的记忆方式让我记住了很多知识。最重要的是,当出现一些我不知道的知识点时,我就会往这棵知识树上

挂,而这样一来,也使得我的学习更为系统和全面。这种画知识图的方式可以让你从一个技术最重要最主干的地方出发开始遍历所有的技术细节,也就是画地图的方式。如果你不想在知识的海洋中迷路,你需要有一份地图,所以,学习并不是为了要记忆那些知识点,而是为了要找到一个知识的地图,你在这个地图上能通过关键路径找到你想要的答案。

转 cpu 寄存器 内核态 用户态

发表于 2019-10-15 | 分类于 计算机基础 | 阅读次数:

cpu:相当于计算机的大脑负责运算和发送命令;

寄存器:寄存器是cpu当中的一个有限存储部件,cpu从内存调用数据时,寄存器会将从内存调用的数据进行更新在寄存器中以一个字或变量进行存储。

​ 寄存器总共分为四种:

​ 1.通用寄存器:用来保存变量与临时结果

​ 2.程序寄存器:保存了将要取下的一条指令的内存地址

​ 3.堆栈指针:它指向内存当前栈的顶端。该栈包含已经进入但是还没有退出的每个过程中的一个框架。在一个过程的堆栈框架中保存了有关输入参数,局部变量以及那写没有及时保存在寄存器中的临时变量。

​ 4.程序状态寄存器:这个寄存器包含了条码位(由比较指令设置),cpu优先级,模式(用户态或内核态),以及各种其他控制位。用户通常读入整个psw,但是只对其少量的字段写入。在系统调用和I/O中,psw非常重要。

内核态与用户态的切换:

​ 内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序

​ 用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取

阅读全文 »

转 Reactor模式

发表于 2019-10-15 | 阅读次数:

https://www.cnblogs.com/crazymakercircle/p/9833847.html

  1. 为什么是Reactor模式
  2. Reactor模式简介
  3. 多线程IO的致命缺陷
  4. 单线程Reactor模型
    4.1. 什么是单线程Reactor呢?
    4.2. 单线程Reactor的参考代码
    4.3. 单线程模式的缺点:
  5. 多线程的Reactor
    5.1. 基于线程池的改进
    5.2. 改进后的完整示意图
    5.3. 多线程Reactor的参考代码
  6. Reactor持续改进
  7. Reactor编程的优点和缺点
    7.1. 优点
    7.2. 缺点

转 IO模型解惑

发表于 2019-10-15 | 分类于 计算机基础 | 阅读次数:

IO模型解惑

本文基于《构建高性能网站》整理。之前对于各种IO模型的理解不是很清晰,发现这本书里整理得比较好,这里记录下相关要点。

IO操作根据设备类型一般分为内存IO,网络IO,和磁盘IO。其中内存IO的速度大大快于后两者,计算机的性能瓶颈一般不在于内存IO. 尽管网络IO可通过购买独享带宽和高速网卡来提升速度,可以使用RAID磁盘阵列来提升磁盘IO的速度,但是由于IO操作都是由系统内核调用来完成,而系统调用是通过cpu来调度的,而cpu的速度远远快于IO操作,导致会浪费cpu的宝贵时间来等待慢速的IO操作。为了让cpu和慢速的IO设备更好的协调工作,减少CPU在IO调用上的消耗,逐渐发展出各种IO模型。

阅读全文 »

序列化

发表于 2019-08-03 | 分类于 java | 阅读次数:

一、什么是序列化

简单来说,序列化就是将对象转换为字节流,反序列化就是将字节流转化为对象。

Java的对象序列化将那些实现了Serializable接口的对象转换为一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行;这意味着序列化机制能自动弥补不同操作系统之间的差异。也也就是说,可以在运行Windows系统的计算机上创建一个对象,将其序列化,通过网络将它发送个一台运行Unix系统的计算机,然后在那里准确地重新组装,而却不必担心数据在不同机器上的表示会不同,也不必关心字节的顺序或者其他的任何细节。

对象的序列化可以利用它实现轻量级持久化。“持久性”意味着一个对象的生存周期并不取决于程序是否正在执行;它可以生存于程序的调用之间。通过将一个序列化对象写入磁盘,然后在重新调用程序时恢复该对象,就能够实现持久性的效果。之前写到的Session的持久化策略就是使用了序列化的方式进行了实现(保持对象的状态)。

阅读全文 »

最简单有效的秒杀限流

发表于 2019-06-02 | 分类于 电商 | 阅读次数:

情景

整点秒杀、限时特卖等活动会吸引大量用户在同一时间点、时间段访问请求系统,从而产生大的并发量,如果没有合理处理的话会出现商品超卖页面访问速度较慢更严重的可能出现系统宕机其他服务也无法正常使用。

本文主要处理服务端使用redis进行限流

涉及到的技术点主要有:
redis分布式锁 redis常用命令

主要逻辑方案:

  1. 预热库存数据

  2. 限流(允许进入两倍库存的访问量)

  3. 10秒失效一次redis库存数据 重新获取(处理因为进入下单页没有提交订单 而导致的库存剩余)

    阅读全文 »

svn分支协同开发流程

发表于 2019-06-02 | 分类于 svn | 阅读次数:

开发场景

面向trunk开发

比如4人开发团队 每2人负责一个功能模块,两个功能模块在同一个项目中,此时如果4个人都是在主分支trunk上进行开发 那么必须等两个功能模块全部ok 才能上线 (操作比较简单 不进行赘述)

缺点:

  • 开发耦合性过大
  • 项目代码不易管理
阅读全文 »

redis分布式锁

发表于 2019-06-02 | 分类于 redis | 阅读次数:

分布式锁的理解

所谓分布式锁 说到底就是多个进程或者线程去获取同一个资源 但是只有一个会获取成功 实现了这样的功能就是分布式锁

分布式锁的redis实现

setnx命令

Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。

实际操作如下:

阅读全文 »
123…6
lemon

lemon

坚信我们为爱

57 日志
19 分类
50 标签
GitHub 掘金
友链
  • 游乐鱼的博客
  • 吖吖邦的博客
© 2020 lemon