大數據組件-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();
    }
}

在這裏插入圖片描述

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