Total Pageviews

Wednesday 11 April 2012

键值数据库-Redis

Redis马上就要释出1.0Stable了,是出手的时候了。

Redis的介绍

数据库主要类型有对象数据库,关系数据库,键值数据库等等,对象数据库太超前了,现阶段不提也罢;关系数据库就是平常说的MySQL,PostgreSQL这些熟的不能再熟的东西,至于键值数据库则是本文要着重说的,其代表主要有MemcacheDBTokyo Cabinet等等。

Redis 本质上也是一种键值数据库,但它在保持键值数据库简单快捷特点的同时,又吸收了部分关系数据库的优点。从而使它的位置处于关系数据库和键值数据库之间。 Redis不仅能保存Strings类型的数据,还能保存Lists类型(有序)和Sets类型(无序)的数据,而且还能完成排序(SORT)等高级功 能,在实现INCR,SETNX等功能的时候,保证了其操作的原子性,除此以外,还支持主从复制等功能。

详细描述参见官方手册,同时,官方提供了一个名为Retwis的项目的源代码,可以对照着官方介绍学习,注意其中关于Data Layout的描述,其他没什么。

项目实践中,多以关系数据库为主,不过合理的使用Redis这样的键值数据库,往往能扬长避短,比如说实现一个类似消息队列的功能,对MySQL来说,除非使用Q4M,否则很难满足高并发请求,不过对Redis来说,通过内建的Lists支持,消息队列就是小菜一碟。

Redis的安装

tar zxvf redis-version.tar.gz
cd redis-version
make

由于没有make install,所以得把源代码目录里的关键文件手动复制到适当的位置:

cp redis.conf /etc/
cp redis-benchmark redis-cli redis-server /usr/bin/

如果内存情况比较紧张的话,需要设定内核参数:

echo 1 > /proc/sys/vm/overcommit_memory

然后编辑redis.conf配置文件(/etc/redis.conf),按需求做出适当调整,比如:

daemonize yes
logfile /dev/null

如果要记录日志的话,最好先调整loglevel到一个合适的级别,然后设定logfile,如果不需要,则可以像上面这样直接把日子丢弃到/dev/null里,还有一点,缺省情况下,数据文件dump.rdb会被生成到当前目录,可以通过dir参数设定合适的目录。

此外,如果你决定把Redis用于产品环境,还要注意maxmemory选项,因为Redis在启动时会把所有数据加载到内存中,所以设定maxmemory相对安全。

接下来直接启动服务就可以了,只有配置文件一个参数:

redis-server /etc/redis.conf

确认运行了之后,可以用redis-benchmark命令测试看看,还可以通过redis-cli命令实际操作一下,比如:

redis-cli set foo bar
OK
redis-cli get foo
bar

在设置键对应的值的时候,按照协议的规定是要提供数据大小这个参数的,上面的redis-cli命令之所以没有提供这个参数是因为redis-cli本身进行了封装。

可以通过telnet来验证一点:

telnet 127.0.0.1 6379
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set foo 3
bar
+OK
get foo
$3
bar
^]
telnet> quit
Connection closed.

更多命令介绍参考文档介绍

Redis源代码里附带了多种客户端的扩展,比如说php(client-libraries/php),这是一个纯PHP的实现方案,也有二进制版本的实现(phpredis)。其他语言即便没有现成的扩展实现,也可以自己按照协议规范写一个扩展,应该不是什么难事。

Redis内存要求很高,如果你的数据量很大的话,可能会导致系统使用swap,这会使性能急剧下降。此时更好的方法是通过consistent hashing把数据分布到多个服务器上,文档上给出了简单的例子解释:

For example imagine to have N Redis servers, server-0, server-1, ..., server-N. You want to store the key "foo", what's the right server where to put "foo" in order to distribute keys evenly among different servers? Just perform the crc = CRC32("foo"), then servernum = crc % N (the rest of the division for N). This will give a number between 0 and N-1 for every key. Connect to this server and store the key.

在线演示:
http://try.redis-db.com/

参考链接:

http://redis.io/
https://github.com/antirez/redis,https://github.com/antirez/redis-tools
http://github.com/jdp/redisent/tree/master
http://github.com/owlient/phpredis
http://rediska.geometria-lab.net/
---------------------------------------------------------
redis 添加访问密码

1. 更改redis.conf配置
# requirepass foobared 去掉注释,foobared改为 自己的password , 我测试的时候用的是默认的 foobared
2.启动redis
/usr/local/redis/src/redis-server -p 6371
3.测试
/usr/local/redis/src/redis-cli -p 6371 -a foobared
redis>set a b
(error) ERR operation not permitted      (-a 设置这个时候没起作用 )
redis>auth foobared
OK
redis>set a b
OK
redis>quit
这时,再
/usr/local/bin/redis-cli -a foobared
redis > set a b
OK
---------------------------------------------------------------------------
Redis在Windows,linux平台下的安装配置

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格式。
from http://timyang.net/data/redis-misunderstanding/
-----------------------------------------------------------------------
 用RPM以及YUM安装redis

本文将redis-2.0.4版本的源码制作成rpm包,并创建yum能够使用的repo,方便安装和升级。

一,贴一个完整的spec文件:rpm-redis-2.0.4.spec
Summary: A simple rpm package of redis
%define version 2.0.4
Group: Weibo/Databases
Name: redis
License: GPL
Prefix: /usr/local/weibo
Provides: weibo
Release: 192
Source: redis-%{version}.tar.gz
URL: http://weibo.cn
Version: %{version}
Buildroot: /tmp/redisrpm
%description
We love rpm and yum !
We love Redis and MySQL database!

%prep
%setup -q

%build
make

%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/usr/local/weibo/bin
mkdir -p $RPM_BUILD_ROOT/usr/local/weibo/sbin
mkdir -p $RPM_BUILD_ROOT/usr/local/weibo/etc
cp redis-server $RPM_BUILD_ROOT/usr/local/weibo/sbin
cp redis-cli $RPM_BUILD_ROOT/usr/local/weibo/bin
cp redis.conf $RPM_BUILD_ROOT/usr/local/weibo/etc
cp redis-benchmark $RPM_BUILD_ROOT/usr/local/weibo/bin

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
/usr/local/weibo/sbin/redis-server
/usr/local/weibo/bin/redis-cli
/usr/local/weibo/bin/redis-benchmark
%config(noreplace) /usr/local/weibo/etc/redis.conf

其中标红的部分为比较有意思的地方,可以仔细研究一下。

二,将redis-2.0.4.tar.gz的源代码包放到 /usr/src/redhat/SOURCES/redis-2.0.4.tar.gz

三,执行build:

rpmbuild -bb rpm-redis-2.0.4.spec

四,安装createrepo:
yum install createrepo

五,准备repo目录
以/var/www/html/repo为例,将制作好的/usr/src/redhat/RPMS/x86_64/redis-2.0.4-192.x86_64.rpm拷贝到/var/www/html/repo。
然后执行 createrepo /var/www/html/repo即可。

六,配置http服务器,使之能够访问/var/www/html/repo,本文中URL为 http://10.210.74.152/repo

七,配置要安装redis的服务器的repo文件:
cat /etc/yum.repos.d/weibo.repo
[weibo]
name=made by weibo
baseurl= http://10.210.74.152/repo
gpgcheck=0
metadata_expire=10s

八,测试安装:
yum search redis
yum install redis
yum rease redis

九,测试升级:
修改spec文件,增加其中的Release号,然后重新build,将新的rpm文件放到repo目录中,重新执行createrepo命令。
安装服务器上执行yum update redis,应该可以正常升级,并且不会覆盖旧版被修改的配置文件redis.conf。

十,总结
整套流程不算复杂,如果公司内部软件发布走这种形式,显得很专业,而且确实方便。
rpm相关文档:
http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/index.html
yum相关文档:
http://yum.baseurl.org/wiki/Guides
-------------------------------------------

对Redis数据库及Memcache等资源做Proxy的事情 


现状分析:

1,目前大部分Web 2.0的网站都是Apache和PHP的结构。
2,Apache本身是多进程的服务方式,单个进程内部都是阻塞的、串行的处理请求。
3,假设我们有200台以上的Apache前端机,每台前端机有300个httpd进程。
4,PHP中“持久”的连接不能在多个httpd进程间共享。

如果PHP访问后端资源采用持久连接,那么任何一个后端资源的并发连接数都会超过200*300=60000个。
并且随着前端机规模的不断增加,后端资源的并发连接数会随之增加,所以说PHP本身的持久连接机制的可扩展性不好。

如果PHP访问后端资源采用即时连接,获取资源后马上关闭连接,有经验证明,在访问非常密集的情况下,Memcached有崩溃的情况。分析其原因,我认为:

在服务端 建立加关闭连接 的开销要比 保持一个连接 的开销大。

所以,要提高后端资源的访问效率,实现 连接池 的机制是很重要的。
并且,连接池的网络IO承载能力一定要高于后端资源,否则连接池将成为系统新的瓶颈。

根据之前的讨论,我们认为将连接池部署在Apache本机上是一种比较现实的做法。因为:
1,不会形成新的SPOF。
2,连接池本身占用内存和CPU资源都很小。
3,减少了一次服务器间通讯的开销。

通过实现连接池机制,同一个资源的连接,可以在多个进程之间共享,提高每个连接的利用率,降低总连接数,从而提高总体效率。

最近我正在推动的一个项目中,准备使用Redis做为存储系统,提供给前端机访问。
为了不重蹈Memcache的覆辙,我开发了Redis-proxy系统,目前已经实现了连接池的机制,并且通过了phpredis客户端的的测试。

Redis-proxy系统的代码完全基于Redis-server本身的代码,只是将其数据存储部分删除,增加了连接池的机制。
同时,我将Redis-proxy的网络IO部分以及连接池部分的代码进行了剥离,形成了一个独立的框架体系,并抽象了网络协议层与业务层。以后我们可以很轻松的以插件的形式实现任意无状态协议的网络服务器。有关这部分我将另外介绍。

目前已经有第三方的Memcache proxy:

http://code.google.com/p/memagent/wiki/HowMagentWorks
实现了主备、双写、连接池、ketama一致性哈希等非常有实际意义的机制。
另外,作者建议:
run magent on the same server which client runs. client connects to 127.0.0.1, which is faster

另外还有一个更复杂的:
http://code.google.com/p/moxi/

我认为有必要在资源的proxy的方向投入一些精力.
--------------------------------------------------------
 linux下redis的安装及phpredis

Redis介绍
        Redis本质上一个Key/Value数据库,与Memcached类似的NoSQL型数据库,但是他的数据可以持久化的保存在磁盘上,解决了服务重 启后数据不丢失的问题,他的值可以是string(字符串)、list(列表)、sets(集合)或者是ordered  sets(被排序的集合),所 有的数据类型都具有push/pop、add/remove、执行服务端的并集、交集、两个sets集中的差别等等操作,这些操作都是具有原子性 的,Redis还支持各种不同的排序能力
        Redis 2.0更是增加了很多新特性,如:提升了性能、增加了新的数据类型、更少的利用内存(AOF和VM)
        Redis支持绝大部分主流的开发语言,如:C、Java、C#、PHP、Perl、Python、Lua、Erlang、Ruby等等

Redis性能:
        根据Redis官方的测试结果:在50个并发的情况下请求10w次,写的速度是110000次/s,读的速度是81000次/s
        测试环境:
        1.        50个并发,请求100000次
        2.        读和写大小为256bytes的字符串
        3.        Linux2.6 Xeon X3320 2.5GHz的服务器
        4.        通过本机的loopback interface接口上执行
地址
http://code.google.com/p/redis/wiki/Benchmarks


Redis的功能
       1、Redis的Sharding:Redis支持客户端的Sharding功能,通过一致性hash算法实现,当前Redis不支持故障冗余,在集群中不能在线增加或删除Redis
       2、Redis的master/slave复制:
                    1.        一个master支持多个slave
                    2.        Slave可以接受其他slave的连接来替代他连接master
                    3.        复制在master是非阻塞的,而在slave是阻塞的
                    4.        复制被利用来提供可扩展性,在slave端只提供查询功能及数据的冗余
       3、Redis的Virtual Memory功能:vm是Redis2.0新增的一个非常稳定和可靠的功能,
vm 的引入是为了提高Redis的性能,也就是把很少使用的value保存到disk,而key保存在内存中。实际上就是如果你有10w的keys在内存 中,而只有仅仅10%左右的key经常使用,那么Redis可以通过开启VM尝试将不经常使用的Value转换到disk上保存
       4、Redis的附加档案(AOF)功能:Redis通过配置的策略将数据集保存到aof中,当Redis挂掉后能够通过aof恢复到挂掉前的状态


Redis的安装及配置:
        下载Redis:wget
http://redis.googlecode.com/files/redis-2.0.0-rc4.tar.gz
[falcon@www.fwphp.cn  ~/src]$ tar xvzf redis-2.0.0-rc4.tar.gz
[falcon@www.fwphp.cn  ~/src]$ cd  redis-2.0.0-rc4
[falcon@www.fwphp.cn  ~/src/redis-2.0.0-rc4]$ make
[falcon@www.fwphp.cn  ~/src/redis-2.0.0-rc4]$ mkdir ~/redis-2.0.0
[falcon@www.fwphp.cn  ~/src/redis-2.0.0-rc4]$cp redis-server  ~/redis-2.0.0
[falcon@www.fwphp.cn  ~/src/redis-2.0.0-rc4]$cp redis-benchmark  ~/redis-2.0.0
[falcon@www.fwphp.cn  ~/src/redis-2.0.0-rc4]$cp redis-cli  ~/redis-2.0.0
[falcon@www.fwphp.cn  ~/src/redis-2.0.0-rc4]$cp redis.conf  ~/redis-2.0.0
[falcon@www.fwphp.cn  ~/src/redis-2.0.0-rc4]$ cd ~/redis-2.0.0/



配置redis.conf配置文件

#是否作为守护进程运行
daemonize yes
#配置pid的存放路径及文件名,默认为当前路径下
pidfile redis.pid
#Redis默认监听端口
port 6379
#客户端闲置多少秒后,断开连接
timeout 300
#日志显示级别
loglevel verbose
#指定日志输出的文件名,也可指定到标准输出端口
logfile stdout
#设置数据库的数量,默认连接的数据库是0,可以通过select N来连接不同的数据库
databases 16
#保存数据到disk的策略
#当有一条Keys数据被改变是,900秒刷新到disk一次
save 900 1
#当有10条Keys数据被改变时,300秒刷新到disk一次
save 300 10
#当有1w条keys数据被改变时,60秒刷新到disk一次
save 60 10000
#当dump  .rdb数据库的时候是否压缩数据对象
rdbcompression yes
#dump数据库的数据保存的文件名
dbfilename dump.rdb
#Redis的工作目录
dir /home/falcon/redis-2.0.0/
###########  Replication #####################
#Redis的复制配置
# slaveof <masterip> <masterport>
# masterauth <master-password>

############## SECURITY ###########
# requirepass foobared

############### LIMITS ##############
#最大客户端连接数
# maxclients 128
#最大内存使用率
# maxmemory <bytes>

########## APPEND ONLY MODE #########
#是否开启日志功能
appendonly no
# 刷新日志到disk的规则
# appendfsync always
appendfsync everysec
# appendfsync no
################ VIRTUAL MEMORY ###########
#是否开启VM功能
vm-enabled no
# vm-enabled yes
vm-swap-file logs/redis.swap
vm-max-memory 0
vm-page-size 32
vm-pages 134217728
vm-max-threads 4
############# ADVANCED CONFIG ###############
glueoutputbuf yes
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
#是否重置Hash表
activerehashing yes




启动Redis

[falcon@www.fwphp.cn  ~/redis-2.0.0]$ ./redis-server redis.conf
检测Redis是否启动:
[falcon@www.fwphp.cn  ~/redis-2.0.0]$ netstat -an -t
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State    
tcp        0      0 0.0.0.0:10022               0.0.0.0:*                   LISTEN    
tcp        0      0 0.0.0.0:6379                0.0.0.0:*                   LISTEN    
……..
[falcon@www.fwphp.cn  ~/redis-2.0.0]$ ps -ef|grep redis-server
falcon    7663     1  0 02:29 ?        00:00:00 ./redis-server redis.conf

------------------------------------------
 redis 安装配置, 以及redis的php扩展

一,什么是redis
redis是一个key-value存储系统。 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集 合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis 支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改 操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
二,安装配置redis
1,安装redis
1
2
3
4
5
wget http://redis.googlecode.com/files/redis-2.2.8.tar.gz
tar zxvf redis-2.2.8.tar.gz
mv redis-2.2.8 /usr/local/redis
cd /usr/local/redis
make && make install
2,启动redis
1
redis-server /usr/local/redis/redis.conf
3,启动redis客户端
1
2
3
4
5
$ redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
三,安装redis的PHP扩展
1,下载最新扩展https://github.com/owlient/phpredis/downloads
2,安装redis php扩展
1
2
3
4
5
6
tar  zxvf   phpredis-2.1.1.tar.gz
cd phpredis-2.1.1
/usr/local/php/bin/phpize
./configure  -with-php-config=/usr/local/php/bin/php-config
make
make install
在php.ini中添加【extension=redis.so】,重启WEB服务器
3,redis php实例
1
2
3
4
$redis=new Redis();
$redis->connect('127.0.0.1',6379);
$redis->set('test', 'Hello World');
echo $redis->get('test');

---------------------
 windows下,redis的安装和php的redis扩展安装

 首先下载一个redis的安装包:

windows:http://code.google.com/p/servicestack/wiki/RedisWindowsDownload

linux:http://code.google.com/p/redis/downloads/list

这里提供一个windows下的redis-2.0.0的版本安装包:redis-2.0.0

解压后,得到一个redis的文件夹,打开文件夹得到如下图的一些文件.

安装包中是不提供redis.conf的,关于配置可以到网上搜索一下,或者从这里直接下载:redis.conf


用命令行,切换到redis的根目录,然后启动redis服务端即redis-server.exe,


当前服务端没有1个客户端连接,因此显示0 clients,

现在分别启动两个客户端,

这里值得注意的是:当你登录redis-cli.exe的时候,服务端并没有检测到客户端的存在,也就是在客户端执行了第一次操作以后,服务端才检测到这个状态.

在windows下安装php的redis扩展非常简单,下载一个.dll扩展包放到php的ext目录下,在php.ini里边添加一行配置就可以了.

这里提供php5.3版本的redis扩展包:php_redis-5.3.zip

解压并放到php的ext目录下,打开php.ini,增加一行:
   
extension=php_redis.dll

然后,重启apache或者nginx或者IIS就可以了.

检测是否安装成功,可以打开phpinfo看下.

Redis的web界面管理工具phpRedisAdmin-

此外,之前类似phpMyAdmin的工具有Memcached和Redisd的操作管理软件MemAdmin和phpRedisAdmin.

phpRedisAdmin演示demo:http://dubbelboer.com/phpRedisAdmin/?overview

下载地址: phpRedisAdmin.tar.gz

-----------------------------------------------
https://github.com/huangz1990/redis (http://www.redisdoc.com/en/latest/)
https://github.com/antirez/redis-doc