目前的互联网应用广泛使用两种方式进行数据存储:关系型数据库 和 NoSQL数据库 

关系型数据库是指采用关系型模型来组织数据的数据库,主要用于存储格式化的数据结构,大量传统数据库如:MySQL、Oracle、SQLServer

NoSQL数据库泛指非关系型数据库,主要服务于特定背景的专用数据库,对外提供的是特定的API,而非通用的SQL接口,数据访问更加高效

Redis是开源、高性能的key-value数据库,属于NoSQL数据库 

Redis的特点

不仅支持简单的string类型数据,同时还提供list、set、zset、hash等数据结构的存储

支持数据持久化,可以将内存中的数据保存在磁盘中

支持主从(master-slave)模式的数据备份

 Linux环境Redis安装及配置

安装虚拟机  安装CentOS-7.0.docx

在虚拟机上安装linux系统  安装vmware.docx

安装Xftp  傻瓜式安装

安装Xshell  傻瓜式安装

Xftp6如何连接虚拟机 Windows与虚拟机之间传输文件

查看redis日志配置在哪 redis日志文件位置_redis

弹出下面界面,这样传输就很方便了

查看redis日志配置在哪 redis日志文件位置_java_02

 

安装Redis

Linux版本的Redis安装包 官网地址是 https://redis.io 

打开Xftp软件,并连接虚拟机;将Linux版本的安装包复制至Linux服务器的某目录(如:/home/dxp/anzhuangbao)

查看redis日志配置在哪 redis日志文件位置_java_03

在Xftp软件界面中点击如下位置,即可进入Xshell界面

查看redis日志配置在哪 redis日志文件位置_Redis_04

  

解压redis-6.2.4.tar.gz,在Xshell界面中输入tar -zxvf redis-6.2.4.tar.gz

查看redis日志配置在哪 redis日志文件位置_数据库_05

 

进入解压之后的redis-6.2.4目录,执行编译和安装命令,如下

进入:cd redis-6.2.4

安装:make PREFIX=/home/dxp/ruanjian/redis-6.2.4 install

PREFIX参数是配置安装时的顶级目录名,一般而言,如果不配置,该选项默认为/user/local,安装后可执行文件默认放在/user/local/bin中,库文件默认放在/user/local/lib中,配置文件默认放在/user/local/etc中,其他的资源文件则放在/user/local/share中,各类文件的放置位置比较分散。上述命令通过配置PREFIX参数,指定将存放各类文件的目录都集中创建在/home/dxp/ruanjian/redis-6.2.4目录中

 

查看redis日志配置在哪 redis日志文件位置_redis_06

当出现如下效果时,则表示安装成功

查看redis日志配置在哪 redis日志文件位置_redis_07

 

安装过程会根据PREFIX参数的设置,在/home/dxp/ruanjian目录下创建redis-6.2.4/bin目录结构,其中包含与Redis相关的可执行文件。如下图所示,其中redis-server用于启动Redis服务,redis-cli用于启动操作Redis的客户端。

查看redis日志配置在哪 redis日志文件位置_查看redis日志配置在哪_08

 

最后,在/home/dxp/ruanjian/redis-6.2.4目录下创建 etc 目录,并将即/home/dxp/anzhuangbao/redis-6.2.4目录下的redis.conf文件复制至其中,此文件为Redis的配置文件

mkdir 创建文件夹的位置/创建文件夹的名称

cp 当前路径下要被复制的文件名称/要复制到指定位置的路径

 

查看redis日志配置在哪 redis日志文件位置_查看redis日志配置在哪_09

 配置Redis(暂时先不配置)

为了能够更好地使用Redis服务,安装完成后还需要对Redis进行多方面配置

1.设置内存分配策略

在/proc/sys/vm/overcommit_memory 文件中指定内存分配策略。此为可选配置,可根据服务器的实际情况进行设置,可选值包括0、1、2共3种。

命令:echo 1 > /proc/sys/vm/overcommit_memory

执行该命令需要使用root账户

2.开放Redis端口

Redis默认占用6379端口,需要在防火墙中设置开发对此端口的访问。步骤如下

1)编辑防火墙配置文件

      命令:vim/etc/sysconfig/iptables

2)添加如下原则

       命令:-A INPUT -m state --state  NEW -m tcp -p tcp --dport 6379 -j ACCEPT

3)重新加载规则

        命令:service   iptables   restart

3.设置Redis配置文件

在安装Redis时,曾将Redis配置文件redis.conf复制至安装位置/etc目录下,编辑此文件中的配置指令可控制Redis运行时行为

命令:vim /home/dxp/ruanjian/redis-6.2.4/etc/redis.conf

进入到编辑页面   先按个a   开始进行输入

完事后按esc键,输入“:wq”   回车

设置Redis服务可以监听的请求IP地址,多个IP地址使用空格分隔

命令:bind 127.0.0.1 ::1

在redis.conf中bind的默认配置为bind 127.0.0.1,表示Redis仅能监听来自本机的IPv4请求,若将其

修改为bind 0.0.0.0 或 使用“#”将bind指令注释掉,则可监听所有IP地址的请求。

如果Redis服务运行于Internet上,则绑定所有IP地址是危险的,建议仅绑定与应用相关的客户端IP地址。如bind 192.168.1.100 10.0.0.1

 

 

设置Redis监听的端口

使用port配置指令可以设置Redis监听的端口,默认为6379

命令:port 6379

设置Redis是否作为守护进行运行,默认 no

命令:daemonize yes

在redis.conf中该指令默认设置为daemonize no,即在默认情况下,Redis不作为守护进程,而是作为会话进程运行。在这种情况下,执行redis启动命令后不会返回到命令提示符,且不能关闭会话,否则Redis服务会停止。如果需要Redis作为守护进程于后台运行,则将其修改为daemonize yes即可。

设置Redis的日志文件路径,默认"",不生成日志文件

命令:logfile  "/home/dxp/ruanjian/redis-6.2.4/log/redis.log"

设置Redis数据库的数量,默认数量为16,对应的dbid范围是0~15;默认情况下一个客户端连接到数据库 0

设置数据库数量命令:databases 16

切换数据库(默认有 0-15)命令:select 0

1. Redis中不同的可选数据库以命名空间的形式管理,数据文件是同一个

2. Redis划分数据库主要用于在必要的情况下分隔同一应用中存储的key(不同数据库中可以使用相同名称的key),而不是为了区分多个应用

 

 

 

设置Redis的工作目录

设置Redis的工作目录(即Redis的数据文件的存储目录),在redis.conf中默认为 ./,即在Redis安装目录下。可将其修改至其他路径

命令:dir /data/redisdata/

设置Redis的访问密码,默认不需要密码

命令:requirepass  123456

由于Redis的高性能特性,可以在很短的时间内并行尝试大量密码,因此应使用一个高强度的密码

启动Redis

安装好Redis之后,我们就该学习如何启动Redis服务及如何使用Redis自带的客户端连接Redis

1.启动Redis服务

执行Redis安装目录下bin目录中的redis-server命令,启动Redis服务

命令:cd  /home/dxp/ruanjian/redis-6.2.4/bin

./redis-server ../etc/redis.conf

查看redis日志配置在哪 redis日志文件位置_数据库_10

命令执行后并未返回命令提示符位置,可知此时Redis是以会话进程而非守护进程方式启动的,即在redis.conf中daemonize指令为no。

若想再次切换到启动命令的会话窗口,使用Ctrl+C组合键可以终止当前命令的执行,Redis服务停止运行并回到命令提示符位置。

只想回到命令提示符位置,不想停止Redis服务

解决方案一:可以打开一个新的会话窗口

解决方案二:修改redis.conf中daemonize指令为yes

查看redis日志配置在哪 redis日志文件位置_redis_11

 

通过查看进程信息可以确认Redis服务正在后台运行  

查看进行命令:ps -ef | grep :查看进程信息

查看redis日志配置在哪 redis日志文件位置_redis_12

若想终止Redis服务的进程,可以使用kill命令杀掉该进程

杀进程命令:kill -9 进程ID

2.启动Redis客户端

执行Redis安装目录下bin目录中的redis-cli命令

查看redis日志配置在哪 redis日志文件位置_Redis_13

命令:### 连接到本地Redis服务中dbid为0数据库

cd /home/dxp/ruanjian/redis-6.2.4

./bin/redis-cli

查看redis日志配置在哪 redis日志文件位置_数据库_14

 

 Redis常用命令

 auth命令——用于在受密码保护的Redis服务器中请求进行身份认证

语法:auth  password

如果password与配置文件中的密码匹配,则服务器将回复OK状态代码 并开接收受命令,否则将返回错误信息

默认访问Redis服务不需要密码,设置密码需在Redis配置文件redis.conf设置Redis的访问密码

set命令——设置key以保存value(string类型) 

 语法:set  key  value  [ex  seconds | px  milliseconds]  [nx | xx]

参数介绍:

ex:设置指定的过期时间seconds,以秒为单位

px:设置指定的过期时间milliseconds,以毫秒为单位

nx:仅在key不存在时设置该key(只创建、不覆盖)

xx:仅在key已存在时设置该key(只覆盖、不创建)

如果set正确执行,则返回字符串ok。如果因为用户指定了nx或xx选项但未满足条件而未执行set操作,则返回空回复nil,如图

查看redis日志配置在哪 redis日志文件位置_查看redis日志配置在哪_15

get命令——获取key对应value 

 语法:get  key

如果key不存在,则返回特殊值nil。如果存储在key中的值不是字符串,则返回错误,因为get仅处理字符串值,如图

查看redis日志配置在哪 redis日志文件位置_查看redis日志配置在哪_16

exists命令——判断指定的key是否存在 

 从Redis 3.0.3开始,可以指定多个key

语法:exists  key1  [key2  ...]

仅指定一个key时,key存在返回1,不存在返回0。指定多个key时,返回存在的key的总数,如图

 

查看redis日志配置在哪 redis日志文件位置_数据库_17

keys命令——返回和pattern(模式)匹配的所有key

语法:keys  pattern

支持的常用模式如下:

h?llo      :匹配单个字符,如hello,hallo,hxllo等

h*llo      :匹配任意字符,如hllo,heeeello等

h[ae]llo  :包含一个指定字符,如hello或hallo

h[^ae]llo:包含除指定字符外的一个字符,如hbllo,hcllo等,不包括hallo和hello

h[a-c]llo :匹配指定范围内的一个字符,如hallo,hbllo,hcllo

如需匹配以上模式中特殊字符,需要使用 \ 转义,如需匹配*字符,应使用\*

查看redis日志配置在哪 redis日志文件位置_数据库_18

del命令——删除指定的key 

 语法:del  key1  [key2  ...]

删除指定的key,返回已删除的key的数量,如果key不存在,则忽略该key

查看redis日志配置在哪 redis日志文件位置_查看redis日志配置在哪_19

rename命令——将key重命名为newkey 

 语法:rename  key  newkey

将key重命名为newkey,当key不存在时返回错误。如果newkey已经存在则会被覆盖(此时rename执行隐式del操作)

查看redis日志配置在哪 redis日志文件位置_Redis_20

expire命令——在key上设置超时时间timeout,时间以秒为单位 

 语法:expire  key  timeout

在key上设置超时时间timeout,时间以秒为单位,若key超时将被自动删除。若设置成功则返回1,若key不存在则返回0

注意:

1如果设置一个非正的timeout参数,将导致key被删除

2对已经设置了超时时间的key调用expire命令,该key的超时时间将更新为新值

3删除key或覆盖key的内容会清除该key的超时设置,如del、set操作

4如果使用rename命令重命名key,则相关的剩余生存时间将转移到新key

ttl命令——以秒为单位返回key的剩余生存时间

语法:ttl  key

Redis 2.8及以上版本,key未设置超时时间(即永久有效)返回-1,key不存在(或已超时而被删除)返回-2。

Redis 2.6及以下版本,未设置超时时间和key不存在均返回-1

查看redis日志配置在哪 redis日志文件位置_Redis_21

persist命令——删除key上现有的超时设置,使key变为永久有效

语法:persist  key

如果超时设置被删除则返回1;

如果key不存在或没有关联的超时设置则返回0

查看redis日志配置在哪 redis日志文件位置_redis_22

select命令——用于选择具有指定dbid的Redis逻辑数据库

语法:select  dbid   例如select 2

 

查看redis日志配置在哪 redis日志文件位置_Redis_23

 

flushdb命令——删除当前所选数据库中的所有key

语法:flushdb

查看redis日志配置在哪 redis日志文件位置_查看redis日志配置在哪_24

flushall命令——删除所有现有数据库中的所有key,而不仅仅是当前选定的数据库

语法:flushall

 

查看redis日志配置在哪 redis日志文件位置_Redis_25

quit命令——要求服务器关闭连接

语法:quit

127.0.0.1:6379>shutdown

not connected>exit

Redis图形化客户端

除了可以使用Xshell命令行,还可以使用图形化客户端操作Redis

 

查看redis日志配置在哪 redis日志文件位置_数据库_26

1.修改redis.conf,bind 0.0.0.0 允许所有客户端访问

vim /home/dxp/ruanjian/redis-6.2.4/etc/redis.conf

2.切换root,su root即可切换,执行 iptables -A INPUT -ptcp --dport 6379 -j ACCEPT

3.关闭防火墙

firewall-cmd --state  #查看默认防火墙状态(关闭后显示not running,开启后显示running)

systemctl stop firewalld.service  #停止防火墙

systemctl disable firewalld.service  #禁止防火墙开机启动

service iptables restart  #重新启动防火墙

查看redis日志配置在哪 redis日志文件位置_查看redis日志配置在哪_27

4.启动redis,使用客户端连接就可以

windows环境Redis安装及配置

windows版的Redis可以从GitHub上获取,其发行版的下载地址为 Releases · microsoftarchive/redis · GitHub ,可以选择 mis格式的安装版 或 zip格式的解压缩版

windows版的Redis目录结构如图:

查看redis日志配置在哪 redis日志文件位置_数据库_28

打开一个cmd窗口,使用cd命令切换到Redis安装目录下


redis-server.exe redis.windows.conf


如果想方便的话,可以把Redis的路径加到系统的环境变量里,这样就省得再输路径了,后面的那个redis.windows.conf可以省略;如果省略,会启用默认的。输入之后。会显示如下界面:

查看redis日志配置在哪 redis日志文件位置_查看redis日志配置在哪_29

这时候另启一个cmd窗口,原来的不要关闭,不然就无法访问服务端了。

切换到redis目录下运行


redis-cli.exe -h 127.0.0.1 -p 6379


在java应用中访问Redis

若想在应用中访问Reids,就需要在应用中实现Redis客户端的功能。对于目前主流的几种开发语言,都有多种Redis客户端组件可供选择,Jedis就是一个非常受推荐的小巧而强大的面向java语言的Redis客户端。

获取所需组件

查看redis日志配置在哪 redis日志文件位置_查看redis日志配置在哪_30

可以在 http://search.maven.org 网站上搜索Jedis的不同版本进行下载

Jedis的使用思路

在Jedis中,封装了Redis访问API的核心类是Jedis类。

多线程环境下,不应使用同一个Jedis实例,因为单个Jedis实例不是线程安全的;

应使用JedisPool,它是一个线程安全的网络连接池。

创建JedisPool所需设置的参数可以通过JedisPoolConfig类进行封装。

JedisPoolConfig:连接池配置对象

maxTotal:最大活动连接数,默认为8。-1表示不限制

maxIdle:最大空闲连接数,默认为8

minIdle:最小空闲连接数,默认为0

maxWaitMillis:从池中获取一个资源时的最大等待时间,单位是毫秒,-1表示永不超时

testOnBorrow:在从池中获取一个资源时,是否提前进行验证操作

JedisPool:连接池对象

Jedis:封装Redis访问API的核心类

演示案例:

 

1.构建JedisPoolConfig 及 JedisPool

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.JedisPoolConfig;

public class JedisDemo {

    private static JedisPool jedisPool;

    static {

        //创建并设置连接池配置对象

        JedisPoolConfig config=new JedisPoolConfig();

        config.setMaxTotal(50);//连接池最大连接数,默认为8

        config.setMaxIdle(10);//连接池中的最大空闲连接,默认为8

        config.setMinIdle(7);//连接池中的最小空闲连接,默认为0

        config.setMaxWaitMillis(1000);//获取资源的等待时间

        config.setTestOnBorrow(true);//获取资源时是否验证资源的有效性

        //创建jedis连接池

        jedisPool=new JedisPool(

                config,//连接池配置对象

                "127.0.0.1",//Redis服务器地址

                6379,//Redis服务端口号

                10000,//连接超时时间,单位为毫秒,默认为2000ms

                "123456",//密码

                0//数据库索引

                );

    }

    public void destroy() {

        if (!(jedisPool == null || jedisPool.isClosed()))

            jedisPool.close();  // 关闭连接池

    }

}

2.在上面代码的基础上完善JedisAPI类的定义,增加操作Redis所需的方法

    /**
     * 将字符串value设置为key的值
     * @param key
     * @param value
     * @return
     */
    public boolean set(String key, String value) {

       Jedis jedis=null;

        try {

            jedis=jedisPool.getResource();//从池中获取Jedis实例

            jedis.set(key,value);

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }finally {

            //返还到连接池

            if(jedis!=null){

                jedis.close();

            }

        }
    }

    /**
     * 将字符串value设置为key的值,并设置以秒为单位的过期时间
     * @param key
     * @param seconds 有效期
     * @param value
     * @return
     */
    public boolean set(String key, int seconds, String value) {
        Jedis jedis=null;
        try {
            jedis=jedisPool.getResource();//从池中获取Jedis实例
            jedis.setex(key,seconds,value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }finally {
            //返还到连接池
            if(jedis!=null){
                jedis.close();
            }
        }
    }
    /**
     * 判断指定的key是否存在,如果存在返回true;不存在返回false
     * @param key
     * @return
     */

    public boolean exist(String key) {

        Jedis jedis=null;

        try {

            jedis=jedisPool.getResource();//从池中获取Jedis实例

            return jedis.exists(key);

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }finally {

            //返还到连接池

            if(jedis!=null){

               jedis.close();
            }
        }
    }

    /**
     * 获取key对应的value
     * @param key
     * @return
     */
    public String get(String key) {

       Jedis jedis=null;

        String value=null;

        try {

            jedis=jedisPool.getResource();//从池中获取Jedis实例

            value=jedis.get(key);

        } catch (Exception e) {

            e.printStackTrace();

        }finally {

            //返还到连接池

            if(jedis!=null){

                jedis.close();

            }
        }

        return value;
    }



    /**
     * 以秒为单位返回key的剩余生存时间
     * Redis 2.8及以上版本,key未设置超时时间(即永久有效)返回-1,key不存在(或已超时而被删除)返回-2。
     * Redis 2.6及以下版本,未设置超时时间和key不存在均返回-1
     * @param key
     * @return
     */

    public Long ttl(String key) {

        Jedis jedis=null;

        long num=(long)-2;

        try {

            jedis=jedisPool.getResource();//从池中获取Jedis实例

            num= jedis.ttl(key);

        } catch (Exception e) {

            e.printStackTrace();

        }finally {

            //返还到连接池


            if(jedis!=null){

                jedis.close();
            }

        }

        return num;
    }

    /**
     * 删除指定的key
     * @param key
     */

    public void delete(String key) {

        Jedis jedis=null;
        try {
            jedis=jedisPool.getResource();//从池中获取Jedis实例

            jedis.del(key);

        } catch (Exception e) {

            e.printStackTrace();

        }finally {

            //返还到连接池

            if(jedis!=null){

                jedis.close();
            }
        }
    }

当Jedis类的实例使用完毕后,务必调用其close方法,将其释放回池中

3.通过Junit对上述功能进行测试

import com.msds.demo.JedisDemo;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

public class TestJedis {

    /*private JedisDemo jedisDemo;
    @Before

    public void startUp(){
        jedisDemo=new JedisDemo();
    }

    @After

    public void tearDown(){

        if(jedisDemo!=null){

            jedisDemo.destroy();
        }
    }

    @Test

    public void test01(){

        System.out.println(jedisDemo.set("one","oneValue"));
    }*/

    @Test

    public void test02(){

       JedisDemo jedisDemo=new JedisDemo();

        System.out.println(jedisDemo.set("one","oneValue"));

        if(jedisDemo!=null){

            jedisDemo.destroy();

        }

    }

}

 

查看redis日志配置在哪 redis日志文件位置_Redis_31

 

查看redis日志配置在哪 redis日志文件位置_查看redis日志配置在哪_32

 

安装虚拟 

CentOS

用户名:dxp

密码:123456