领略NoSQL的魅力----Hello,Redis!

什么是NoSQL?为什么要用NoSQL?

指web1.0时代以来,我们一直在使用关系型数据库,例如比较流行的关系型数据库有MySQL,SQL SERVER Oracle,但随着Web2.0时代的到来,随之而来的便是产生的海量数据以及高并发的数据库操作,这些事情所带来的是极大增大了数据库服务器及其相关服务器的负载能力,例如双“11.11”时期,其数据库操作可达千万级每秒,支付宝每分处理的事务以亿计算。为了解决以上问题,非关系型数据库即NoSQL便应运而生,市面上常见的NOSQL有Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB,Cassandra, HBase, Riak等。
以下是集中常见NoSQL产品性能比较:
![图片描述][1]

Redis简介

Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型。Redis提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上:Redis的数据结构致力于帮助用户解决问题,而不会像其他数据库那样,要求用户扭曲问题来适应数据库。除此之外,通过复制、持久化(persistence)和客户端分片(client-side sharding)等特性,用户可以很方便地将Redis扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统。

Redis安装

一、Redis的下载地址
Redis官方并没有提供Redis的windows安装包,但在github上, 有相关的下载地址,如下:
https://github.com/ServiceSta...
也可以到我的百度网盘下载,下载地址:http://pan.baidu.com/s/1gf2nuin,我下载的版本是redis-64.3.0.503.zip(64位的win系统,redis
3.0版本)。

二、Redis的安装和配置

找到下载的压缩包 redis-64.3.0.503.zip,解压后,重命名为redis-3.0,置于某个文件夹下(如D:Program Files)。

  1. 运行Redis服务器端

直接双击D:Program Filesredis-3.0目录下的redis-server.exe文件(redis服务器端),就会以窗口的形式运行Redis服务器(但该窗口不可关闭,否则,Redis服务不可用)。此种运行redis服务器的方式,没有加载指定的配置文件。如果出现如下界面

  1. 运行Redis客户端

直接双击D:Program Filesredis-3.0目录下的redis-cli.exe文件(redis客户端),如果显示127.0.0.1:6379> ,就说明客户端运行成功。
输入命令: keys *
查看所有的键
如果提示“NOAUTH Authentication required.”,则说明Redis服务器设置了密码,请输入正确的密码后,再来进行其他操作。
输入命令: auth 密码
如果提示OK,就说明密码正确。
Tips:可以将D:Program Filesredis-3.0目录下的redis-server.exe发送到桌面快捷方式,便于以后快速打开Redis客户端。

  1. 将Redis服务安装到本地服务

由于上述启动Redis服务器的方式有点复杂,且redis服务窗口不可关闭。故这里介绍如何将Redis服务安装到Windows系统的本地服务。
复制D:Program Filesredis-3.0目录下的redis.windows.conf文件,重命名为redis.conf,来作为redis的配置文件。
打开win系统的命令行,依次输入下列命令:

d: (回车,切换到d盘)

cd Program Filesredis-3.0 (回车,切换至D:Program Filesredis-3.0目录)

redis-server --service-install redis.conf --loglevel verbose (回车,安装redis本地服务,指定配置文件redis.conf)

操作完成后,就可以到win系统的本地服务管理处,查看和操作Redis服务。(计算机图标右键 -> 管理) -> 服务和应用程序 -> 服务)

  1. 设置Redis密码

编辑D:Program Filesredis-3.0目录下的redis.conf配置文件,找到如下代码:

requirepass foobared

将其复制一行,去掉前导的#注释符,将foobared改为你要设置的密码,如:
requirepass test
保存退出。
重启Redis服务,配置文件就会生效。

  1. 如何卸载Redis本地服务

打开win系统命令行,依次输入下列命令:
d:
cd Program Filesredis-3.0\
redis-server --service-uninstall
就可将Redis本地服务卸载。

  1. 安装Redis Desktop Manager

Redis Desktop Manager是一个可视化的Redis数据库管理工具,使用非常简单,这里不做介绍。
下载地址:http://pan.baidu.com/s/1i44AXal
这里提供Redis安装包以及Redis客户端的工具安装包下载链接:
Redis安装包下载:链接:https://pan.baidu.com/s/1o779TBO 密码:n8mw
Redis客户端的工具安装包下载:链接:https://pan.baidu.com/s/1hsD2mX2 密码:40nd

Jdies的相关知识

接下来我将以一段代码的形式来介绍有关于Jedis的相关操作:

public class JedisDemo1 {
    /**
     * Jedis实例
     */
    @Test
    public void demo1()
    {
        //1.设置IP地址和端口
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        //2.保存数据
        jedis.set("name", "james");
        //3.获取数据
        String value = jedis.get("name");
        System.out.println(value);
        //4.释放资源
        jedis.close();
    }
    
    /**
     * 使用连接池的方式来操纵Jedis
     */
    @Test
    public void demo2()
    {
        //活动链接池的配置对象
        JedisPoolConfig config = new JedisPoolConfig();
        //设置最大的连接数
        config.setMaxTotal(30);
        //设置最大的空闲连接数
        config.setMaxIdle(10);
        
        
        //获取连接池
        JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379);
        
        //获取核心对象Jedis
        Jedis jedis = new Jedis();            
        try {
            //通过连接池获得连接
            jedis = jedisPool.getResource();
            //设置数据
            jedis.set("name", "张三");
            jedis.set("age", "25");
            String name = jedis.get("name");
            System.out.println(name);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            //释放资源
            if(jedis!=null){
                jedis.close();
            }
            if(jedisPool!=null){
                jedis.close();
            }
        }
    }
}

该项目源码下载:链接:https://pan.baidu.com/s/1c2nlSkw 密码:1iym

Redis的5中数据结构

  1. string
    使用string时,redis大多数情况下并不会理解或者解析其含义,无论使用json、xml还是纯文本在redis看来都是一样的,只是一个字符串,只能进行strlen、append等对字符串通用的操作,无法针对其内容进一步操作。其基本操作命令有set、get、strlen、getrange、append:

    SET key value
    GET key
    STRLEN key
    GETRANGE key start end
    APPEND key value

  2. Hash
    使用hash时,在我看来,就是value本身就是一组key-value对,不过redis将这里的key称为field(但是hkeys命令为什么不叫hfields命令呢哈哈),也就是value是一组field-value对。其基本操作命令有hset、hget、

    hmset、hmget、hgetall、hkeys和hdel:
    HSET key field value
    HGET key field
    HMSET key field value [field value ...]
    HMGET key field [field ...]
    HGETALL key
    HKEYS key
    HDEL key field [field ...]

  3. List

    使用list时,value就是一个string数组,操作这组string时,可以像对待栈一样使用pop和push操作,但是这个栈两端都能进行操作;也可以像对待数组一样使用一个index参数来操作。list的操作命令略杂,主要分为两类:L开头的和R开头的,L代表LEFT或者LIST,进行一些从列表左端进行的操作,或者一些与端无关的操作;R代表RIGHT,进行一些从列表右端进行的操作。
  4. Set

set用于存储一组不重复的值,也可以进行一些集合的操作,就像数学上的集合,它是无序的。基本操作有sadd和

sismember:
SADD key member [member ...]
SISMEMBER key member
  1. Sorted Set

sorted set类似set,但是sorted set里每个元素都有一个score,这个score可用于排序和排名。基本操作有

zadd、zcount、zrank:
ZADD key score member [score member ...]
ZCOUNT key min max
ZRANK key member

Redis的持久化

redis提供了不同幅度的持久化选项:

  • RDB持久化对你的数据集基于特定的时间间隔执行时间点快照。
  • AOF持久化在每次服务器收到写操作时记入日志,当服务器重启时,这些写操作会再次执行,重构出原始的数据集。
  • 命令以只能追加的方式记入日志,记入的格式与redis协议本身相同。当日志太大时,redis会重写日志。
  • 如果你想让你的数据只在服务器运行的时候存在,可以按照你的要求完全关闭持久化功能。
  • 可以在同一个实例中结合使用AOF和RDB。注意,在这种情况下,redis重启时使用AOF文件重构原始数据集,因为这样得到的数据集更完整。

最重要的事情就是理解RDB持久化和AOF持久化之间的差别与权衡。先从RDB开始:

RDB

RDB的优点:

RDB是压缩的单个文件,表示你的某一时刻的redis数据。RDB文件非常适合备份。假如你把最近24小时中每个小时的RDB文件存档,并把最近30天每天存储一个RDB快照。这样遇到数据灾难时你就能容易地恢复各种版本的数据集了。

  • RDB适用于灾难恢复,作为一个单个的紧凑的文件,能够传输到远端的数据中心,或传到亚马逊S3(最好加密)。
  • RDB把redis的性能最大化。因为对于redis父进程,如果要执行持久化,唯一要做的就是创建一个子进程,而子进程会做所有的事情。父进程不需要执行磁盘I/O或者其它类似操作。
  • 对于数据集较大的情况,相较于AOF,RDB使得重启更快。

RDB的缺点:

  • 在Redis停止工作的情况(例如断电)下,如果你想要使数据丢失的可能性最小,RDB并不合适。你可以设置不同的保存点,在保存点上会生成RDB(例如至少5分钟且100次对数据集的写操作以后。你也可以设置多个保存点)。然而,你通常会设置成每5分钟或更长时间生成一个RDB快照。在这种情况下,如果redis因为什么原因没有经过正常关机而停止工作,你会丢失最后几分钟的数据。
  • RDB需要经过fork()通过子进程写磁盘。如果数据集很大,fork()是非常耗时的,可能导致redis在几毫秒甚至1秒的时间里停止向客户端提供服务且CPU性能也不好。AOF也需要fork(),但你可以调节重新日志的频率而不需要任何牺牲。

AOF

AOF的优点:

  • AOF更加可靠:你可以有不同的文件同步策略:没有文件同步,每秒同步,每次请求时同步。默认为每秒同步,写性能也不错(文件同步使用一个后台线程,当没有进行文件同步时,主线程会执行写操作),你只会丢失1秒内的写数据。
  • AOF的日志只能追加,因此也没有搜索操作,断电时也不会有丢失问题。即使由于某种原因(磁盘满或其它原因)导致最后一条命令只记录了一半,redis-check-aof工具也能很容易的修复它。

当AOF文件太大时,redis能够在后台自动重写AOF。重写是完全安全的。因为当redis继续向旧文件追加内容时,产生的新文件包含能够产生当前数据集的所需要的最小命令集。一但新文件准备好了,redis就会切换到第二个文件,向这个新文件追加内容。

  • AOF使用一种方便理解和分析的格式,一条一条地记录所有操作的日志。你可以很容易地导入一个AOF文件。即使你由于错误地使用FLUSHALL命令冲掉了所有命令,如果在此期间没有没有重写日志,你仍然可以恢复数据,只需要停止服务器、移除最后一条命令,然后重启服务器就可以了。

AOF的缺点

  • 相较于相同数据集同等情况下的RDB文件来说,AOF文件通过很大。

由于精确同步策略,AOF比RDB慢。通常情况下,每秒文件同步的性能仍然很好,而无文件同步的AOF和RDB的速度一样快,即使是在高负载的情况下。然而,对于大量的潜在问题,RDB还能提供更多的保障,即使是大规模的写。

  • 以前,我们对某些特殊的命令(例如一个涉及到阻塞的命令,BRPOPLPUSH)测出的bug很少,导致生成的AOF文件不能在重新加载时生成完全一样的数据集。这个bug不常见。我们在测试时自动创建随意的复杂的数据集并重新加载它们,检查是否一切正常。但这种问题在RDB持久中几乎不存在。更清楚地讲:Redis的AOF的工作原理是更新一个已经存在的状态,类似MySQL和MongoDB的作法,而RDB一次又一次地生成快照,这从理论上更健壮。然而,(1)注意,每次redis重写AOF时,它是从数据集中实际的数据开始,相对于一味向AOF追加(或重写时读取旧的AOF而不是内存中的数据)来说,这使它更强壮【1】。(2)我们至今没有发现一个来自用户的在真实使用中检测出AOF丢失数据的报告。

以上是对Redis的一个基本介绍以及一些基本的使用说明。相信你在使用Redis后一定会对它爱不释手的。

相关文章
相关标签/搜索