zoukankan      html  css  js  c++  java
  • 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/

    http://github.com/jdp/redisent/tree/master
    http://github.com/owlient/phpredis
    http://rediska.geometria-lab.net/

  • 相关阅读:
    redis搭建集群并用TreeSoft管理
    使用windows任务计划程序自动清除C盘缓存文件
    深入理解JavaScript事件循环机制
    redux源码解读(二)
    redux源码解读(一)
    create-react-app源码解读之为什么不搞个山寨版的create-react-app呢?
    深入理解CSS系列(二):为什么height:100%不生效?
    深入理解CSS系列(一):理解CSS的盒子模型
    搭建一个交互式的前端构建环境.md
    实习这件小事(一位大四狗的前端实习经历)
  • 原文地址:https://www.cnblogs.com/suifengbingzhu/p/3737009.html
Copyright © 2011-2022 走看看