Redis概述、基本使用以及Java连接Redis

一、NoSql

概述:

not only sql 不仅仅是sql,通常指非关系型数据库

关系型数据库和非关系型数据库:

特点关系型数据库非关系型数据库
存储介质以文件的方式存储在硬盘中通常只是存储在内存中,服务器关闭可能会丢失数据
优点数据可以永久保存存取速度非常快
缺点1.数据添加有校验的过程
2.查询的速度比较慢
3.DML操作需要用到事务
这些限制会让速度变得很慢
数据不能及时保存,可能会导致数据丢失

为什么要使用NoSql数据库:

1.可以解决高并发数据访问的问题

2.可以解决高海量数据的存储的问题

二、Redis

1.Redis的物种数据结构和类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rx1SaC0z-1601384624703)(img/image-20200929162658775.png)]

注意事项:

1.key的名字不要太长,太长会影响查询速度

2.key也不要太短,会降低可读性

建议长度不要超过1024,如果长度不够尽量使用可以减少长度方式来命名避免因为长度而降低可读性

2.Windows下的Redis:

Redis的目录结构:

文件作用
redis-benchmark.exe用于redis的性能测试工具
redis-check-aof.exeAOF日志文件修复工具
redis-check-dump.exeRDB文件修改工具
redis-cli.exe命令行客户端工具
redis-server.exe服务器端的启动程序
redis.windows.confredis在windows下的配置文件

Redis的安装:

直接取官网下载压缩包,找到要放置的位置解压即可

安装主要事项:

1.目录不能包含中文

2.目录不能太深

3.硬盘至少有20G以上的存储空间

redis的启动和关闭:

双击运行redis-server.exe文件即可,关闭的话直接关闭即可

3.Redis基本命令操作

String类型的命令语法:

命令说明
set 键 值添加或修改键值对
get 键根据键获得值
del 键根据键删除键值对

在这里插入图片描述

hash类型的命令语法:

命令说明
hset 键 字段 值向指定的键中添加一对hash类型的字段名和值
hget 键 字段取出指定键的指定字段的值
hmset 键 字段 值 字段 值mulitple,一次向某个键中设置多个字段名和值
hmget 键 字段 字段一次从指定的键中得到多个字段的值
hdel 键 字段 字段删除一个键中的一个或多个字段
hgetall 键得到某个键所有的字段值

在这里插入图片描述

hash的底层数据结构对应的是Java中的HashMap

list类型命令语法:

命令说明
lpush 键 元素 元素left push 在列表的左边向指定键中添加列表元素,如果这个键不存在就为这个键创建一个新的链表,如果存在则是向list添加元素
rpush 键 元素 元素right push 在列表的右边向指定的键中添加列表元素
lpop 键left pop 从指定键的左边弹出一个元素,列表中的这个元素删除
rpop 键right pop 从指定键的右边弹出一个元素,列表中的这个元素删除
lrange 键 开始 结束从指定键的列表中取出指定范围的元素列表,左边从0开始,右边从-1开始。可以理解为是一个闭环
llen 键获得指定列表的长度

在这里插入图片描述

list的底层数据结构对应的是Java中的ArrayList

set类型命令语法:

命令说明
sadd 键 元素 元素向set集合中添加一个或多个元素
smembers 键查询指定的集合中所有的元素
sismember 键 元素判断指定的元素是否在某个集合中,如果存在返回1,否则返回0
srem 键 元素 元素remove 删除指定的一个或多个元素

在这里插入图片描述

set的底层数据结构对应的是Java中的HashSet

zset类型命令语法:

命令描述
zadd 键 分数 值 分数 值添加1个或多个元素,每个元素都有一个分数
zrange 键 开始索引 结束索引获取指定范围的元素,得到所有的元素,索引是0到-1
zrem 键 值 值删除一个或多个值
zcard 键得到元素个数
zrank 键 值得到元素的索引号
zscore 键 值得到元素的分数

在这里插入图片描述

通用命令语法:

命令说明
keys 匹配字符查询当前数据库有那些键
* 匹配多个字符
? 匹配一个字符
del 键1 键2可以删除任意键,可以一次删除多键
exists 键是否存在指定的键
type 键判断指定的键他的值是什么类型,入:string、hash、list、set、none
select 数据库编号选择指定的数据库,0~15
move 键 数据编号将某个键移动到另一个数据库中,如果另一个数据库中有同名的键,则移动失败

在这里插入图片描述

4.Redis持久化

4.1 RDB持久化

RDB持久化的机制:

在指定的时间内修改了指定数量的键,才会触发持久化操作,由于是根据时间来算的,所以往往持久化的数据量要比设定的数据量要大

RDB持久化配置语法:

语法说明
save <时间间隔> <修改键数>在指定的时间间隔内,修改了多少个键,则进行持久化的操作

默认RDB配置参数:

关键字时间修改键数解释
save9001如果在900秒内修改了一个键,则进行一次持久化操作
save30010在300秒内修改了10个键,则进行一次持久化操作
save6010000在60秒内修改了10000个键,则进行一次持久化操作

修改方式:

在redis.windows.conf的101行,修改或者增加符合上面语法的配置,你就可以按照规则进行持久化了

运行方式:

启动的服务器的时候,最好指定使用配置文件启动,不然可能导致配置失效

RDB持久化的优缺点:

优点1.因为不是实时的持久化,所以效率会很高
2.持久化文件中只会记录内存中键值对的结果,不会记录过程
缺点1.因为不是实时持久化,所以数据容易丢失
2.当持久化的数据量很大的时候,会导致服务器暂停

4.2 AOF持久化

AOF持久化机制:

根据配置来进行持久化,每次修改或每秒钟持久化一次,但是AOF会把操作的记录也记录下来,也就是AOF持久化的数据是所有操作的过程

AOF持久化配置语法:

配置参数说明
appendonly no/yesyes标识开启持久化,no标识关闭,默认是关闭

AOF持久化间隔:

关键字持久化间隔解释
appendfsyncalways每次修改都持久化,效率最低
appendfsynceverysec每秒持久化一次,默认是每秒持久化一次
appendfsyncno不持久化,效率最高

注意:

修改方式和运行方式和上面相同,只不过开始AOF在393行,配置间隔的在420行

AOF持久化的优缺点:

优点持久化的频率更高,数据更安全不容易丢失
缺点1.因为持久化的频率太高了,导致性能降低
2.因为日志文件中记录了所有修改的操作,在运行恢复数据过程中效率极低

4.3 AOF重写

为什么要重写AOF:

为了解决AOF文件过于臃肿的问题,Redis提供了AOF的重写功能,可以创建一个新的AOF文件代替现有的AOF文件,新的AOF文件会保存当时的状态,而不会保存数据的修改过程

重写的原理:

直接读取当时数据库的状态,然后把数据保存到日志文件中

AOF重写触发方式:

触发方式描述
手动触发通过调用bgrewriteaof手动触发(在命令行)
自动触发同时满足以下条件就触发自动的AOF重写操作:
1. 没有RDB持久化/AOF持久化在执行,没有bgrewriteaof在进行
2. 当前AOF文件大小要大于redis.conf配置的auto-aof-rewrite-min-size大小
3. 当前AOF文件大小和最后一次重写后的大小之间的比率大于或者等于
指定的增长百分比。
(在配置文件设置了auto-aof-rewrite-percentage参数,不设置默认为100%)

4.4 AOF和RDB常见问题

开发中使用那种持久化机制:

下面是来自官方的建议:
通常,如果你要想提供很高的数据保障性,那么建议你同时使用两种持久化方式。
如果你可以接受灾难带来的几分钟的数据丢失,那么你可以仅使用RDB。
很多用户仅使用了AOF,但是我们建议,既然RDB可以时不时的给数据做个完整的快照,并且提供更快的重启,所以最好还是也使用RDB。
因此,我们希望可以在未来(长远计划)统一AOF和RDB成一种持久化模式。

AOF和RDB是否可以同时使用:

可以同时使用,而且也是官方推荐的方式。

恢复数据时那个更快:

RDB更快:因为RDB持久化的是内存键值对的最终结果,直接载入内存即可。而AOF日志文件中保存的是操作过的所有命令信息,恢复数据时需要逐条执行命令。

三、Java代码操作Redis

1.Jedis

概述:

和jdbc一样,用来驱动redis数据库的类库

适用案例:

    @Test
    public void test() {
        //获得jedis的连接,需要填写url地址和端口号
        //redis的默认端口号就是6379
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        //存入数据
        String set = jedis.set("username", "pps");
        //这里输出的就是在客户端执行获得的返回值
        System.out.println(set);
        Long lpush = jedis.lpush("list", "a", "b", "c");
        jedis.rpush("list", "1", "2", "3");
        List<String> list = jedis.lrange("list", 0, -1);
        for (String s : list) {
            System.out.println(s);
        }
        //从这里可以看出list的java结构就是ArrayList
        System.out.println(list.getClass());
        //关闭连接
        jedis.close();
    }

2.Jedis连接池

概述:

和之前的jdbc连接池一样

相关API:

JedisPoolConfig配置类说明
JedisPoolConfig()创建一个配置对象,使用空参构造就可以了
void setMaxTotal()设置连接池的最大连接数
void setMaxWaitMillis()设置得到连接对象Jedis的最大等待时间
JedisPool连接池类说明
JedisPool(配置对象,服务器地址(或者名),端口号)创建连接池:
参数1:上面的配置对象,参数2:服务器地址,参数3:端口号
Jedis getReource()从连接池中得到一个jedis连接对象
void close()连接池关闭,几乎很少使用

Jedis连接池工具类:

package com.ps.utils;

import org.apache.ibatis.io.Resources;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.ResourceBundle;

public class JedisPoolUtils {

    private static JedisPool pool = null;
    
/*    //静态代码块加载
    static {
        try {
            //1.读取配置文件
            Properties properties = new Properties();
            properties.load(JedisPoolUtils.class.getResourceAsStream("/Jedis.properties"));
            //2.创建连接池配置对象
            JedisPoolConfig config = new JedisPoolConfig();
            //3.读取配置文件中的配置信息
            config.setMaxTotal(Integer.parseInt(properties.getProperty("MaxTotal")));
            config.setMaxWaitMillis(Integer.parseInt(properties.getProperty("MaxWaitMillis")));
            //4.读取配置文件中的连接信息
            pool = new JedisPool(config, properties.getProperty("url"), Integer.parseInt(properties.getProperty("port")));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }*/

    //如果不清楚的话可以用上面的方式
    //静态代码块加载
    static {
        //1.读取配置文件
        //ResourceBundle专门用来去读src文件夹下的properties配置文件
        //只需要输入文件名即可,不需要输入文件全名
        ResourceBundle jedis = ResourceBundle.getBundle("Jedis");
        //2.创建连接池配置对象
        JedisPoolConfig config = new JedisPoolConfig();
        //3.读取配置文件中的配置信息
        config.setMaxTotal(Integer.parseInt(jedis.getString("MaxTotal")));
        config.setMaxWaitMillis(Integer.parseInt(jedis.getString("MaxWaitMillis")));
        //4.读取配置文件中的连接信息
        pool = new JedisPool(config, jedis.getString("url"), Integer.parseInt(jedis.getString("port")));
    }

    //返回Redis连接对象
    public static Jedis getJedis() {
        return pool.getResource();
    }

}

配置文件:

#连接地址
url=127.0.0.1
#端口号
port=6379
#最大连接数
MaxTotal=10
#最大等待时间
MaxWaitMillis=5000

版权声明:本文为qq_42525761原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。