Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如字符串类型、散列类型、列表类型、集合类型、有序集合类型。

  1. Redis介绍
    什么是NoSQL:为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方案,就是NoSQL数据库。NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充。
    NoSQL数据库分类:
    1)键值(Key-Value)存储数据库
    相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
    典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
    数据模型: 一系列键值对
    优势: 快速查询
    劣势: 存储的数据缺少结构化
    2)列存储数据库
    相关产品:Cassandra, HBase, Riak
    典型应用:分布式的文件系统
    数据模型:以列簇式存储,将同一列数据存在一起
    优势:查找速度快,可扩展性强,更容易进行分布式扩展
    劣势:功能相对局限
    3)文档型数据库
    相关产品:CouchDB、MongoDB
    典型应用:Web应用(与Key-Value类似,Value是结构化的)
    数据模型: 一系列键值对
    优势:数据结构要求不严格
    劣势: 查询性能不高,而且缺乏统一的查询语法
    4)图形(Graph)数据库
    相关数据库:Neo4J、InfoGrid、Infinite Graph
    典型应用:社交网络
    数据模型:图结构
    优势:利用图结构相关算法。
    劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
    redis的应用场景:缓存(数据查询、短连接、新闻内容、商品内容等等,最多使用)分布式集群架构中的session分离、聊天室的在线好友列表、任务队列(秒杀、抢购、12306等等)、应用排行榜、网站访问统计、数据过期处理(可以精确到毫秒)。
  2. Redis安装配置
    Redis下载地址:http://download.redis.io/releases/
1)Redis安装:Redis是C语言开发,建议在linux上运行。
    ->1.若简约版本需在Linux下安装gcc环境(否则该步骤可以省略)
    [root@localhost redis-4.0.0]#yum install gcc-c++
    ->2.将下载的Redis源码包上传到Linux服务器中
    【需要切换到sftp窗口】
    [root@localhost ~]$ sftp root@192.168.1.103
    sftp> put -r filename
    【使用xshell的ZMODEM】
    [root@localhost java]$ rz
    ->3.解压缩Redis源码包
    [root@localhost java]# tar -zxf redis-4.0.0.tar.gz 
    ->4.编译redis源码
    [root@localhost java]# cd redis-4.0.0/
    [root@localhost redis-4.0.0]# make
    ->5.安装redis
    [root@localhost redis-4.0.0]# make install PREFIX=/opt/java/redis

  2)Redis启动
    ->1.前端启动
    启动方式:直接运行bin/redis-server将以前端模式启动。
    [root@localhost bin]# ./redis-server
    启动缺点:ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法
    启动图例:
                    _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.0 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379 --默认端口
 |    `-._   `._    /     _.-'    |     PID: 6859 --进程
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'      
    前端启动的关闭:ctrl+c
    ->2.后端启动
    1)将redis源码包中的redis.conf配置文件复制到/opt/java/redis/bin下
    [root@localhost java]# cd redis-4.0.0/
    [root@localhost redis-4.0.0]# cp redis.conf /opt/java/redis/bin
    2)修改redis.conf,将daemonize由no改为yes
    [root@localhost bin]# vim redis.conf 
    daemonize yes
    3)使用命令后端启动redis
    [root@localhost bin]# ./redis-server redis.conf 
    4)查看是否启动成功
    [root@localhost bin]# ps -ef|grep redis
    root 7155 1  0 20:51 ?  00:00:00 ./redis-server *:6379
    root 7177 6979  0 20:52 pts/2 00:00:00 grep --color=auto redis
    5)后端启动的关闭方式
    非正常关闭(不推荐使用):[root@localhost bin]# kill -9 7155
    正常关闭:[root@localhost bin]# ./redis-cli shutdown

    注意:在项目中,建议使用正常关闭。因为redis作为缓存来使用的话,将数据存储到内存中,如果使用正常关闭,则会将内存数据持久化到本地之后,再关闭。如果是强制关闭,则不会进行持久化操作,可能会造成部分数据的丢失。

  3)Redis客户端
    ->1.Redis自带的客户端,启动客户端命令
    指定主机和端口(-h:redis服务器的ip地址,-p:redis实例的端口号)
    [root@localhost bin]# ./redis-cli -h 192.168.1.103 -p 6379
    如果不指定主机和端口也可以(默认主机地址是127.0.0.1 ,默认端口是6379)
    [root@localhost bin]# ./redis-cli 
    关闭
        Ctrl+c
        127.0.0.1:6379> quit
    ->2.图形界面客户端
    1)下载图形客户端百度网盘链接:https://pan.baidu.com/s/1c274Qli,密码:m7pu
    安装之后,打开如下:

redis 的key 为什么string_安装和配置

若连接不上,设置防火墙,在iptables中加入"-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT":
    [root@localhost /]# vim /etc/sysconfig/iptables
    # sample configuration for iptables service
    # you can edit this manually or use system-config-firewall
    # please do not ask us to add additional ports/services to this default configuration
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -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 1521 -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
    编辑并保存后,重启防火墙:[root@localhost /]# service iptables restart

redis 的key 为什么string_Redis_02

Redis.conf中的数据库数量的设置:databases 16
    选择数据库的方式:
    使用select 加上数据库的下标 就可以选择指定的数据库来使用,下标从0开始
    127.0.0.1:6379> select 15
    OK
    127.0.0.1:6379[15]>

  4)Jedis客户端
    jedis介绍:Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis,托管在github上地址:https://github.com/xetorthio/jedis。
    工程搭建:
    ->1.添加jar包
        jedis-2.7.0.jar、commons-pool2-2.3.jar
    ->2.单实例连接redis
        @Test
        public void jedisClient(){
            Jedis jedis = new Jedis("10.39.12.237",6379);
            jedis.set("s4", "dd");
            String result = jedis.get("s4");
            System.out.println(result);
            jedis.close();
        }
    ->3.使用jedis连接池连接redis服务器
        @Test
        public void jedisPool(){
            JedisPool jedisPool = new JedisPool("10.39.12.237",6379);
            Jedis jedis = jedisPool.getResource();
            jedis.set("s5", "ee");
            String result = jedis.get("s5");
            System.out.println(result);
            jedis.close();
            jedisPool.close();
        }
    ->4.Spring整合jedisPool
        1)添加spring的jar包

redis 的key 为什么string_Redis_03

2)配置spring配置文件applicationContext.xml
        <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.2.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">

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

    <!-- redis单机 通过连接池 -->
    <bean id="jedisPool" class="redis.clients.jedis.JedisPool"
        destroy-method="close">
        <constructor-arg name="poolConfig" ref="jedisPoolConfig" />
        <constructor-arg name="host" value="10.39.12.237" />
        <constructor-arg name="port" value="6379" />
    </bean> 
</beans>
        3)测试代码
        @Test
        public void jedisSpring(){
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:/config/applicationContext.xml");
            JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
            Jedis jedis = pool.getResource();
            jedis.set("s6", "ff");
            String result = jedis.get("s6");
            System.out.println(result);
        }