Redis--Nosql数据库

目录:
1、    redis介绍
    a)    什么是NoSql
    b)    NoSql的分类
    c)    什么是redis
    d)    Redis应用场景
2、    redis安装和启动
3、    redis客户端
    a)    redis自带客户端
    b)    图形界面的客户端(了解)
    c)    Java客户端jedis(重点)
4、    Redis数据类型(重点)
    a)    string类型
    b)    hash散列类型
    c)    List类型
    d)    Set类型
    e)    SortedSet
5、    Keys命令(了解)
6、    Redis的持久化方案
    a)    Rbd方式
    b)    Aof方式
7、    Redis的主从复制
8、    Redis的集群(重点)
9、    Jedis连接redis集群

 

1、Redis介绍

    * 什么是NoSql?
        - 为了解决高并发、高可用、高可扩展,大数据存储等一系列问题而产生的数据库解决方案,就是NoSql。
        - NoSql,叫非关系型数据库,它的全名Not only sql。它不能替代关系型数据库,只能作为关系型数据库的一个良好补充。
    * NoSql的分类
        - 键值(Key-Value)存储数据库
            相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
            典型应用:内容缓存,主要用于处理大量数据的高访问负载。
            数据模型:一系列键值对
            优势:快速查询
            劣势:存储的数据缺少结构化
        - 列存储数据库
            相关产品:Cassandra, HBase, Riak
            典型应用:分布式的文件系统
            数据模型:以列簇式存储,将同一列数据存在一起
            优势:查找速度快,可扩展性强,更容易进行分布式扩展
            劣势:功能相对局限
        - 文档型数据库
            相关产品:CouchDB、MongoDB
            典型应用:Web应用(与Key-Value类似,Value是结构化的)
            数据模型:一系列键值对
            优势:数据结构要求不严格
            劣势:查询性能不高,而且缺乏统一的查询语法
        - 图形(Graph)数据库
            相关数据库:Neo4J、InfoGrid、Infinite Graph
            典型应用:社交网络
            数据模型:图结构
            优势:利用图结构相关算法。
            劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。

    * 什么是redis
        - Redis是使用c语言开发的一个高性能键值数据库。Redis可以通过一些键值类型来存储数据。
        - 键值类型:
            String字符类型
            hash散列类型
            list列表类型
            set集合类型
            sortedset有序集合类型

    * redis历史发展
            2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便对MySQL的性能感到失望,
        于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,
        而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,
        直到今天。
            Salvatore Sanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News在2012年发布了一份数据库的使用情况调查,
        结果显示有近12%的公司在使用Redis。国内如新浪微博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。
        VMware公司从2010年开始赞助Redis的开发, Salvatore Sanfilippo和Pieter Noordhuis也分别在3月和5月加入VMware,全职开发Redis。

    * redis的应用场景
        缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
        分布式集群架构中的session分离。
        聊天室的在线好友列表。
        任务队列。(秒杀、抢购、12306等等)
        应用排行榜。
        网站访问统计。
        数据过期处理(可以精确到毫秒)

 

2、redis安装和启动

    * redis下载
        官网地址:http://redis.io/
        下载地址:http://download.redis.io/releases/redis-3.0.0.tar.gz

    * redis的安装
        redis的安装环境会安装到linux系统中。
        第一步:安装VMware,并且在VMware中安装centos系统(参考linux教程)。
        第二步:将redis的压缩包,上传到linux系统
        第三步:对redis的压缩包进行解压缩
        Redis解压缩之后的文件是用c语言写的源码文件
        [root@itheima ~]# tar -zxf redis-3.0.0.tar.gz

        第四步:安装c语言环境(安装centos之后,自带c语言环境)
        [root@itheima ~]# yum install gcc-c++
        第五步:编译redis源码
        [root@itheima ~]# cd redis-3.0.0
        [root@itheima redis-3.0.0]# make

        第六步:安装redis
        [root@itheima redis-3.0.0]# make install PREFIX=/usr/local/redis19

        第七步:查看是否安装成功
                
    * redis启动        
        - 前端启动
            前端启动的命令:
                [root@itheima bin]# ./redis-server
            前端启动的关闭:
                强制关闭:Ctrl+c
                正常关闭:[root@itheima bin]# ./redis-cli shutdown
            前端启动的问题:
                一旦客户端关闭,则redis服务也停掉。
        
        - 后端启动
            第一步:需要将redis解压之后的源码包中的redis.conf文件拷贝到bin目录下
                [root@itheima bin]# cp /root/redis-3.0.0/redis.conf ./

            第二步:修改redis.conf文件,将daemonize改为yes
                先要使用vim redis.conf
    
            第三步:使用命令后端启动redis
                [root@itheima bin]# ./redis-server redis.conf
                
            第四步:查看是否启动成功
                ps -aux|grep redis
                
        - 关闭后端启动的方式:
            强制关闭:[root@itheima bin]# kill -9 5071
            正常关闭:[root@itheima bin]# ./redis-cli shutdown

            在项目中,建议使用正常关闭。
            因为redis作为缓存来使用的话,将数据存储到内存中,如果使用正常关闭,则会将内存数据持久化到本地之后,再关闭。

            如果是强制关闭,则不会进行持久化操作,可能会造成部分数据的丢失。

 

3、Redis客户端

    * Redis自带的客户端
        - 启动
            启动客户端命令:[root@itheima bin]# ./redis-cli -h 127.0.0.1 -p 6379
            -h:指定访问的redis服务器的ip地址
            -p:指定访问的redis服务器的port端口

            还可以写成:[root@itheima bin]# ./redis-cli
            使用默认配置:默认的ip【127.0.0.1】,默认的port【6379】
        - 关闭
            Ctrl+c
            127.0.0.1:6379> quit

    * 图形界面客户端

  安装包

Redis--Nosql数据库

  安装后,打开的界面

Redis--Nosql数据库

 

 * 客户端要连接上redis,需要设置防火墙打开端口。防火墙设置:
        [root@itheima redis-3.0.0]# vim /etc/sysconfig/iptables
        # Firewall configuration written by system-config-firewall
        # Manual customization of this file is not recommended.
        *filter
        :INPUT ACCEPT [0:0]
        :FORWARD ACCEPT [0:0]
        :OUTPUT ACCEPT [0:0]
        -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        -A INPUT -p icmp -j ACCEPT
        -A INPUT -i lo -j ACCEPT
        -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
        -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
        -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
        -A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
        -A INPUT -j REJECT --reject-with icmp-host-prohibited
        -A FORWARD -j REJECT --reject-with icmp-host-prohibited
        COMMIT
        ~                                                                                                                                                                                                                                                                                                       
        "/etc/sysconfig/iptables" 16L, 677C 已写入
        [root@itheima redis-3.0.0]# service iptables restart
        iptables:清除防火墙规则:                                 [确定]
        iptables:将链设置为政策 ACCEPT:filter            [确定]
        iptables:正在卸载模块:                                   [确定]
        iptables:应用防火墙规则:                                 [确定]
        [root@itheima redis-3.0.0]#

 

* Jedis客户端
        - jedis介绍
            Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。
            在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。
            在企业中用的最多的就是Jedis,下面我们就重点学习下Jedis。
            Jedis同样也是托管在github上,地址:https://github.com/xetorthio/jedis

        - 工程搭建
            创建java project
            添加jar包:commons-pool2-2.3.jar和jediss-2.7.0.jar
           
        - 单实例连接redis

@Test 
public void jedisClient() {
    Jedis jedis = new Jedis("192.168.242.137",6379);
    jedis.set("s2","222");
    String result = jedis.get("s2");
    System.out.println(result);
    jedis.close();
}

        - 使用jedis连接池连接redis服务器

@Test
public void jedisPool() {
    JedisPool pool = new JedisPool("192.168.242.137",6379);
    Jedis jedis = pool.getResource();
    jedis.set("s4","444");
    String result = jedis.get("s4");
    System.out.println(result);
    jedis.close();
    pool.close();
}

    * Spring整合jedisPool

  配置spring配置文件applicationContext.xml

<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <!-- 最大连接数 -->
    <propertyname="maxTotal"value="30"/>
    <!-- 最大空闲连接数 -->
    <propertyname="maxIdle"value="10"/>
    <!-- 每次释放连接的最大数目 -->
    <propertyname="numTestsPerEvictionRun"value="1024"/>
    <!-- 释放连接的扫描间隔(毫秒) -->
    <propertyname="timeBetweenEvictionRunsMillis"value="30000"/>
    <!-- 连接最小空闲时间 -->
    <propertyname="minEvictableIdleTimeMillis"value="1800000"/>
    <!-- 连接空闲多久后释放, 当空闲时间>该值且空闲连接>最大空闲连接数时直接释放 -->
    <propertyname="softMinEvictableIdleTimeMillis"value="10000"/>
    <!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
    <propertyname="maxWaitMillis"value="1500"/>
    <!-- 在获取连接的时候检查有效性, 默认false -->
    <propertyname="testOnBorrow"value="false"/>
    <!-- 在空闲时检查有效性, 默认false -->
    <propertyname="testWhileIdle"value="true"/>
    <!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
    <propertyname="blockWhenExhausted"value="false"/>
</bean>

<!-- redis单机通过连接池 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
    destroy-method="close">
    <constructor-argname="poolConfig" ref="jedisPoolConfig"/>
    <constructor-argname="host" value="192.168.242.130"/>
    <constructor-argname="port" value="6379"/>
</bean>

        测试代码:

@Test
publicvoid testJedisPool() {
    JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
    Jedis jedis = null;
    try {
        jedis = pool.getResource();
        jedis.set("name", "lisi");
        String name = jedis.get("name");
        System.out.println(name);
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        if (jedis != null) {
            // 关闭连接
            jedis.close();
        }
    }
}

 

4、redis数据类型

    string字符类型,hash散列类型,list列表类型,set集合类型,sortedset有序集合类型

redis命令操作(一)--键key,字符串String

redis命令操作(二)--哈希Hash,列表List

redis命令操作(三)--集合Set,有序集合ZSet

 

5、 Keys命令

redis命令操作(一)--键key,字符串String

 

6、Redis的持久化方案

6.1、 rbd方式

  rdb方式是redis默认的方式,redis通过快照来将数据持久化到磁盘中。

  在redis.conf中修改持久化快照的条件,如下:

Redis--Nosql数据库

 

  在redis.conf中可以指定持久化文件存储的目录

Redis--Nosql数据库

 

  rdb方式存在的问题

  一旦redis非法关闭,那么会丢失最后一次持久化之后的数据。如果数据不重要,则不必要关心。如果数据不能允许丢失,那么要使用aof方式。

 

6.2、aof方式

  Redis默认是不使用该方式持久化的。Aof方式的持久化,是操作一次redis数据库,则将操作的记录存储到aof持久化文件中。

  第一步:开启aof方式的持久化方案
  将redis.conf中的appendonly改为yes,即开启aof方式的持久化方案。

Redis--Nosql数据库

 

  Aof文件存储的目录和rdb方式的一样。

  Aof文件存储的名称

Redis--Nosql数据库

 

 6.3、结论

  在使用aof和rdb方式时,如果redis重启,则数据从aof文件加载。

 

7、 Redis的主从复制

7.1、什么是主从复制

  持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障,如下图:

 

 

Redis--Nosql数据库

  说明:

主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务。
主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。
只有一个主redis,可以有多个从redis。
主从复制不会阻塞master,在同步数据时,master 可以继续处理client 请求

  一个redis可以即是主又是从,如下图:

Redis--Nosql数据库

 

  

7.2、主从复制设置

  主机无需设置。

  从机设置:

第一步:复制出一个从机
[root@itheima redis19]# cp bin/ bin2 –r


第二步:修改从机的redis.conf
语法:Slaveof masterip masterport
slaveof 192.168.242.137 6379
Redis--Nosql数据库

 

第三步:修改从机的port地址为6380

在redis.conf中修改
Redis--Nosql数据库

 

 

第四步:清除从机中的持久化文件
[root@itheima bin2]# rm -rf appendonly.aof dump.rdb

第五步:启动从机
[root@itheima bin2]# ./redis-server redis.conf

第六步:启动6380的客户端
[root@itheima bin2]# ./redis-cli -p 6380

 

注意:
    主机一旦发生增删改操作,那么从机会将数据同步到从机中
    从机不能执行写操作

127.0.0.1:6380> set s2 222
(error) READONLY You can‘t write against a read only slave.

 

8、 Redis的集群(重点)

 

 

 

 

9、Jedis连接redis集群   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

---

Redis--Nosql数据库

上一篇:SQL----EXISTS 关键字EXISTS基本意思


下一篇:MySQL主从复制