1. 程式人生 > >Redis 學習筆記(1)—— Redis安裝,String 型別測試

Redis 學習筆記(1)—— Redis安裝,String 型別測試

1 Redis 介紹

1.1 概述

  • Redis是一個開源,先進的key-value儲存,並用於構建高效能,可擴充套件的應用程式的完美解決方案。
  • Redis資料庫完全在記憶體中,使用磁碟僅用於永續性。
  • 相比許多鍵值資料儲存,Redis擁有一套較為豐富的資料型別。
  • Redis可以將資料複製到任意數量的從伺服器。

1.2 優勢

  • 異常快速:Redis的速度非常快,每秒能執行約11萬集合,每秒約81000+條記錄。
  • 支援豐富的資料型別:Redis支援字串、列表、集合、有序集合雜湊資料型別。
  • 操作都是原子性:所有Redis操作是原子的,這保證瞭如果兩個客戶端同時訪問的Redis伺服器將獲得更新後的值。
  • 多功能實用工具:Redis是一個多實用的工具,可以在多個用例如快取,訊息,佇列使用(Redis原生支援釋出/訂閱),任何短暫的資料,應用程式,如Web應用程式會話,網頁命中計數等。

2 持久化

2.1 兩種持久化方案 RDB和AOF

  1. RDB方式按照一定的時間間隔對資料集建立基於時間點的快照
  2. AOF方式記錄Server收到的寫操作到日誌檔案,在Server重啟時通過回放這些寫操作來重建資料集。 該方式類似於MySQL中基於語句格式的binlog。當日志變大時Redis可在後臺重寫日誌。

2.2 AOF持久化配置

  1. 修改redis.config配置檔案,找到appendonly。預設是appendonly no。改成appendonly yes
  2. 再找到appendfsync 。預設是 appendfsync everysec,appendfsync always
  • 每次收到寫命令就立即強制寫入磁碟,最慢的,但是保證完全的持久化,不推薦使用appendfsync everysec
  • 每秒鐘強制寫入磁碟一次,在效能和持久化方面做了很好的折中,推薦 appendfsync no
  • 完全依賴os,效能最好,持久化沒保證

2.3 RDB持久化配置

  • 預設情況下,Redis儲存資料集快照到磁碟,名為dump.rdb的二進位制檔案。可以設定讓Redis在N秒內至少有M次資料集改動時儲存資料集,或者你也可以手動呼叫SAVE或者BGSAVE命令。 例如,這個配置會讓Redis在每個60秒內至少有1000次鍵改動時自動轉儲資料集到磁碟,save 60 1000

2 window 上安裝redis

2.1 測試安裝

先在服務裡停止 Redis 在這裡插入圖片描述

切換到 redis 安裝的根目錄,redis-server.exe redis.windows.conf

在這裡插入圖片描述 在這裡插入圖片描述

3 新建 redis maven 工程

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tzb.cn</groupId>
    <artifactId>myredis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.3.1</version>
        </dependency>
    </dependencies>

</project>

3.1 String 測試

3.1.1 案例1

package mystring;

import redis.clients.jedis.Jedis;

import java.util.List;

public class StringMain {

    public static void main(String[] args) throws InterruptedException {
        Jedis jedis=new Jedis("127.0.0.1",6379);

        jedis.set("name","Mike");
        System.out.println(jedis.get("name"));

        /*
        * 對 string 型別資料進行增減,前提是kv 對應的值是數字
        * */
        jedis.set("age","25");//給使用者 Mike設定年齡
        jedis.incr("age");//讓 Mike的年齡增加一歲
        System.out.println(jedis.get("age"));

        /*
        * 一次性插入多條資料
        * */
        jedis.mset("AAA","A-金樽清酒鬥十千",
                "BBB","B-玉盤珍羞直萬錢",
                "CCC","C-停杯投箸不能食",
                "DDD","D-拔劍四顧心茫然");
        List<String> results=jedis.mget("AAA","BBB","CCC","DDD");
        for(String value:results){
            System.out.println(value);
        }

        /*
        * 設定欄位的自動過期
        * */
        jedis.setex("tangshi",10,"直掛雲帆濟滄海"); // 這句古詩保持10秒鐘
        while(jedis.exists("tangshi")){
            System.out.println("雲帆濟滄海");
            Thread.sleep(1000);
        }

        System.out.println();

        /*
        * 對已經存在的欄位設定過期時間
        * */
        jedis.set("tangshi","直掛雲帆濟滄海");
        jedis.expire("tangshi",10);
        while(jedis.exists("tangshi")){
            System.out.println("雲帆濟滄海");
            Thread.sleep(1000);
        }

    }
}

D:\programs\Java\jdk1.8.0_181\bin\java.exe "-javaagent:D:\programs\JetBrains\IntelliJ IDEA 2018.2.4\lib\idea_rt.jar=55441:D:\programs\JetBrains\IntelliJ IDEA 2018.2.4\bin" -Dfile.encoding=UTF-8 -classpath D:\programs\Java\jdk1.8.0_181\jre\lib\charsets.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\deploy.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\javaws.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\jce.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\jfr.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\jsse.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\management-agent.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\plugin.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\resources.jar;D:\programs\Java\jdk1.8.0_181\jre\lib\rt.jar;D:\Data\JavaProject\myredis\target\classes;C:\Users\tzb\.m2\repository\redis\clients\jedis\2.8.2\jedis-2.8.2.jar;C:\Users\tzb\.m2\repository\org\apache\commons\commons-pool2\2.4.2\commons-pool2-2.4.2.jar mystring.StringMain
Mike
26
A-金樽清酒鬥十千
B-玉盤珍羞直萬錢
C-停杯投箸不能食
D-拔劍四顧心茫然
雲帆濟滄海
雲帆濟滄海
雲帆濟滄海
雲帆濟滄海
雲帆濟滄海
雲帆濟滄海
雲帆濟滄海
雲帆濟滄海
雲帆濟滄海
雲帆濟滄海

雲帆濟滄海
雲帆濟滄海
雲帆濟滄海
雲帆濟滄海
雲帆濟滄海
雲帆濟滄海
雲帆濟滄海
雲帆濟滄海
雲帆濟滄海
雲帆濟滄海

Process finished with exit code 0

3.1.2 案例2

package mystring;


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/*
* 計算三個擂臺的比武次數
* */
public class Counter {
    public static void main(String[] args){

      /*
      * 建立一個固定大小的執行緒池,3個擂臺
      * */
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        /*
        * 擂臺1,2,3
        * */
        executorService.submit(new Arena("PK:totalNum:","少林寺"));
        executorService.submit(new Arena("PK:totalNum:","武當派"));
        executorService.submit(new Arena("PK:totalNum:","峨眉派"));

        /*
        * 報幕人員
        * */
        executorService.submit(new BaoMu("PK:totalNum"));


    }
}

package mystring;


import redis.clients.jedis.Jedis;

import java.util.Random;

public class Arena implements Runnable {

    private Random random = new Random();
    private String redisKey;
    private Jedis jedis;
    private String arenaName;


    public Arena(String redisKey, String arenaName) {
        this.redisKey = redisKey;
        this.arenaName = arenaName;
    }

    public void run() {
        jedis = new Jedis("127.0.0.1", 6397);
        String[] daxias = new String[]{
                "郭靖", "黃蓉", "黃藥師", "老頑童", "西毒", "北丐", "楊過", "張無忌",
                "小龍女", "郭襄", "喬峰", "段譽", "東方不敗", "周芷若", "逍遙子",
                "慕容復"};

        while (true) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            int p1 = random.nextInt(daxias.length);
            int p2 = random.nextInt(daxias.length);

            while (p1 == p2) { //如果是同一個人
                p2 = random.nextInt(daxias.length);
            }

            System.out.println("在擂臺"+arenaName+daxias[p1]+" VS "+daxias[p2]);
            jedis.incr(redisKey);
        }
    }
}

package mystring;

import redis.clients.jedis.Jedis;


public class BaoMu implements Runnable {

    private Jedis jedis;
    private String redisKey;


    public BaoMu(String redisKey) {
        this.redisKey = redisKey;
    }

    public void run() {
        jedis=new Jedis("127.0.0.1",6379);
        while(true){
            try {
                Thread.sleep(1000);
                System.out.println("*** 當前比武次數 ***"+jedis.get(redisKey));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
}

3.1.3 案例3

package mystring;

import com.google.gson.Gson;
import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.io.*;

public class PruductService {

    @Test
    public void saveProduct2Redis() throws Exception{

        Person person =new Person("Mike",25);

        Jedis jedis=new Jedis("127.0.0.1",6379);

        //直接儲存物件的toString方法,這種方式不反序列化物件
        jedis.set("user:Mike:str",person.toString());
        System.out.println(jedis.get("user:Mike:str"));

        //儲存序列化後的物件
        jedis.set("user:Mike:obj".getBytes(),getBytesByProduct(person));
        byte[] productBytes=jedis.get("user:Mike:obj".getBytes());
        Person pByte=getProductByBytes(productBytes);
        System.out.println(pByte.getName()+"  "+pByte.getAge());

        //儲存 Json 化之後的物件
        jedis.set("user:Mike:json",new Gson().toJson(person));
        String personJson=jedis.get("user:Mike:json");
        Person pjson=new Gson().fromJson(personJson,Person.class);
        System.out.println(pjson.getName()+" "+pjson.getAge());

    }

    /*
    * 從位元組陣列中讀取物件
    * */
    public Person getProductByBytes(byte[] productBytes) throws IOException, ClassNotFoundException {
        ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(productBytes);
        ObjectInputStream objectInputStream=new ObjectInputStream(byteArrayInputStream);
        return (Person)objectInputStream.readObject();
    }

    /*
    *
    * 把物件轉換為 Byte 陣列
    * */
    public byte[] getBytesByProduct(Person product) throws IOException {
        ByteArrayOutputStream ba=new ByteArrayOutputStream();
        ObjectOutputStream oos= new ObjectOutputStream(ba);
        oos.writeObject(product);
        oos.flush();
        return ba.toByteArray();
    }


}