Redis 學習筆記(1)—— Redis安裝,String 型別測試
阿新 • • 發佈:2018-12-13
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
- RDB方式按照一定的時間間隔對資料集建立基於時間點的快照
- AOF方式記錄Server收到的寫操作到日誌檔案,在Server重啟時通過回放這些寫操作來重建資料集。 該方式類似於MySQL中基於語句格式的binlog。當日志變大時Redis可在後臺重寫日誌。
2.2 AOF持久化配置
- 修改redis.config配置檔案,找到appendonly。預設是appendonly no。改成appendonly yes
- 再找到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();
}
}