• 2012-03-23

    Redis被bgsave和bgrewriteaof阻塞的解决方法

    Views: 63768 | No Comments

    Redis 是一个性能非常高效的内存 Key-Value 存储服务, 同时它还具有两个非常重要的特性: 1. 持久化; 2. Value 数据结构. 这两个特性让它在不少场景轻松击败了 Memcached 和 Casandra 等.

    Redis 的持久化在两种方式: Snapshotting(快照) 和 Append-only file(aof). 在一个采用了 aof 模式的 Redis 服务器上, 当执行 bgrewriteaof 对 aof 进行归并优化时, 出现了 Redis 被阻塞的问题, 此时, Redis 无法提供任何读取和写入操作.

    按字面理解, bgrewriteaof 是在后台进行操作, 不应该影响 Redis 的正常服务. 原理也确实是这样的, Redis 首先 fork 一个子进程, 并在该子进程里进行归并和写持久化存储设备(如硬盘)的. 按照正常逻辑, 在一台多核的机器上, 即使子进程占满 CPU 和硬盘, 也不应该导致 Redis 服务阻塞啊!

    其实, 问题就出在硬盘上.

    Continue reading »

    Posted by ideawu at 2012-03-23 13:50:34 Tags: , , , , , , ,
  • 2011-08-05

    Fn和CTRL的故事

    Views: 15761 | 7 Comments

    从前, 键盘工程师新创造了一个叫"Fn"的人造人, 想把它加入到键盘按键的队伍里. 工程师想, 它是一个革命性的产品, 因为, 它功能强大, 这从它的名字就能看出它的工程师老母对它的期望. 它可以帮忙打开键盘灯, 这样, 在黑暗中你也可以使用笔记本电脑. 它还可以帮忙调整屏幕亮度, 调整音量, 真是一个强大贴心的助手. 所以, 工程师决定把它放到了原来一个叫"CTRL"的人的位置, 把CTRL排挤到了一边. 那是键盘上最左下角的地方, 也是手指流量最密集的地方.

    但是, Fn并不受欢迎, 因为没有人经常需要, 没有人天天不停地打开和关闭键盘灯, 即使好几年下来有一天遇到了, 先开灯或者在进入黑暗之前打开键盘灯也很正常.

    相反, 人们怀念CTRL, 因为人们每天要把手指放在CTRL上面上千遍:

    CTRL + C: 复制
    CTRL + V: 粘贴
    CTRL + S: 保存
    CTRL + A: 全选
    CTRL + X: 剪切
    CTRL + W: 关闭窗口
    CTRL + T: 打开浏览器标签
    CTRL + 空格: 切换输入法

    对比Fn, Fn用不了一两回. 因为那些自以为是很内裤的功能, 其实都是和硬件有关, 根本就不常用到. 比如谁会没事按Fn让自己的键盘灯一亮一灭的, 或者没完没了地调整屏幕亮度和音量, 他有病啊!

    大部分的电脑厂商都明白了这个道理, 绝情地把Fn赶走了, 重新迎回CTRL. 但是, 有一个叫IBM的巨人和它的买主还是坚持迂腐, 感情上不愿意把CTRL接回来, 最终决定帮人在BIOS里偷偷给Fn和CTRL换了衣服.

    Fn垂头丧气, 成了不受欢迎的失败产品. 现在, 它在寻找一个最不起眼的角落, 想静地躺在那里, 不要像以前那么招摇.

    Posted by ideawu at 2011-08-05 22:55:50
  • 2011-08-03

    概率选取的实现

    Views: 13586 | 5 Comments

    常常有这样的功能需求: 每次从一批候选项中随机选取其中一项, 要求每一项的出现都有一定的概率. 比如说, 有如下候选项和对应的概率: A:10%, B:5%, C:25%, D:60%.

    现在, 把每一项的概率用一个正整数(概率值)来表示, 不使用百分率, 整数的总和不一定等于100, 可以是任意大小,

    实际概率 = 概率值/总和 * 100%

    概率选取的算法如下:

    • 依次(顺序可随机)将各项按概率值从原点开始放在一维坐标上首尾相连, 这样, 每一项对应一个取值区间
    • 在总区间范围内随机选取一个点, 落在哪一项对应的区间就选中哪一项

    用伪码表示:

    total_p = sum(p1 + p2 + p3 + ...)
    rand = random(1, total_p) // [1, total_p]
    foreach(items as item){
        rand -= item.p
        if(rand <= 0){
            // 选中了
        }
    }
    
    Posted by ideawu at 2011-08-03 09:02:49
  • 2011-06-24

    关系数据库应用设计基础

    Views: 34919 | 1 Comment

    这是我给部门同事做的技术分享.

    当今绝大部分的软件系统都用到了关系数据库, 所以, 作为软件开发工程师, 必须掌握关系数据库应用设计能力.

    Posted by ideawu at 2011-06-24 18:02:57 Tags:
  • 2011-03-31

    史上最强大的PHP Web面试题(会做就能进百度)

    Views: 71829 | 58 Comments

    注: 只要你会做了这道题目, 你的能力已经可以进入百度了! 如果别的部门不要你, 请你给我发邮件, 我一定尽我所能强烈推荐你! 如果你不想加入百度, 而别的公司又不要你, 只能说明那家公司瞎眼了.

    题目: 见图片, 该图是某网页的一个区域的截图, 用于显示商品或者其它信息的分类. 该分类的每一项可以折叠和收起(展开和收缩, 如果有子分类的话). 分类的级数不固定. 现有一个PHP变量:

    $cats = array(
        array(
            'id' => 1,
            'name' => '学术和教育',
            'children' => array(
                array(
                    'id' => 2,
                    'name' => '自然科学',
                    'children' => null,
                ),
                // ...
            ),
        ),
        // ...
    );
    

    请写一段PHP代码, 将该数组所包含的分类数据生成一段能实现如图片所示功能的HTML/JavaScript代码, 可不考虑CSS样式.

    ----------

    注解: 这道题目考察的范围非常广, 包括PHP, HTML, JavaScript, CSS, 递归, 只有真正掌握了如上几种全部技能, 才能实现完整的功能, 否则必须依赖分工. 应聘者所能实现的程度越大, 得分就越高.

    如果应聘者的应聘职位不包括HTML/JS/CSS, 那么题目可改为: 把上面的PHP数据用缩进换行文本的形式保存到文件, 并读取文件生成一个同样的PHP数组.(自定义格式的序列化和反序列化)

    看到这篇日志的读者, 如果已经做了出来, 并且个人想加入百度, 请在评论中回复URL并说明你的意愿, 我会主动联系你. 或者你可以把程序打包发给我.

    Continue reading »

    Posted by ideawu at 2011-03-31 16:57:24 Tags:
  • 2011-02-17

    主要排序算法的比较(精炼)

    Views: 11294 | No Comments

    来自: Wikipedia

    Heapsort primarily competes with quicksort, another very efficient general purpose nearly-in-place comparison-based sort algorithm.

    Quicksort is typically somewhat faster, due to better cache behavior and other factors, but the worst-case running time for quicksort is O(n2), which is unacceptable for large data sets and can be deliberately triggered given enough knowledge of the implementation, creating a security risk. See quicksort for a detailed discussion of this problem, and possible solutions.

    Thus, because of the O(n log n) upper bound on heapsort's running time and constant upper bound on its auxiliary storage, embedded systems with real-time constraints or systems concerned with security often use heapsort.

    Heapsort also competes with merge sort, which has the same time bounds, but requires Ω(n) auxiliary space, whereas heapsort requires only a constant amount. Heapsort also typically runs more quickly in practice on machines with small or slow data caches. On the other hand, merge sort has several advantages over heapsort:

    • Like quicksort, merge sort on arrays has considerably better data cache performance, often outperforming heapsort on a modern desktop PC, because it accesses the elements in order.
    • Merge sort is a stable sort.
    • Merge sort parallelizes better; the most trivial way of parallelizing merge sort achieves close to linear speedup, while there is no obvious way to parallelize heapsort at all.
    • Merge sort can be easily adapted to operate on linked lists (with O(1) extra space[7]) and very large lists stored on slow-to-access media such as disk storage or network attached storage. Heapsort relies strongly on random access, and its poor locality of reference makes it very slow on media with long access times. (Note: Heapsort can also be applied to doubly linked lists with only O(1) extra space overhead)

    Introsort is an interesting alternative to heapsort that combines quicksort and heapsort to retain advantages of both: worst case speed of heapsort and average speed of quicksort.

    Posted by ideawu at 2011-02-17 16:57:21
|<<<456789101112>>>| 8/13 Pages, 76 Results.