Redis 介绍与使用

jopen 13年前
     <p>数据库主要类型有对象数据库,关系数据库,键值数据库等等,对象数据库太超前了,现阶段不提也罢;关系数据库就是平常说的MySQL,PostgreSQL这些熟的不能再熟的东西,至于键值数据库则是本文要着重说的,其代表主要有<a href="/misc/goto?guid=4958823373347471349" target="_blank">MemcacheDB</a>,<a href="/misc/goto?guid=4959499522100306110" target="_blank">Tokyo Cabinet</a>等等。</p>    <p>Redis本质上也是一种键值数据库的,但它在保持键值数据库简单快捷特点的同时,又吸收了部分关系数据库的优点。从而使它的位置处于关系数据库和键值数 据库之间。Redis不仅能保存Strings类型的数据,还能保存Lists类型(有序)和Sets类型(无序)的数据,而且还能完成排序(SORT) 等高级功能,在实现INCR,SETNX等功能的时候,保证了其操作的原子性,除此以外,还支持主从复制等功能。</p>    <p>详细描述参见<a href="/misc/goto?guid=4959499522189884800" target="_blank">官方手册</a>,同时,官方提供了一个名为<a href="/misc/goto?guid=4959499522269925211" target="_blank">Retwis</a>的项目的源代码,可以对照着<a href="/misc/goto?guid=4959499522359695588" target="_blank">官方介绍</a>学习,注意其中关于Data Layout的描述,其他没什么。</p>    <p>项目实践中,多以关系数据库为主,不过合理的使用Redis这样的键值数据库,往往能扬长避短,比如说实现一个类似消息队列的功能,对MySQL来说,除非使用<a href="/misc/goto?guid=4959499522582310462" target="_blank">Q4M</a>,否则很难满足高并发请求,不过对Redis来说,通过内建的Lists支持,消息队列就是小菜一碟。</p>    <p><strong>Redis的安装</strong></p>    <p>tar zxvf redis-version.tar.gz<br /> cd redis-version<br /> make</p>    <p>由于没有make install,所以得把源代码目录里的关键文件手动复制到适当的位置:</p>    <p>cp redis.conf /etc/<br /> cp redis-benchmark redis-cli redis-server /usr/bin/</p>    <p>如果内存情况比较紧张的话,需要设定内核参数:</p>    <p>echo 1 > /proc/sys/vm/overcommit_memory</p>    <p>然后编辑redis.conf配置文件(/etc/redis.conf),按需求做出适当调整,比如:</p>    <p>daemonize yes<br /> logfile /dev/null</p>    <p>如果要记录日志的话,最好先调整loglevel到一个合适的级别,然后设定logfile,如果不需要,则可以像上面这样直接把日子丢弃到/dev/null里,还有一点,缺省情况下,数据文件dump.rdb会被生成到当前目录,可以通过dir参数设定合适的目录。</p>    <p>此外,如果你决定把Redis用于产品环境,还要注意maxmemory选项,因为Redis在启动时会把所有数据加载到内存中,所以设定maxmemory相对安全。</p>    <p>接下来直接启动服务就可以了,只有配置文件一个参数:</p>    <p>redis-server /etc/redis.conf</p>    <p>确认运行了之后,可以用redis-benchmark命令测试看看,还可以通过redis-cli命令实际操作一下,比如:</p>    <p>redis-cli set foo bar<br /> OK<br /> redis-cli get foo<br /> bar</p>    <p>在设置键对应的值的时候,按照<a href="/misc/goto?guid=4959499522667753465" target="_blank">协议的规定</a>是要提供数据大小这个参数的,上面的redis-cli命令之所以没有提供这个参数是因为redis-cli本身进行了封装。</p>    <p>可以通过telnet来验证一点:</p>    <p>telnet 127.0.0.1 6379<br /> Trying 127.0.0.1…<br /> Connected to localhost.localdomain (127.0.0.1).<br /> Escape character is ‘^]’.<br /> set foo 3<br /> bar<br /> +OK<br /> get foo<br /> $3<br /> bar<br /> ^]<br /> telnet> quit<br /> Connection closed.</p>    <p>更多命令介绍参考<a href="/misc/goto?guid=4959499522759889095" target="_blank">文档介绍</a>。</p>    <p>Redis源代码里附带了多种客户端的扩展,比如说php(client-libraries/php),这是一个纯PHP的实现方案,也有二进制版本的实现(<a href="/misc/goto?guid=4959499522842181708" target="_blank">phpredis</a>)。其他语言即便没有现成的扩展实现,也可以自己按照协议规范写一个扩展,应该不是什么难事。</p>    <p>Redis内存要求很高,如果你的数据量很大的话,可能会导致系统使用swap,这会使性能急剧下降。此时更好的方法是通过consistent hashing把数据分布到多个服务器上,文档上给出了简单的例子解释:</p>    <p>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.</p>    <p>在线演示:<br /> <a href="/misc/goto?guid=4959499522926784119" target="_blank">http://try.redis-db.com/</a></p>    <p>参考链接:</p>    <p><a href="/misc/goto?guid=4958185538616997143" target="_blank">http://redis.io/</a></p>    <p><a href="/misc/goto?guid=4959499523034316578" target="_blank">http://github.com/jdp/redisent/tree/master</a><br /> <a href="/misc/goto?guid=4959499523119346968" target="_blank">http://github.com/owlient/phpredis</a><br /> <a href="/misc/goto?guid=4959499523289032869" target="_blank">http://rediska.geometria-lab.net/</a></p>