谨慎更新微软恶意补丁KB3123862

昨天因为不小心把系统的自动更新设置打开了,结果更新完重启之后进不了桌面,没有任何图标,快捷键也用不了。幸好 ctrl+alt+del 还能使用,打开任务管理器还能运行个 cmd 和其它应用程序,经过一番研究,把安装过的补丁一个一个的卸载掉,结果卸载了 KB3123862 补丁之后,终于见到熟悉的桌面了。

微软已经将Windows 10系统列为Windows 7/8.1的推荐更新,意味着很多人极可能会在不经意间就被升级到新系统,而为了确保升级过程更加顺利,微软也经常推出一些相关补丁。如果你不打算换系统,这些补丁一定不要碰。

近日,微软又悄然向Windows 7/8.1系统用户推送了一个新的补丁,知识库编号KB3123862,适用于Windows 7 SP1、Windows 8 Core/Pro、Windows 8.1 Enterprise。

根据官方描述,该补丁的作用是:“为部分计算机增加新功能,方便用户更轻松地了解Windows 10,或者开始升级到Windows 10。”

有人研究后发现,这个补丁安装后会更新资源管理器主程序Explorer.exe,包括新的图标、菜单、位图、shell32.dll、authui.dll。

如果你不是闲着没事干想重装系统的话,千万不要更新这个补丁!忘记说明了,我用的是 windows 8.1 enterprise

除此之外,还有(KB3018133/KB3013172/KB3000850)三个补丁也可能会出现同样问题。

处理Linux中文文件名乱码问题

前几天使用FlashFXP查看到服务器上有几个中文的目录,但是点击不进去,中文文件名的文件也下载不下来,,新上传的中文文件名却正常。怀疑是编码问题引起的。早之前也试过在操作系统默认字符集没有更改前,用FTP上传的文件名在SecureCRT登录上去查看的就是乱码,起初以为是SecureCRT字体设置的有问题,但是使用同一款字体登录了公司的另一台CentOS服务器却很正常。

用locale命令看到

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

尝试过把/ect/sysconfig/i18n里的字符集更改为GB18030。

LANG="zh_CN.GB18030"
SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"
SYSFONT="lat0-sun16"

结果还是不正常,ftp点击原来的中文文件名进不去目录。

在RHEL5中对应的文件是/usr/lib/locale/zh_CN.gb18030
/etc/sysconfig/i18n 这里存放的是系统的区域语言设置
第一行 表明你当前系统的语言环境变量设置 ,这里是 zh_CN.GB18030
第二行 表明系统预置了那些语言支持 ,不在项目中的语言不能正常显示
第三行 定义控制台终端字体,你文本登录的时候显示的字体就是这个 latarcyrheb-sun16
注:
I18N 是 internationalization 的缩写形式,意即在 i 和 n 之间有 18 个字母,本意是指软件的“国际化”.
I18N支持多种语言,不过同一时间只能是英文和一种选定的语言,例如英文+中文、英文+德文、英文+韩文等等;
原来的:
LANG=”zh_CN.UTF-8″
SUPPORTED=”zh_CN.UTF-8:zh_CN:zh”
SYSFONT=”latarcyrheb-sun16″

基本上确定了问题是因为windows使用提GBK编码直接上传导致的。无意中让我搜索到这篇文章《从windows ftp上传utf-8编码的linux,中文文件名乱码问题解决办法

原文内容:

windows缺省字符集是GBK,在ftp上传到linux文件时,中文文件名总是显示乱码,原因是此linux字符集为utf-8,无论是ftp还是scp,都不能自动解决编码不一致问题。
经查找,解决办法如下:
在linux下安装convmv命令,采用

convmv -f gbk -t utf-8 –notest -r ./

即可。
注意:为了以防上传到linux上的文件确实是gbk的乱码,可以先别加 [–notest],这样先将改名名的命令显示到控制台,正确后再添加 –notest参数。
–notest 参数为 正式执行改名动作。
-r 为递归子目录
./ 这个是你要修改文件的目录位置。
另外,打包时最好别用zip格式,windows上压缩后,再在linux解压,中文名不是gbk编码了(我测试过了)。保险起见请用tar打包上传。

可是发现我的RHEL里没有这个命令,应该是要安装一个rpm包。

http://rpm.pbone.net/index.php3 这是一个搜索rpm包的网站,终于让我找到了一个适用RHEL 5 的rpm安装包。

wget http://dag.wieers.com/redhat/el5/en/x86_64/extras/RPMS/convmv-1.15-1.el5.rfx.noarch.rpm
rpm -ivh convmv-1.15-1.el5.rfx.noarch.rpm

安装完之后再执行上面所说的convmv指令,成功转换文件名编码,FTP操作正常,SecureCRT查看也正常。

下面看一下convmv的具体用法:

convmv -f 源编码 -t 新编码 [选项] 文件名
常用参数:
-r 递归处理子文件夹
–notest 真正进行操作,请注意在默认情况下是不对文件进行真实操作的,而只是试验。
–list 显示所有支持的编码
–unescap 可以做一下转义,比如把 变成空格
比如我们有一个utf8编码的文件名,转换成GBK编码,命令如下:
convmv -f UTF-8 -t GBK –notest utf8编码的文件名
这样转换以后”utf8编码的文件名”会被转换成GBK编码(只是文件名编码的转换,文件内容不会发生变化)

Nginx的Rewrite功能配置

Rewrite的Flags

last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301

 

Discuz!在Nginx下的Rewrite

rewrite ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$ $1/archiver/index.php?$2 last;
rewrite ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay.php?fid=$2&page=$3 last;
rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^(.*)/profile-(username|uid)-(.+)\.html$ $1/viewpro.php?$2=$3 last;
rewrite ^(.*)/space-(username|uid)-(.+)\.html$ $1/space.php?$2=$3 last;
rewrite ^(.*)/tag-(.+)\.html$ $1/tag.php?name=$2 last;

Nginx 使用中文文件名中文目录404错误

一:确定你的系统是UTF编码
[root@Tserver ~]# env|grep LANG
LANG=en_US.UTF-8

二:NGINX配置文件里默认编码设置为utf-8
server
{
listen 80;
server_name .inginx.com ;
index index.html index.htm index.php;
root /usr/local/nginx/html/inginx.com;
charset utf-8;
}

三:如果使用putty
windows –> translation –>UTF-8

mkdir NGINX中文技术站
echo ‘NGINX中文技术站’ > NGINX中文技术站/中国.html

四,如果是用securecrt 上传文件,请选择 回话–>外观–UTF-8
如果是FTP软件也将默认编码设置为TUF-8

五,如果上传的文件名出现乱码显示
执行
for f in `ls *.html` ; do mv $f `ls $f|iconv -f GBK -t UTF-8`; done

完毕

debian linux环境下安装vmware虚拟机

宿主环境:

Debian Linux 6 AMD64

VMWare 7.1.6

 

虚拟环境:

CentOS 6.3 64bit 最小化安装

 

宿主配置

宿主需要安装的依赖包:

apt-get install perl

apt-get install gcc

apt-get install linux-headers-2.6.32-5-all-amd64

下载安装版本:VMware-Workstation-Full-7.1.6-744570.x86_64.bundle

以下序列号来源于网络:GY11R-0VE41-085VZ-VZPQC-Q20G2

 #sh ./VMware-Workstation-Full-7.1.6-744570.x86_64.bundle

然后会弹出安装界面,然后一步步图形化的操作,跟windows上安装差不多。

 

虚拟机配置

设置固定IP:

#ifconfig -a 查看一下网卡信息
#netstat -r 查看网关

#vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=static            还有一种是dhcp
BROADCAST=192.168.135.255   广播地址
NETWORK=192.168.135.0       网段   
IPADDR=192.168.135.128      ip地址
HWADDR=00:0C:29:0C:0C:34    网卡地址
GATEWAY=192.168.135.2       网关(这个和/etc/resolv.conf中的DNS一样)
ONBOOT=yes                  当启动的时候启用

vi /etc/resolv.conf  修改DNS
nameserver 192.168.35.2

#ifdown
#ifup

以下内容来源于网络,本人做了些话修改:

一、linux虚拟机采用Bridge(桥接)上网
适用:使用路由器上网的企业或家庭环境(静态ip)
(1)将VMware下的linux虚拟机设置为Bridge上网,并将linux的ip设置成与主机ip同一网段。
     测试:ping www.163.com (若ping得通,说明已经成功连接到外网)
(2)此时外网直接访问linux虚拟机的ip即可
注意:此时局限于企业或家庭的局域网,如果要真正的互联网访问这台linux虚拟机,需要在做一个外网ip
二、linux虚拟机采用NAT上网
适用:校园网或者托管到机房的服务器(动态ip)
(1)将VMware下的linux虚拟机设置为NAT上网。
这里需要注意的是:
如果你的主机为XP系统,那么下面的测试一般能ping通;
如果你的主机是Win7系统,那么你需要将VMware的版本升级到7.1以上(记得安装完重启电脑),否则下面的测试一般不能ping通(假如你ping通,那你人品真的非常好!)。
     测试:ping www.163.com (若ping得通,说明已经成功连接到外网)

(2)VMware虚拟机的端口映射
使用NAT上网的linux虚拟机是和宿主机共享一个ip的,此时外网访问这个ip是访问你的宿主机,而不是你的linux虚拟机!因此此时需要对VMware虚拟机做一个端口映射!
具体方法如下:
a、VMware下Edit->Virtual Network Editor->VMnet8->NAT Setting->Add开始设置端口映射。
b、Host port 为要映射到主机的主机端口
   Type     依情况而定
   Virtual machine IP Address 为linux虚拟机的IP地址(超级权限,ifconfig可查看)
   Virtual machine port       为要映射到主机的虚拟机端口
c、举例:将linux虚拟机的ssh端口22映射到主机的6000端口,外界访问时直接访问主机地址的6000端口即访问linux虚拟机的22端口。

可能是因为我安装的VMWare版本不同,没有找到做端口影射界面,后来是直接修改配置文件。

# vim /etc/vmware/vmnet8/nat/nat.conf

[incomingtcp]
# ftp port
8021 = 192.168.35.128:21
8121 = 192.168.35.129:21

# ssh port
8022 = 192.168.35.128:22
8122 = 192.168.35.129:22

# web port
8000 = 192.168.35.128:80
8100 = 192.168.35.129:80

:wq 保存退出

#service vmware restart 重启vmware服务,然后重新开虚拟机,进入虚拟系统。这时候通过外网已经可以访问进来了。。。

debian修改apt-get安装源

该S的Debian系统,一点也不习惯。可能因为习惯了红帽子系列的RHEL 、CentOS。

因为项目需要用到在Debian里安装虚拟机环境,昨天搞了一天没有搞定VMWare,今天想试一下VirtualBox,结果还是发现很多依赖包安装不了。

快把我给折腾疯了,于是想到apt-get应该和yum类似,问题会不会出在安装源的问题上呢?

百度一下,找到了网易163的安装源。

1、先备份
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

2、修改更新源
vi /etc/apt/sources.list

把下面的列表添加sources.list文件里

deb http://ftp.sjtu.edu.cn/debian lenny main non-free contrib
deb http://ftp.sjtu.edu.cn/debian lenny-proposed-updates main non-free contrib
deb http://ftp.sjtu.edu.cn/debian-security lenny/updates main non-free contrib

deb http://mirrors.163.com/debian squeeze main
deb http://mirrors.163.com/debian squeeze-proposed-updates main
deb http://mirrors.163.com/debian-security squeeze/updates main

因为我这里安装的是debian 6 amd64 squeeze版本。所以这里要稍微修改一下。

#apt-get update

测试一下安装个VIM和一些lib依赖包:

# aptitude install vim

# apt-get install libqt4-opengl libqt4-opengl-dev

终于弄出来了。。。爽

vmware clone centos不启动网卡

准备研究一下fastDFS,在vmware里安装了个CentOS 6.0 64bit,然后clone了两个虚拟机出来。

发现clone出来的不能启动网卡,ifconfig eth0也配置不了,修改/etc/sysconfig/network-scripts/ifcfg-eth0文件也不生效。百思不得其姐。。。百度一番之后得到了答案,有网络真好,脑子都不用动了。

sudo /etc/init.d/networking restart
 * Reconfiguring network interfaces…
eth0: ERROR while getting interface flags: No such device
SIOCSIFADDR: No such device
eth0: ERROR while getting interface flags: No such device
SIOCSIFNETMASK: No such device
SIOCSIFBRDADDR: No such device
eth0: ERROR while getting interface flags: No such device
eth0: ERROR while getting interface flags: No such device
Failed to bring up eth0.

解决办法:

切换root帐户,执行

#rm -rf /etc/udev/rules.d/70-persistent-net.rules
#ifconfig -a 查看mac地址,并记录下来
#vi /etc/sysconfig/network-scripts/ifcfg-eth0
修改HWADDR为刚刚查看到的mac地址,并修改IPADDR

然后reboot即可。

[转]Redis在Windows、linux平台下的安装配置

为了方便查阅资料,特将网上搜索到的Redis相关安装配置进行归档整理:

=============================================================
window平台Redis安装 

  下载地址: http://code.google.com/p/servicestack/wiki/RedisWindowsDownload 

   Redis文件夹有以下几个文件
   redis-server.exe:服务程序

   redis-check-dump.exe:本地数据库检查

   redis-check-aof.exe:更新日志检查

   redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的ab 工具).

   指定redis的配置文件,如没有指定,则使用默认设置
   解压目录:\>redis-server.exe redis.conf

   redis-cli.exe:命令行客户端,测试用  

   解压目录:\>redis-cli.exe -h 127.0.0.1 -p 6379

   设置一个Key并获取返回的值:

   $ ./redis-cli set mykey somevalue
   OK
   $ ./redis-cli get mykey
   Somevalue

   如何添加值到list:  
   $ ./redis-cli lpush mylist firstvalue
   OK
   $ ./redis-cli lpush mylist secondvalue
   OK
   $ ./redis-cli lpush mylist thirdvalue
   OK
   $ ./redis-cli lrange mylist 0 -1
   1. thirdvalue
   2. secondvalue
   3. firstvalue
   $ ./redis-cli rpop mylist
   firstvalue
   $ ./redis-cli lrange mylist 0 -1
   1. thirdvalue
   2. secondvalue

     redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的 ab 工具).
 
    ./redis-benchmark -n 100000 –c 50
    ====== SET ======
    100007 requests completed in 0.88 seconds (译者注:100004 查询完成于 1.14 秒 )
    50 parallel clients (译者注:50个并发客户端)
    3 bytes payload (译者注:3字节有效载荷)
    keep alive: 1 (译者注:保持1个连接)
    58.50% <= 0 milliseconds(译者注:毫秒)
    99.17% <= 1 milliseconds
    99.58% <= 2 milliseconds
    99.85% <= 3 milliseconds
    99.90% <= 6 milliseconds
    100.00% <= 9 milliseconds
    114293.71 requests per second(译者注:每秒 114293.71 次查询)

     Windows下测试并发客户端极限为60

 
=============================================================
 

linux平台Redis安装:
 

 
wget http://code.google.com/p/redis/downloads/detail?name=redis-2.0.4.tar.gz
tar xvzf redis-2.0.4.tar.gz
cd  redis-2.0.4
make
mkdir /home/redis
cp redis-server  /home/redis
cp redis-benchmark  /home/redis
cp redis-cli  /home/redis
cp redis.conf  /home/redis
cd  /home/redis

 
    启动

    ./redis-server redis.conf

    进入命令交互模式,两种:

    1:   ./redis-cli

    2:   telnet 127.0.0.1 6379       (ip接端口)
 
=============================================================
配置文件参数说明:

 

1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程

    daemonize no

2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定

    pidfile /var/run/redis.pid

3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字

    port 6379

4. 绑定的主机地址

    bind 127.0.0.1

5.当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能

    timeout 300

6. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose

    loglevel verbose

7. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null

    logfile stdout

8. 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id

    databases 16

9. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合

    save <seconds> <changes>

    Redis默认配置文件中提供了三个条件:

    save 900 1

    save 300 10

    save 60 10000

    分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。

 

10. 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大

    rdbcompression yes

11. 指定本地数据库文件名,默认值为dump.rdb

    dbfilename dump.rdb

12. 指定本地数据库存放目录

    dir ./

13. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步

    slaveof <masterip> <masterport>

14. 当master服务设置了密码保护时,slav服务连接master的密码

    masterauth <master-password>

15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭

    requirepass foobared

16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息

    maxclients 128

17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区

    maxmemory <bytes>

18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no

    appendonly no

19. 指定更新日志文件名,默认为appendonly.aof

     appendfilename appendonly.aof

20. 指定更新日志条件,共有3个可选值:
    no:表示等操作系统进行数据缓存同步到磁盘(快)
    always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
    everysec:表示每秒同步一次(折衷,默认值)

    appendfsync everysec

 

21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)

     vm-enabled no

22. 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享

     vm-swap-file /tmp/redis.swap

23. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0

     vm-max-memory 0

24. Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值

     vm-page-size 32

25. 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。

     vm-pages 134217728

26. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4

     vm-max-threads 4

27. 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启

    glueoutputbuf yes

28. 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法

    hash-max-zipmap-entries 64

    hash-max-zipmap-value 512

29. 指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)

    activerehashing yes

30. 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件

    include /path/to/local.conf

 
=============================================================
 

 

问题讨论:

1. Redis官方文档对VM的使用提出了一些建议:   当你的key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大.   当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value.   最好使用linux ext3 等对稀疏文件支持比较好的文件系统保存你的swap文件.   vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数.如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.
2. 关于Redis新的存储模式diskstore(http://timyang.net/data/redis-diskstore),节选:
适合Web 2.0数据访问最佳的方式就是完全基于内存,比如用Memcached或者Redis snapshot方式。但是更多的业务场景是数据规模会超过RAM容量,因此有几种不同的设计模式。
VM方式: 将数据分页存放,由应用(如Redis)或者操作系统(如Varnish)将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中。应用实现VM缺点是代码逻辑复杂,如果业务上冷热数据边界并不分明,则换入换出代价太高,系统整体性能低。不少抢鲜的网友在微博上也反馈过使用VM种种不稳定情况。操作系统实现缺点在于主要OS的VM换入换出是基于Page概念,比如OS VM1个Page是4K, 4K中只要还有一个元素即使只有1个字节被访问,这个页也不会被SWAP,换入也同样道理,读到一个字节可能会换入4K无用的内存。而Redis自己实现则可以达到控制换入的粒度。另外访问操作系统SWAP内存区域时block进程,也是导致Redis要自己实现VM原因之一。     
磁盘方式: 所有的数据读写访问都是基于磁盘,由操作系统来只能的缓存访问的数据。由于现代操作系统都非常聪明,会将频繁访问的数据加入到内存中,因此应用并不需要过多特殊逻辑。MongoDB就是这种设计方式。这种方式也有一些已知的缺点,比如操作MMap写入磁盘由操作系统控制,操作系统先写哪里后写哪里应用并不知情,如果写入过程中发生了crash则数据一致性会存在问题。这个也是MongoDB饱受争议的单机Durability问题   硬盘存储+cache方式: 实际原理和mysql+memcache方式类似,只不过将两者功能合二为一到一个底层服务中,简化了调用。   在上面几种方式中,除去VM,antirez觉得MongoDB方式也不太适合,因此选择了disktore方式来实现新的磁盘存储,具体细节是
1) 读操作,使用read through以及LRU方式。内存中不存在的数据从磁盘拉取并放入内存,内存中放不下的数据采用LRU淘汰。

2) 写操作,采用另外spawn一个线程单独处理,写线程通常是异步的,当然也可以把cache-flush-delay配置设成0,Redis尽量保证即时写入。但是在很多场合延迟写会有更好的性能,比如一些计数器用Redis存储,在短时间如果某个计数反复被修改,Redis只需要将最终的结果写入磁盘。这种做法作者叫per key persistence。由于写入会按key合并,因此和snapshot还是有差异,disk store并不能保证时间一致性。由于写操作是单线程,即使cache-flush-delay设成0,多个client同时写则需要排队等待,如果队列容量超过cache-max-memory,Redis设计会进入等待状态,造成调用方卡住。Google Group上有热心网友迅速完成了压力测试,当内存用完之后,set每秒处理速度从25k下降到10k再到后来几乎卡住。虽然通过增加cache-flush-delay可以提高相同key重复写入性能;通过增加cache-max-memory可以应对临时峰值写入。但是diskstore写入瓶颈最终还是在IO。

3) rdb 和新 diskstore 格式关系   rdb是传统Redis内存方式的存储格式,diskstore是另外一种格式,那两者关系如何?

1.通过BGSAVE可以随时将diskstore格式另存为rdb格式,而且rdb格式还用于Redis复制以及不同存储方式之间的中间格式。

2.通过工具可以将rdb格式转换成diskstore格式。   ============================================================= 
相关链接:
国内:
Redis几个认识误区 
Redis新的存储模式diskstore 
Redis使用系列:配置文件篇 
Redis在Windows下的使用  
深入Redis,读redis-from-the-ground-up有感 

国外:
http://code.google.com/p/redis/
http://blog.mjrusso.com/2010/10/17/redis-from-the-ground-up.html
http://antirez.com/post/redis-virtual-memory-story.html
http://code.google.com/p/redis/wiki/VirtualMemorySpecification

Memcached管理与监控工具MemAdmin

MemAdmin是一款可视化的Memcached管理与监控工具,使用PHP开发,体积小,操作简单。

主要功能:
服务器参数监控:STATS、SETTINGS、ITEMS、SLABS、SIZES实时刷新
服务器性能监控:GET、DELETE、INCR、DECR、CAS等常用操作命中率实时监控
支持数据遍历,方便对存储内容进行监视
支持条件查询,筛选出满足条件的KEY或VALUE
数组、JSON等序列化字符反序列显示
兼容memcache协议的其他服务,如Tokyo Tyrant (遍历功能除外)
支持服务器连接池,多服务器管理切换方便简洁。

包含中文名的下载地址:memadmin-1.0.8.tar.gz

演示:http://demo.junopen.com/memadmin_demo/index.php

官方:https://github.com/junstor/memadmin