April 8, 2015
golang中的sync.WaitGroup
"\u003cp\u003eGolang的sync的包有一个并发原语WaitGroup,在日常开发中比较的有用。\u003c/p\u003e\n\u003cp\u003eWaitGroup的用途:它能够一直等到所有的goroutine执行完成,在其期间会会阻塞主线程的执行,直到所有的goroutine执行完成。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e这里要注意一下,在其中的多个goroutine 的执行结果是没有顺序的,调度器不能保证多个 goroutine 执行次序,且进程退出时不会等待它们结束。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eWaitGroup总共有三个方法:\u003ccode\u003eAdd(delta int),\u003c/code\u003e \u003ccode\u003eDone()\u003c/code\u003e 和 \u003ccode\u003eWait()\u003c/code\u003e。简单的说一下这三个方法的作用。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAdd: 添加或者减少等待goroutine的数量\u003c/p\u003e\n\u003cp\u003eDone: 相当于Add(-1)\u003c/p\u003e\n\u003cp\u003eWait: 执行阻塞,直到所有的WaitGroup数量变成0\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e举个例子\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n \u0026#34;fmt\u0026#34;\n \u0026#34;sync\u0026#34;\n \u0026#34;time\u0026#34;\n)\n\nfunc main() {\n var wg sync.WaitGroup\n\n for i := 0; i \u0026lt; 5; i++ { …\u003c/code\u003e\u003c/pre\u003e"
April 8, 2015
Golang语言的GOPATH与工作目录详解
"\u003cp\u003e这篇文章主要介绍了Go语言的GOPATH与工作目录详解,本文详细讲解了GOPATH设置、应用目录结构、编译应用等内容,需要的朋友可以参考下\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eGOPATH设置\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ego 命令依赖一个重要的环境变量:$GOPATH\u003c/p\u003e\n\u003cp\u003e(注:这个不是Go安装目录( \u003cstrong\u003eGOROOT\u003c/strong\u003e)。下面以笔者的工作目录为说明,请替换自己机器上的工作目录。)\u003c/p\u003e\n\u003cp\u003e在类似 Unix 环境大概这样设置:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eexport GOPATH=/home/apple/mygo\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e为了方便,应该把新建以上文件夹,并且把以上一行加入到 .bashrc 或者 .zshrc 或者自己的 sh 的配置文件中。\u003c/p\u003e\n\u003cp\u003eWindows 设置如下,新建一个环境变量名称叫做GOPATH:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eGOPATH=c:mygo\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eGOPATH允许多个目录,当有多个目录时,请注意分隔符,多个目录的时候Windows是分号,Linux系统是冒号,当有多个GOPATH时,默认会将go get的内容放在第一个目录下\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e以上 $GOPATH 目录约定有三个子目录:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.src 存放源代码(比如:.go .c .h .s等)\u003c/p\u003e\n\u003cp\u003e2.pkg 编译后生成的文件(比如:.a)\u003c/p\u003e\n\u003cp\u003e3.bin 编译后生成的可执行文件( …\u003c/p\u003e"
March 30, 2015
亿级用户下的新浪微博平台架构
"\u003ch2 id=\"序言\"\u003e序言\u003c/h2\u003e\n\u003cp\u003e新浪微博在2014年3月公布的月活跃用户(MAU)已经达到1.43亿,2014年新年第一分钟发送的微博达808298条,如此巨大的用户规模和业务量,需要高可用(HA)、高并发访问、低延时的强大后台系统支撑。\u003c/p\u003e\n\u003cp\u003e微博平台第一代架构为LAMP架构,数据库使用的是MyIsam,后台用的是php,缓存为Memcache。\u003c/p\u003e\n\u003cp\u003e随着应用规模的增长,衍生出的第二代架构对业务功能进行了模块化、服务化和组件化,后台系统从php替换为Java,逐渐形成SOA架构,在很长一段时间支撑了微博平台的业务发展。\u003c/p\u003e\n\u003cp\u003e在此基础上又经过长时间的重构、线上运行、思索与沉淀,平台形成了第三代架构体系。\u003c/p\u003e\n\u003cp\u003e我们先看一张微博的核心业务图(如下),是不是非常复杂?但这已经是一个简化的不能再简化的业务图了,第三代技术体系就是为了保障在微博核心业务上快速、高效、可靠地发布新产品新功能。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://static.codeceo.com/images/2015/01/55d1809347e311e238e6a71e3fb726c0.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003ch2 id=\"第三代技术体系\"\u003e第三代技术体系\u003c/h2\u003e\n\u003cp\u003e微博平台的第三代技术体系,使用正交分解法建立模型:在水平方向,采用典型的三级分层模型,即接口层、服务层与资源层;在垂直方向,进一步细分为业务架构、技术架构、监控平台与服务治理平台。下面是平台的整体架构图:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://static.codeceo.com/images/2015/01/405eb2f493a34eb937bfb32f08a34c12.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e如上图所示,正交分解法将整 …\u003c/p\u003e"
March 28, 2015
用PHP尝试RabbitMQ(amqp扩展)实现消息的发送和接收
"\u003cp\u003e上篇文章我们介绍了 \u003ca href=\"http://blog.haohtml.com/archives/15484\"\u003eamqp扩展在windows下的安装方法\u003c/a\u003e,这里我们看一下用法。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e消费者:接收消息\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e逻辑:\n创建连接–\u0026gt;创建channel–\u0026gt;创建交换机–\u0026gt;创建队列–\u0026gt;绑定交换机/队列/路由键–\u0026gt;接收消息\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;?php\n/*************************************\n* PHP amqp(RabbitMQ) Demo - consumer\n* Author: Linvo\n* Date: 2012/7/30\n*************************************/\n//配置信息\n$conn_args = array(\n \u0026#39;host\u0026#39; =\u0026gt; \u0026#39;192.168.1.93\u0026#39;,\n \u0026#39;port\u0026#39; =\u0026gt; \u0026#39;5672\u0026#39;,\n \u0026#39;login\u0026#39; =\u0026gt; \u0026#39;guest\u0026#39;,\n \u0026#39;password\u0026#39; =\u0026gt; \u0026#39;guest\u0026#39;, …\u003c/code\u003e\u003c/pre\u003e"
March 28, 2015
windows下安装rabbitmq的php扩展amqp(原创)
"\u003cp\u003e从php官方下载相应的版本 \u003ca href=\"http://pecl.php.net/package/amqp\"\u003ehttp://pecl.php.net/package/amqp\u003c/a\u003e,我这里使用的是1.4.0版本( \u003ca href=\"http://pecl.php.net/package/amqp/1.4.0/windows\"\u003ehttp://pecl.php.net/package/amqp/1.4.0/windows\u003c/a\u003e)\n根据当前使用的php版本选择相应的扩展dll,下载后是一个压缩包,里面有两个dll扩展(php_amqp.dll和rabbitmq.1.dll)。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2015/03/php_amqp1.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/php_amqp1.jpg\" alt=\"php_amqp\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e我的环境是64位的,php5.5.12.所以使用的是 \u003ca href=\"http://windows.php.net/downloads/pecl/releases/amqp/1.4.0/php_amqp-1.4.0-5.5-ts-vc11-x64.zip\"\u003ehttp://windows.php.net/downloads/pecl/releases/amqp/1.4.0/php_amqp-1.4.0-5.5-ts-vc11-x64.zip\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e1.将php_amqp.dll放在php的ext目录里,然后修改php.ini文件,在文件的最后面添加两行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[amqp\\]\nextension=php_amqp.dll\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e2.将rabbitmq.1.dll文件放在php的根目录里(也就是ext目录的父级目录),然后修改apache的httpd.con文件,文件尾部添加一行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eLoadFile …\u003c/code\u003e\u003c/pre\u003e"
March 6, 2015
关于Pull Request的十个建议(转)
"\u003cp\u003ePull Request是Bitbucket、GitHub等源代码托管系统为了方便开发者之间协作而提供的一个功能,它提供了一个用户友好的Web界面来帮助审查人员进行代码审查。开发人员可以通过GitHub发出Pull Requests要求请求他人将程序拉下来进行代码审查。一个好的Pull Request不仅仅只是代码的事情,还牵涉到代码审查者对代码的审查,所以开发者不仅要写出好的代码,还必须迎合审查者的审查工作,才能给使得自己贡献的代码顺利通过审查并合并到master分支。现对丹麦的程序员、软件架构师、独立顾问Mark Seemann在自己博客中发布的一篇题为《关于Pull Request的十个建议》的文章进行一个全面的整理,以供读者阅读和参考。具体内容如下:\u003c/p\u003e\n\u003ch2 id=\"1-进行较小的pull-request\"\u003e\u003cstrong\u003e1. 进行较小的Pull Request\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e一个小且集中的Pull Request会使得提交的代码更加容易通过审核。据Mark Seemann根据自己的经验透漏,对提交代码进行审查所花费的时间是随着代码大小呈指数增长,而非线性增长;Pull Request多大才合适与Pull Request做了什么相关,最好少于12个文件的改变。如 …\u003c/p\u003e"
December 6, 2014
Linux 下添加硬盘/新建分区(fdisk + mkfs.ext4 + mount)
"\u003cp\u003e此教程只供参考,未进行整理!\u003c/p\u003e\n\u003cp\u003e使用fdisk命令查看新添加的硬盘\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/12/QQ%E6%88%AA%E5%9B%BE20141206152231.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2014/12/QQ%E6%88%AA%E5%9B%BE20141206152231.jpg\" alt=\"QQ截图20141206152231\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e会看到类似这种页面信息的(说明:这里的图为已经有两个硬盘在使用了, 新添加的硬盘为sdc,尚未使用)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://www.fikker.com/bigcache2/help/linux-fdisk.html#e1\"\u003e第一步:添加硬盘/新建分区(fdisk)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.fikker.com/bigcache2/help/linux-fdisk.html#e2\"\u003e第二步:格式化分区(mkfs.ext4)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.fikker.com/bigcache2/help/linux-fdisk.html#e3\"\u003e第三步:加载分区(mount)\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e1、第一步:添加硬盘/新建分区(fdisk)\u003c/p\u003e\n\u003cp\u003ea、查看当前系统所有硬盘及分区情况:fdisk -l\u003c/p\u003e\n\u003cp\u003eb、在指定的硬盘(例:/dev/sdb)上创建分区:fdisk /dev/sdb , 根据提示进行下一步操作,如:查看帮助(h),新建分区(n),删除分区(d),查看分区情况(p)\u003c/p\u003e\n\u003cp\u003ec、分区成功后,写分区表并退出(w)\u003c/p\u003e\n\u003cp\u003e注:fdisk 支持硬盘最大尺寸为 2TB,更详细说明请参看 Linux 在线手册(man fdisk)或百度一下。\u003c/p\u003e\n\u003cp\u003e2、第二步:格式化分区(mkfs.ext4)\u003c/p\u003e\n\u003cp\u003e对新建分区(例:/dev/sdb1)进行格式化:mkfs.ext4 /dev/sdb1 。\u003c/p\u003e\n\u003cp\u003e3、第三步:加载分区\u003c/p\u003e\n\u003cp\u003ea、创建分区挂接目录,例:mkdir /disk-cache-1 和 mkdir /disk-cache-2 …\u003c/p\u003e"
September 14, 2014
使用git-flow来帮助管理git代码
"\u003cp\u003e对git不熟悉的我,经常把git提交搞得很乱,导致在master上有许多无用的commit,最终决定好好地看一下git的使用教程,却不小心发现了还有一个git-flow的工具可以帮助我管理好git项目的代码。\u003c/p\u003e\n\u003cp\u003egit-flow在ubuntu上使用比较简单。首先安装,可以通过apt-get来获取。命令如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esudo apt-get install git-flow\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果是在windows下,可以参考这篇文章进行安装: \u003ca href=\"http://my.eoe.cn/sunxun/archive/158.html\"\u003ehttp://my.eoe.cn/sunxun/archive/158.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e如果你的git已经装好,则方便多了,下载下面两个地址的文件,并解压出getopt.exe和libintl3.dll放到git的安装目录的bin目录下。 \u003ca href=\"http://sourceforge.net/projects/gnuwin32/files/util-linux/2.14.1/util-linux-ng-2.14.1-bin.zip/download\"\u003ehttp://sourceforge.net/projects/gnuwin32/files/util-linux/2.14.1/util-linux-ng-2.14.1-bin.zip/download …\u003c/a\u003e\u003c/p\u003e"
August 13, 2014
基本调优工具
"\u003cp\u003e一\nmpstat – 查看CPU使率信息\nvmstat – 报告虚存统计数据\niostat – 报告CPU状态和存储I/O统计数据\nnetstat – 报告络栈各项参数\nps – 系统上运的进程及其状态\ntop – 报告占CPU和内存最的进程\nsar – 报告系统活动状态\npidstat – 检查具体某个进程的CPU和内存情况\nperf – 综合性能检查具\u003c/p\u003e\n\u003cp\u003e二\nsysctl – 调整内核参数\nstrace – 跟踪进程的执\ndtrace – 综合跟踪具\nstap – 综合跟踪具\ntaskset – 绑定执CPU\npmap – 报告进程内存映射信息\nfree – 报告物理帧和虚拟帧信息\ndmesg – 系统启动信息,包括对各设备的监测\n/proc – 各项系统参数读写接\u003c/p\u003e\n\u003cp\u003e三\n/sys – 额外系统参数读写接\niotop – 类似top,但于检测I/O\nionice – 类似nice,但于设置进程的I/O优先级\nifcong – 监测与配置络接\ntcpdump – 捕获某个络接上的流量\nnicstat – 监测卡状态\nsysctl – 调整内核参数\nstrace – …\u003c/p\u003e"
August 2, 2014
RabbitMQ中的ack介绍
"\u003cp\u003eno_ack 的用途:确保 message 被 consumer “成功”处理了。这里“成功”的意思是,(在设置了 no_ack=false 的情况下)只要 consumer 手动应答了 Basic.Ack ,就算其“成功”处理了。\u003c/p\u003e\n\u003cp\u003e对于ack简单的说就是“消费者”先从queue里读取一条数据,然后去处理,等处理完了,再给queue一个 ack 回应,表示处理完了,这时queue就将这条数据从队列中删除。如果不回应给队列ack的话,则这条消息仍然存在在queue中(这个也属于一种应用场景)。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e在 no_ack=true 的情况下,RabbitMQ 认为 message 一旦被 deliver 出去了,就已被确认了,所以会立即将缓存中的 message 删除。所以在 consumer 异常时会导致消息丢失。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eno_ack=false\u003c/strong\u003e(此时为 \u003cstrong\u003e手动应答\u003c/strong\u003e)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e在这种情况下,要求 consumer 在处理完接收到的 Basic.Deliver + Content-Header + Content-Body 之后才回复 Ack 。而这个 Ack 是 AMQP 协议中的 Basic.Ack …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
August 1, 2014
认识 RabbitMQ 消息队列
"\u003ch1 id=\"rabbitmq架构图\"\u003eRabbitMQ架构图\u003c/h1\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/08/rabbitmq-struct.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rabbitmq-struct.png\" alt=\"rabbitmq-struct\"\u003e\u003c/a\u003e rabbitmq 架构图\u003c/p\u003e\n\u003ch1 id=\"基本概念\"\u003e基本\u003cstrong\u003e概念\u003c/strong\u003e\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003eBroker\u003c/code\u003e:简单来说就是消息队列服务器实体。\n\u003ccode\u003eExchange\u003c/code\u003e:消息交换机,它指定消息按什么规则,路由到哪个队列。\n\u003ccode\u003eQueue\u003c/code\u003e:消息队列载体,每个消息都会被投入到一个或多个队列。\n\u003ccode\u003eBinding\u003c/code\u003e:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。\n\u003ccode\u003eRouting Key\u003c/code\u003e:路由关键字,exchange根据这个关键字进行消息投递。\n\u003ccode\u003evhost\u003c/code\u003e:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。\n\u003ccode\u003eproducer\u003c/code\u003e:消息生产者,就是投递消息的程序。\n\u003ccode\u003econsumer\u003c/code\u003e:消息消费者,就是接受消息的程序。\n\u003ccode\u003echannel\u003c/code\u003e:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。\u003c/p\u003e\n\u003ch1 id=\"操作流程\"\u003e操作流程\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e(1)客户端连接到消息队列服务器,打开一个channel。\u003c/li\u003e\n\u003cli\u003e(2)客户端声明一个exchange,并设置相关属性。\u003c/li\u003e\n\u003cli\u003e(3)客户端声明一个queue,并设置相关属性。\u003c/li\u003e\n\u003cli\u003e(4)客户端使用routing key,在exchange和queue之间建立好绑定关系。\u003c/li\u003e\n\u003cli\u003e(5)客户 …\u003c/li\u003e\u003c/ul\u003e"
August 1, 2014
将rabbitmq 里的消息持久化
"\u003ch2 id=\"消息持久设置\"\u003e消息持久设置:\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e将交换机置为可持久;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e将通道置为可持久\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e消息发送时设置可持久。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e当我们“生产”了一条可持久化的消息,尝试中断MQ服务,启动消费者获取消息,消息依然能够恢复。相反,则抛出异常。\u003c/p\u003e\n\u003cp\u003e上面三条必须全部设置,不然消息将无法持久化。\u003c/p\u003e"
August 1, 2014
rabbitmq 添加远程访问功能
"\u003cp\u003e刚刚安装过的rabbitmq 消息队列,并启用了插件管理功能,3.3.1版中,处于安全的考虑,guest这个默认的用户只能通过http://localhost:15672 来登录,其他的IP无法直接使用这个账号。 这对于服务器上没有安装桌面的情况是无法管理维护的,除非通过在前面添加一层代理向外提供服务,这个又有些麻烦了,这里通过配置文件来实现这个功能。\u003c/p\u003e\n\u003cp\u003e只要编辑 /etc/rabbitmq/rabbitmq.config 文件,添加以下配置就可以了。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[\n{rabbit, [{tcp_listeners, [5672]}, {loopback_users, [“asdf”]}]}\n].\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e现在添加了一个新授权用户asdf,可以通过外网使用这个用户名和密码访问.(记得要先用命令添加这个命令才行,#rabbitmqctl add_user asdf pwd123456)我是通过在管理平台里直接添加的用户和密码的,我的测试环境装有桌面的。\n参考文档: \u003ca href=\"http://www.rabbitmq.com/access-control.html\"\u003ehttp://www.rabbitmq.com/access-control.html\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# rabbitmqctl add_user …\u003c/code\u003e\u003c/pre\u003e"
August 1, 2014
【架构】关于RabbitMQ
"\u003ch1 id=\"1什么是rabbitmq\"\u003e1 什么是RabbitMQ?\u003c/h1\u003e\n\u003cp\u003eRabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然:\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/08/rabbitmq_decouping.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rabbitmq_decouping.png\" alt=\"rabbitmq_decouping\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e单向解耦\n双向解耦(如:RPC)\u003c/p\u003e\n\u003cp\u003e例如一个日志系统,很容易使用RabbitMQ简化工作量,一个Consumer可以进行消息的正常处理,另一个Consumer负责对消息进行日志记录,只要在程序中指定两个Consumer所监听的queue以相同的方式绑定到同一个exchange即可,剩下的消息分发工作由RabbitMQ完成。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/08/rabbitmq_producer_consumer.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rabbitmq_producer_consumer.png\" alt=\"rabbitmq_producer_consumer\"\u003e\u003c/a\u003e\n使用RabbitMQ server需要:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eErLang语言包;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRabbitMQ安装包;\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eRabbitMQ同时提供了java的客户端(一个jar包)。\u003c/p\u003e\n\u003ch1 id=\"2概念和特性\"\u003e2 概念和特性\u003c/h1\u003e\n\u003ch2 id=\"21交换机exchange\"\u003e2.1 交换机(exchange):\u003c/h2\u003e\n\u003cp\u003e1. 接收消息,转发消息到绑定的队列。四种类型:direct, topic, headers and fanout\u003c/p\u003e\n\u003cp\u003edirect:转发消息 …\u003c/p\u003e"
July 28, 2014
mysql中数据类型的长度解释
"\u003ch2 id=\"112-数值类型\"\u003e11.2. 数值类型\u003c/h2\u003e\n\u003cp\u003eMySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。\u003c/p\u003e\n\u003cp\u003eBIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。\u003c/p\u003e\n\u003cp\u003e作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。\u003c/p\u003e\n\u003ctable\u003e\n \u003cthead\u003e\n \u003ctr\u003e\n \u003cth\u003e\u003cstrong\u003e类型\u003c/strong\u003e\u003c/th\u003e\n \u003cth\u003e\u003cstrong\u003e字节\u003c/strong\u003e\u003c/th\u003e\n \u003cth\u003e\u003cstrong\u003e最小值\u003c/strong\u003e\u003c/th\u003e\n \u003cth\u003e\u003cstrong\u003e最大值\u003c/strong\u003e\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\u003e\u003c/td\u003e\n \u003ctd\u003e\u003c/td\u003e\n \u003ctd\u003e\u003cstrong\u003e(带符号的/无符号的)\u003c/strong\u003e\u003c/td\u003e\n \u003ctd\u003e\u003cstrong\u003e(带符号的/无符号的)\u003c/strong\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003eTINYINT\u003c/td\u003e\n \u003ctd\u003e1\u003c/td\u003e\n \u003ctd\u003e-128\u003c/td\u003e\n \u003ctd\u003e127 …\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e"