Redis+Jedis

120 阅读4分钟

日期:2021年12月14日

出处:黑马程序员JavaWeb全套教程,Java Web从基础到项目实战(IDEA版)

www.bilibili.com/video/BV1qv…

正文


redis

redis是一款高性能的NOSQL系列的非关系型数据库

需要下载

redis的数据结构与命令

命令比较简单,这里挑选几个重要常用的命令

  1. 列表类型:可以添加一个元素到列表的头部(左边)或者尾部(右边)
    • lpush key value: 将元素加入列表左表
    • rpush key value:将元素加入列表右边
    • lrange key start end :范围获取
    • pop key: 删除列表最左边的元素,并将元素返回
    • rpop key: 删除列表最右边的元素,并将元素返回
  1. 集合类型 set
    • sadd key value:存储
    • smembers key:获取set集合中所有元素
    • srem key value:删除set集合中的某个元素
  1. 有序集合类型 sortedset
    • zrange key start end:获取集合指定区间元素
  1. 通用命令
    • keys *:查询所有的键
    • type key:获取key对应value的类型
    • del key:删除指定的key value

持久化

redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据就会丢失,但是我们可以通过修改配置文件redis.windows.conf将redis内存中的数据持久化保存到硬盘的文件中

方式一:

RDB:默认方式,不需要进行配置,默认就使用这种机制

在一定的间隔时间中,检测key的变化情况,然后持久化数据

方式二:

AOF:日志记录的方式,可以记录每一条命令的操作。

可以每一次命令操作后,持久化数据

jedis

Java操作redis数据库的工具

需要导包

jedis的方法和redis的命令是一模一样的,相对于是比较简单的,下面我只对jedis中扩充的方法进行演示

package JedisTest;
// TODO: 2021/12/14 jedis的测试类
import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.util.Map;
import java.util.Set;


public class test {
    @Test
    public void test1(){
        //String类型的操作
//        1.获取连接
//        Jedis jedis = new Jedis("localhost",6379);
        Jedis jedis = new Jedis();//空参默认就是("localhost",6379)
//        2.操作
//        setex()方法可以指定存储时间的key value
        jedis.setex("activecode",10,"hehe");//将activecode:hehe键值对存入redis,并在10秒后自动删除该键值对
//        3.关闭连接
        jedis.close();
    }
    @Test
    public void test2(){
        //hash类型的操作
//        1.获取连接
//        Jedis jedis = new Jedis("localhost",6379);
        Jedis jedis = new Jedis();//空参默认就是("localhost",6379)
//        2.操作
//        获取hash的所有map中的数据
        Map<String, String> user = jedis.hgetAll("user");

        Set<String> keySet = user.keySet();
        for (String key : keySet) {
            String value = user.get(key);
            System.out.println(key+":"+value);
        }
//        3.关闭连接
        jedis.close();
    }
    @Test
    public void test3(){
        //String类型的操作
//        1.获取连接
//        Jedis jedis = new Jedis("localhost",6379);
        Jedis jedis = new Jedis();//空参默认就是("localhost",6379)
//        2.操作
//        3.关闭连接
        jedis.close();
    }
}

jedis连接池:JedisPool

package JedisTest;

import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class jedis连接池 {
    @Test
    public void test1(){
//        0.创建一个配置对象
        JedisPoolConfig config = new JedisPoolConfig();
        //设置连接池的配置参数
        config.setMaxTotal(50);//最大允许的连接数
        config.setMaxIdle(10);//最大空闲连接数
//        1.创建Jedis连接池对象
        JedisPool jedisPool = new JedisPool(config,"localhost",6379);
//        2.获取连接
        Jedis jedis = jedisPool.getResource();
//        3.操作
        jedis.set("hh","aa");
//        4.关闭  归还到连接池中
        jedis.close();
    }
}

jedis连接池工具类

package JedisTest;

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;

//JedisPool工具类
//1.加载配置文件
//2.配置连接池的参数
//3.提供获取连接的方法
public class jedis连接池工具类 {
    private static JedisPool jedisPool;
    static {
        //读取配置文件(使用类加载器)
        InputStream is = JedisPool.class.getClassLoader().getResourceAsStream("jedis.properties");
        //创建Properties对象
        Properties pro = new Properties();
        //关联文件
        try {
            pro.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //获取数据,设置到JedisPoolConfig中
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
        config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));

        //初始化JedisPool
        jedisPool = new JedisPool(config,pro.getProperty("host"),Integer.parseInt(pro.getProperty("port")));


    }
//    获取连接的方法:
    public static Jedis getJedis(){
        return jedisPool.getResource();

    }
}

注意:

所有的操作是基于redis数据库启用之后进行的。

拓展

win10右键或者shift+右键没有“打开命令窗口”可以在文件路径直接输入cmd,之后就会直接在当前文件路径下打开命令窗口了

p7f37-d61o9.gif

总结


今天学习了新的数据库类型非关系型数据库,他和关系型数据库不是对立的,而是相辅相成为了给用户带来更好的体验,它用于存储一些不进场改变的数据。简单学习了redis数据库,重点是redis的命令有一些细节还是需要注意的,比如列表类型添加元素之后的顺序等,之后学习了jedis连接池,和jdbc连接池一样是为了提高复用率和响应速度的,这部分内容整个都是重点,jedis连接池工具类是今天的难点,jedis连接池工具类的书写流程还是不熟练,还需要练习。