大数据组件-redis概念,数据结构,命令行操作,持久化,java客户端的Jedis操作,连接池JedisPool,实现连接池工具类

1.redis概念

在这里插入图片描述

2.下载安装

安装教程
安装教程

3.redis数据结构

  • redis存储的是:key,value格式数据,其中key都是字符串,value有5种不同的数据结构
  • value数据结构
    1. 字符串 string
    2. 哈希表 hash 相当于java的map
    3. 列表 list 相当于java的linkedlist链表
    4. 集合类型 set 相当于java的hashset
    5. 有序集合类型 sortedset
      在这里插入图片描述

4.redis命令行操作

官方的详细的命令行操作文档
常用的命令行操作:

(1)字符串类型 string

1. 存储:set key value
2. 获取:get key
3. 删除:del key

(2)哈希类型 hash

1. 存储:hset key field value 
2. 获取:hget key field
3. 删除:hdel key field

(3)列表类型 list

1. 添加:lpush key value:将元素加入列表左边
2. 添加:rpush key value:将元素加入列表右边

在这里插入图片描述
3. 范围的获取:lrange key start end
4. 删除列表最左边的元素并将元素返回:lpop key
5. 删除列表最右边的元素并将元素返回:rpop key

(4)集合类型 set:不允许重复元素

  1. 存储:sadd key value
  2. 获取:smembers key:获取set集合中所有元素
  3. 删除:srem key value:删除set集合的某个元素

(5)有序集合类型sortedset:不允许重复元素,且元素有顺序

  1. 存储:zadd key score value
  2. 获取:zrange key start end
  3. 删除:zrem key value

(6)通用命令

  1. keys * :查询所有的键
  2. type key:获取键对应的value的类型
  3. del key 删除指定的key value

5.持久化

(1)持久化使用场景

redis是一个内存数据库,当redis服务器重启,或者电脑重启,数据会丢失,我们可以将redis内存当中的数据持久化保存到硬盘的文件中

(2)redis持久化机制

1.RDB:默认方式

不需要配置,默认就使用这种机制,在一定的间隔中,检测key的变化情况,然后持久化数据

1.1编辑redis.conf文件进行配置

save 900 1 //15分钟之内有一个key改变就持久化一次
save 300 10 //5分钟之内有10个key发送改变就持久化一次
save 60 10000 //60秒内有10000个key发送改变就持久化一次

2.AOF:日志记录的方式

可以记录每一条命令的操作后,持久化数据

2.1编辑reids.conf文件进行配置

appendonly no(关闭aof) --> appendonly yes(开启aof)

appendsync always //每一次操作都进行持久化
appendfsync everysec //默认是每隔一秒进行一次持久化 
appendfsync no //不进行持久化

5.java客户端 Jedis

(1)使用场景

Jedis是一款java操作redis数据库的工具

(2)使用步骤

1.下载jedis的jar包

2. 使用

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

public class JedisTest {
    @Test
    public void test1(){
        //1.获取连接
        Jedis jedis = new Jedis("192.168.83.120",6379);
        //2.操作
        jedis.set("username","zhansgan");
        //3.释放资源
        jedis.close();
    }
}

(3)Jedis操作各种redis中的数据结构

1.Jedis操作string

    @Test
    public void stringTest() {
        //1.获取连接
        Jedis jedis = new Jedis("192.168.83.120", 6379);
        //2.操作
        //2.1存储
        jedis.set("username", "zhansgan");
        //2.2获取
        String username = jedis.get("username");
        System.out.println(username);
        
        //可以使用setex()方法存储指定过期时间的key value
        jedis.setex("activecode",20,"hehe"); //将k,v存入redis,并且20秒后自动删除键值对


        //3.释放资源
        jedis.close();
    }

2.Jedis操作hash

 @Test
    public void hashTest(){
        //1.获取连接
        Jedis jedis = new Jedis("192.168.83.120", 6379);
        //2.操作
        //2.1存储hash
        jedis.hset("user","name","lisi");
        jedis.hset("user","age","23");
        jedis.hset("user","gender","famale");
        //获取hash
        String name = jedis.hget("user", "lisi");
        System.out.println(name);
        //获取hash的所以map中的数据
        Map<String, String> user = jedis.hgetAll("user");
        //keyset
        Set<String> keySet = user.keySet();
        for (String key : keySet) {
            //通过k获取v
            String value = user.get(key);
            System.out.println(key+":"+value);
        }

        //3.释放资源
        jedis.close();
    }

3.Jesis操作list

@Test
    public void listTest(){
        //1.获取连接
        Jedis jedis = new Jedis("192.168.83.120", 6379);
        //2.操作
        //list操作
        jedis.lpush("mylist","a","b","c"); //从左边存
        jedis.rpush("mylist","a","b","c"); //从右边存
        //list范围获取
        List<String> mylist = jedis.lrange("mylist", 0, -1);
        System.out.println(mylist);

        //list弹出
        String element = jedis.lpop("mylist");
        System.out.println(element);

        String element1 = jedis.rpop("mylist");
        System.out.println(element1);

    }

4.set和sortedset

 @Test
    public void setTest(){
        //1.获取连接
        Jedis jedis = new Jedis("192.168.83.120", 6379);
        //2.操作
        //set存储
        jedis.sadd("myset","java","php","c++");

        //set获取
        Set<String> myset = jedis.smembers("myset");
        System.out.println(myset);//[c++, java, php]
        
    }
  @Test
    public void sortedsetTest(){
        //1.获取连接
        Jedis jedis = new Jedis("192.168.83.120", 6379);
        //2.操作
        //sortedset存储
        jedis.zadd("mysortedset",2,"亚瑟");
        jedis.zadd("mysortedset",2,"后裔");
        jedis.zadd("mysortedset",5,"兰陵王");

        //sortedset获取
        Set<String> mysortedset = jedis.zrange("mysortedset", 0, -1);
        System.out.println(mysortedset);//从小大大[亚瑟, 后裔, 兰陵王]
    }

6.Jedis连接池JedisPool

(1)连接池使用方式步骤

@Test
    public void jedisPoolTest(){
        //创建配置对象
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(50);
        config.setMaxIdle(10);
        //1.创建Jedis连接池对象
        JedisPool jedisPool = new JedisPool(config,"192.168.83.120",6378);

        //2.获取连接
        Jedis jedis = jedisPool.getResource();
        //3.使用
        jedis.set("hehhe","haha");
        //4.归还到,连接池中
        jedis.close();
    }

(2)JedisPool详细配置

#最大活动对象数     
redis.pool.maxTotal=1000    
#最大能够保持idel状态的对象数      
redis.pool.maxIdle=100  
#最小能够保持idel状态的对象数   
redis.pool.minIdle=50    
#当池内没有返回对象时,最大等待时间    
redis.pool.maxWaitMillis=10000    
#当调用borrow Object方法时,是否进行有效性检查    
redis.pool.testOnBorrow=true    
#当调用return Object方法时,是否进行有效性检查    
redis.pool.testOnReturn=true  
#“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.  
redis.pool.timeBetweenEvictionRunsMillis=30000  
#向调用者输出“链接”对象时,是否检测它的空闲超时;  
redis.pool.testWhileIdle=true  
# 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.  
redis.pool.numTestsPerEvictionRun=50  
#redis服务器的IP    
redis.ip=xxxxxx  
#redis服务器的Port    
redis1.port=6379   

(3)连接池工具类

1.设置配置文件

jedis.properties文件

host=192.168.83.120
port=6379
maxTotal=50
maxIdle=10

2.创建连接池工具类

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;

/**
 * 工具类
 * 加载配置文件,配置连接池的参数
 * 提供获取连接的方法
 */
public class JedisPoolUtil {
    private static JedisPool jedisPool;
    // TODO: 2020/5/31 设置一个静态代码块当类加载时先读取配置文件
    static {
        //读取配置文件,使用类加载器
        //返回用于读取指定资源的输入流
        InputStream inputStream = JedisPoolUtil.class.getClassLoader().getResourceAsStream("jedis.properties");
        //创建Properties对象
        Properties properties = new Properties();
        try {
            properties.load(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //获取数据,设置到JedisPoolfig中
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(Integer.parseInt(properties.getProperty("maxTotal")));
        config.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle")));
        
        //初始化JedisPool对象
        jedisPool = new JedisPool(config, properties.getProperty("host"), Integer.parseInt(properties.getProperty("port")));
        
        
    }
    
    /**
     * 核心代码
     * 获取连接方法
     */
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章