IdiotSky


  • Home

  • Categories

  • About

  • Archives

  • Tags

  • Books

  • Search

Java NIO浅析

Posted on 14 May 17 | In java

NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。

那么NIO的本质是什么样的呢?它是怎样与事件模型结合来解放线程、提高系统吞吐的呢?

本文会从传统的阻塞I/O和线程池模型面临的问题讲起,然后对比几种常见I/O模型,一步步分析NIO怎么利用事件模型处理I/O,解决线程池瓶颈处理海量连接,包括利用面向事件的方式编写服务端/客户端程序。最后延展到一些高级主题,如Reactor与Proactor模型的对比、Selector的唤醒、Buffer的选择等。

注:本文的代码都是伪代码,主要是为了示意,不可用于生产环境。

Read more »

redis基础、高级特性与性能调优

Posted on 09 Apr 17 | In redis

本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍。之后概览Redis提供的高级能力,并在部署、维护、性能调优等多个方面进行更深入的介绍和指导。
本文适合使用Redis的普通开发人员,以及对Redis进行选型、架构设计和性能调优的架构设计人员。

概述

Redis是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库、缓存服务或消息服务使用。
Redis支持多种数据结构,包括字符串、哈希表、链表、集合、有序集合、位图、Hyperloglogs等。
Redis具备LRU淘汰、事务实现、以及不同级别的硬盘持久化等能力,并且支持副本集和通过Redis Sentinel实现的高可用方案,同时还支持通过Redis Cluster实现的数据自动分片能力。

Redis的主要功能都基于单线程模型实现,也就是说Redis使用一个线程来服务所有的客户端请求,同时Redis采用了非阻塞式IO,并精细地优化各种命令的算法时间复杂度,这些信息意味着:

  • Redis是线程安全的(因为只有一个线程),其所有操作都是原子的,不会因并发产生数据异常
  • Redis的速度非常快(因为使用非阻塞式IO,且大部分命令的算法时间复杂度都是O(1))
  • 使用高耗时的Redis命令是很危险的,会占用唯一的一个线程的大量处理时间,导致所有的请求都被拖慢。(例如时间复杂度为O(N)的KEYS命令,严格禁止在生产环境中使用)
Read more »

Dockerfile 指令 VOLUME 介绍

Posted on 06 Apr 17 | In docker

在介绍VOLUME指令之前,我们来看下如下场景需求:

  1. 容器是基于镜像创建的,最后的容器文件系统包括镜像的只读层+可写层,容器中的进程操作的数据持久化都是保存在容器的可写层上。一旦容器删除后,这些数据就没了,除非我们人工备份下来(或者基于容器创建新的镜像)。能否可以让容器进程持久化的数据保存在主机上呢?这样即使容器删除了,数据还在。
  2. 当我们在开发一个web应用时,开发环境是在主机本地,但运行测试环境是放在docker容器上。
    这样的话,我在主机上修改文件(如html,js等)后,需要再同步到容器中。这显然比较麻烦。
  3. 多个容器运行一组相关联的服务,如果他们要共享一些数据怎么办?
    对于这些问题,我们当然能想到各种解决方案。而docker本身提供了一种机制,可以将主机上的某个目录与容器的某个目录(称为挂载点、或者叫卷)关联起来,容器上的挂载点下的内容就是主机的这个目录下的内容,这类似linux系统下mount的机制。 这样的话,我们修改主机上该目录的内容时,不需要同步容器,对容器来说是立即生效的。 挂载点可以让多个容器共享。

下面我们来介绍具体的机制。

Read more »

一张图理解docker的命令

Posted on 06 Mar 17 | In docker


Read more »

linux命令之systemd

Posted on 31 Dec 16 | In linux命令

systemd只是一组命令的名称,主要常用的是systemctl和journalctl。

Unit

Unit是systemd管理的最小单元,所以必须要先讲这个。

Unit一共分成12种。

  • Service unit:系统服务
  • Target unit:多个 Unit 构成的一个组
  • Device Unit:硬件设备
  • Mount Unit:文件系统的挂载点
  • Automount Unit:自动挂载点
  • Path Unit:文件或路径
  • Scope Unit:不是由 Systemd 启动的外部进程
  • Slice Unit:进程组
  • Snapshot Unit:Systemd 快照,可以切回某个快照
  • Socket Unit:进程间通信的 socket
  • Swap Unit:swap 文件
  • Timer Unit:定时器
Read more »

linux命令-ar

Posted on 29 Dec 16 | In linux命令

备忘,mark 👿

用途说明

创建静态库.a文件。用C/C++开发程序时经常用到,但我很少单独在命令行中使用ar命令,一般写在makefile中,有时也会在shell脚 本中用到。

常用参数

格式:ar rcs libxxx.a xx1.o xx2.o
参数r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。【1】
参数c:创建一个库。不管库是否存在,都将创建。
参数s:创建目标文件索引,这在创建较大的库时能加快时间。(补充:如果不需要创建索引,可改成大写S参数;如果.a文件缺少索引,可以使用ranlib命令添加)

格式:ar t libxxx.a
显示库文件中有哪些目标文件,只显示名称。

格式:ar tv libxxx.a
显示库文件中有哪些目标文件,显示文件名、时间、大小等详细信息。

格式:nm -s libxxx.a
显示库文件中的索引表。

格式:ranlib libxxx.a
为库文件创建索引表。

创建并使用静态库

第一步:编辑源文件,test.h test.c main.c。其中main.c文件中包含main函数,作为程序入口;test.c中包含main函数中需要用到的函数。
vi test.h test.c main.c
第二步:将test.c编译成目标文件。
gcc -c test.c
如果test.c无误,就会得到test.o这个目标文件。
第三步:由.o文件创建静态库。
ar rcs libtest.a test.o
第四步:在程序中使用静态库。
gcc -o main main.c -L. -ltest
因为是静态编译,生成的执行文件可以独立于.a文件运行。
第五步:执行。
./main

创建并使用动态库

第一步:编辑源文件,test.h test.c main.c。其中main.c文件中包含main函数,作为程序入口;test.c中包含main函数中需要用到的函数。
vi test.h test.c main.c
第二步:将test.c编译成目标文件。
gcc -c test.c
前面两步与创建静态库一致。
第三步:由.o文件创建动态库文件。
gcc -shared -fPIC -o libtest.so test.o
第四步:在程序中使用动态库。
gcc -o main main.c -L. -ltest
当静态库和动态库同名时, gcc命令将优先使用动态库。
第五步:执行。
LD_LIBRARY_PATH=. ./main

linux命令-gdb

Posted on 28 Dec 16 | In linux命令

备忘,mark 👿

GDB 基础知识

GDB 相关概念

GDB, 是 The GNU Project Debugger 的缩写, 是 Linux 下功能全面的调试工具。GDB 支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。在 Linux 环境软件开发中,GDB 是主要的调试工具,用来调试 C 和 C++ 程序。

GDB 的进入和退出

如果要调试程序,需要在 gcc 编译可执行程序时加上 -g 参数,首先我们编译 bugging.c 程序,生成可执行文件:

1
gcc -g -o bugging bugging.c

输入 gdb bugging 进入 gdb 调试 bugging 程序的界面:

1
gdb bugging

在 gdb 命令行界面,输入run 执行待调试程序:

1
(gdb) run

Read more »

linux命令-gcc

Posted on 27 Dec 16 | In linux命令

备忘,mark 👿

gcc命令使用GNU推出的基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点。现在很多程序员都应用GCC,怎样才能更好的应用GCC。目前,GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序,可根据需要选择安装支持的语言。

语法

1
gcc(选项)(参数)

选项

1
2
3
4
5
-o:指定生成的输出文件;
-E:仅执行编译预处理;
-S:将C代码转换为汇编代码;
-wall:显示警告信息;
-c:仅执行编译操作,不进行连接操作。

参数

C源文件:指定C语言源代码文件。

Read more »

SELECT * ...... FOR UPDATE 锁机制

Posted on 19 Dec 16 | In mysql

由于InnoDB预设是Row-Level Lock,InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

Read more »

linux命令-tcpdump

Posted on 21 Nov 16 | In linux命令

tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上。

不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才会停止抓包。

例如:

1
$ tcpdump -nn -i eth0 icmp

下面是详细的tcpdump用法。

tcpdump选项

它的命令格式为:

tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ]
[ -s snaplen ] [ -w file ] [ expression ]

Read more »
1…8910…17
ejunjsh

ejunjsh

code freak

164 posts
25 categories
154 tags
RSS
GitHub Weibo Email FB Page
0%
© 2014 — 2019 ejunjsh
Powered by Hexo
|
Theme — NexT.Gemini