随笔分类 - 技术相关
摘要:1.减少服务层的调用次数,例如for循环的调用改为批量接口;2.实现客户端访问一台服务器多个不同端口的服务实例,分拆主要次要业务服务器端协议;3.原来只有请求计数器,现增加服务响应计数器;4.减少日志量,总耗时步骤;5.完善日志分析工具;6.分析优化sql慢查询;
阅读全文
摘要:在数据库的处理过程中常会遇到一些并发的情况,因而会导致这样或那样的问题。而数据库的事务隔离级别就是用来应对这些问题,针对不同的场景使数据的并发操作和读取满足一定规则。通常我们会遇到以下几种常见问题数据丢失(Lost Updates)数据丢失发生在两个进程同时操作同一条数据时,比如Process A 更新内容为“icecream”,Process B更新内容为“milk”,再次查询的时候,Process A更新的数据就可能丢失了。因为两个进程操作的是同一条数据。脏读(Dirty Reads)脏读发生在读取数据时,读取的数据不是正确的。比如Process A做了一次update操作,更新了价格为1
阅读全文
摘要:按请求来源渠道拆分不同的请求来源,请求量必然不太一致。不同来源的请求被分发到各自的一组机器上,起到相互隔离的作用,服务出现问题时,只影响特定来源请求;某个来源渠道请求量上涨或者有问题时,所影响的范围也被限制。按不同地区来拆分思路同按请求来源渠道拆分。按不同号段来拆分微信的部署是按每千万的用户划分到一个set来承载。每个set是一套完整的服务(包括接入服务、逻辑服务、存储等),大概2、3百台机器(2012年的数据),不仅利于「防火隔离」,更利于扩容。按不同运营商来拆分按照不同的运营商来拆分部署时,不仅起到「防火隔离」的作用,也减少由于跨网络请求导致速度慢的情况,在天朝,都知道各运营商互联互通始终
阅读全文
摘要:使用.NET的BlockingCollection来包装一个ConcurrentQueue来实现golang的channel。代码如下:public class Channel{ private BlockingCollection _buffer; public Channel() : this(1) { } public Channel(int size) { _buffer = new BlockingCollection(new ConcurrentQueue(), size); } public bool Send(T t) {...
阅读全文
摘要:1.你无法断定程序会在什么地方耗费运行时间。瓶颈经常出现在想不到的地方,所以别急于胡乱找个地方改代码,除非你已经证实那儿就是瓶颈所在。2.估量。在你没对代码进行估量,特别是没找到最耗时的那部分之前,别去优化速度。3.花哨的算法在n很小时通常很慢,而n通常很小。花哨算法的常数复杂度很大。除非你确定n总是很大,否则不要用花哨算法(即使n很大,也优先考虑原则2)。比如,解决常见问题时,最简单的树——二叉树(binarytree),总是比那些复杂的树(AVL树,伸展树(splaytree)和红黑树、B-树(B-tree),多叉树(trie))来的高校。4.花哨的算法比简单算法更容易出bug、更难实现。
阅读全文
摘要:来自《CLR via C# 3rd Edition》总结只管理内存,非托管资源,如文件句柄,GDI资源,数据库连接等还需要用户去管理循环引用,网状结构等的实现会变得简单。GC的标志也压缩算法能有效的检测这些关系,并将不再被引用的网状结构整体删除。GC通过从程序的根对象开始遍历来检测一个对象是...
阅读全文
摘要:在使用和阅读lucene源代码时,发现为了提高查找的性能,Lucene在很多地方采取的跳跃表的数据结构。跳跃表(Skip List)是如图的一种数据结构,有以下几个基本特征:元素是按顺序排列的,在Lucene中,或是按字典顺序排列,或是按从小到大顺序排列。跳跃是有间隔的(Interval),也即每次跳跃的元素数,间隔是事先配置好的,如图跳跃表的间隔为3。跳跃表是由层次的(level),每一层的每隔指定间隔的元素构成上一层,如图跳跃表共有2层。看了redisbook中也有关于该数据结构的详细介绍http://www.redisbook.com/en/latest/internal-datastr
阅读全文
摘要:1. Redis 简介•Redis是一款开源的、高性能的键-值存储(key-value store)。它常被称作是一款数据结构服务器(data structure server)。Redis的键值可以包括字符串(strings)类型,同时它还包括哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等数据类型。 对于这些数据类型,你可以执行原子操作。例如:对字符串进行附加操作(append);递增哈希中的值;向列表中增加元素;计算集合的交集、并集与差集等。•为了获得优异的性能,Redis采用了内存中(in-memory)数据集(dataset)的方式。
阅读全文
摘要:默认的memcached客户端对非ANSI的key存取时会有问题,有2种方式解决:1 在get和set前将缓存的key进行UrlEncode2 修改memcached.config文件 增加加粗字体部分,客户端在get,和set钱,如果不指定keyTransformer,会把你的key字符串用Ansi Encode传递给memcached服务器,这时中文处理会有问题,如果指定了keyTransformer,如:SHA1KeyTransformer,就先计算一个sha1唯一值作为key,传递给memcached服务器,这样就可以避免中文Key的问题了。
阅读全文
摘要:rails 中的MVC 和asp.net的请求流程类似,从MVC的视角来仔细的看一下其中某些特定的部分。我们会分析在浏览器中做一次点击的内在过程,这里通过访问用户索引页面做演示,来了解一下 MVC。浏览器向 /users 发起一个请求;Rails 的路由将 /user 分配到 Users 控制器的 index 动作;index 动作向 User 模型获取所有的用户(User.all);User 模型从数据库中将所有的用户读取出来;User 模型将所有的用户返回给控制器;控制器将获得的所有用户数据赋予 @users 变量,然后传递给 index 的视图;视图使用内嵌 Ruby 代码的模板渲染成
阅读全文
摘要:LRU是Cache服务中最常用的淘汰算法,经典的实现为Hash+双链表,可以保证数据访问和淘汰的期望复杂度为O(1).但是该算法有两个问题:双链表指针开销大;多线程不友好,即使是读也要加锁来修改链表的指针,将最近访问的节点提到队首.Redis的这个近似LRU算法非常有启发意义。Redis最主要的做法就是:不维护双链表,只是每个Object维护一个相对的时间,淘汰时,随机取3个或者更多的,找到最老的进行淘汰.不量节省了双链表的指针开销,读时还不用加锁.虽不能保证一定淘汰最老的,但倾向于淘汰偏老的对象, 经过我们线上的实测:和标准的LRU对比,命中率的损失非常小, 效果不错。http://oldb
阅读全文
摘要:在stackoverflow网站上搜索到的结果http://stackoverflow.com/questions/1563191/c-sharp-cleanest-way-to-write-retry-logic
阅读全文
摘要:总的来说,MySQL Server可以看成是二层架构,第一层我们通常叫做 SQL Layer,在 MySQL 数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,sql 解析,执行计划优化,query cache 的处理等等;第二层就是存储引擎层,我们通常叫做 StorageEngine Layer,也就是底层数据存取操作实现部分,由多种存储引擎共同组成。所以,可以用如下一张最简单的架构示意图来表示 MySQL Server的基本架构。该图载自新浪微博。实际上每一层中都含有各自的很多小模块,尤其是第一层 SQL Layer,结构相当复杂的。下面我们就分别针对 SQL Laye
阅读全文
摘要:在使用MonogDB构建真实的应用程序并用于生产环境之前,应该注意一些局限,它们大多数都是由于MongoDB使用内存映射文件(memory-mapped file)而 导致的。首先,MongoDB通常应该运行于64位的机器上。32位系统只能对4 GB内存做寻址。要知道,一般半数的内存都会被操作系统和程序进程占用,就只剩2 GB内存能用来映射数据文件。因此,如果运行在32位的服务器上,还定义了适当数量的索引,那么数据文件只能被限制在1.5 GB。大多数生产环境系统的要求都高很多,因此一个64位的系统是必需的。使用虚拟内存映射的第二个后果是,数据占用的内存会自动按需分配。这样一来,想在共享环境中运
阅读全文
摘要:如何设计memcache的部署结构,假设业务需要100G的容量,通过一致性Hash部署?虽然可以解决单点问题,但是如何解决Multi-Get的性 能问题,以及线性扩容的问题?通过部署多层memcache结构,即避免了单点问题,同时又减少了Multi-Get需要访问服务器的数量从而提升性能, 同时还可以解决线性扩容问题。依据先稳定后优化的理念,在架构设计层面防止单点故障的发生: 1. mc作为mysql故障时的备份,降低了故障的影响。 2. memcache层采用多套数据冗余, master/slave + L1 list cache。 3. 多机房容灾, 一个机房出现故障后流量可以快速切换到另
阅读全文
摘要:XML中的特殊字符 > 和 < 这类字符是XML标记字符,在XML中有特殊的含义。当在 SQL 查询(或 XPath 查询)中指定这些字符时,必须对它们进行适当的编码(也称为实体编码)。下表列出了这些特殊字符并描述了它们的含义。有关更多信息,请参见XML1.0 规范 中的XML1.0 规范。特殊字符 特殊含义 实体编码>开始标记><结束标记<"引号"'撇号'为了不使用转义字符,保存的时候需要使用 <![CDATA[。。。。 ]]> 例如:<?xml version=&qu
阅读全文
摘要:hash算法实现代码如下:继承自c#的HashAlgorithm类View Code public class FNV1a : HashAlgorithm { private const uint Prime = 16777619; private const uint Offset = 2166136261; protected uint CurrentHashValue; public FNV1a() { this.HashSizeValue = 32; this....
阅读全文
摘要:一、基础设施服务AWS共提供14类28项服务,大致可分为计算、存储、应用架构、特定应用、管理这五大类:1、计算类服务EC2:虚拟机实例,有标准型、大内存、高运算能力、带10G网络的HPC、GPU等多种类型、Win/Linux OS、主流WEB、应用服务器、数据库。可自动按需伸缩。本机没有持久化的存储Elastic MapReduce:MapReduce型分析,基于Hadoop,支持Hive/Pig。能处理EC2和S3中的数据2、存储类服务S3:海量文件存储。分高可靠和低可靠两类。SimpleDB:高可伸缩的简单结构化数据存储,支持极大数据量。强一致和最终一致可选。条件更新RDS:打包好的MyS
阅读全文
摘要:1.Mongodb bson文档型数据库,整个数据都存在磁盘中,hbase是列式数据库,集群部署时每个familycolumn保存在单独的hdfs文件中。2.Mongodb 主键是“_id”,主键上面可以不建索引,记录插入的顺序和存放的顺序一样,hbase的主键就是row key,可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在hbase内部,row key保存为字节数组。存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。字典序对int排序的结果是1,10,10
阅读全文

浙公网安备 33010602011771号