1. Was ist Redis
redis ist eine hochleistungsfähige NOSQL - Reihe nicht relationaler Datenbanken
1.1 Was ist NOSQL
NoSQL (NoSQL = Not Only SQL), was „mehr als nur SQL“ bedeutet, ist ein brandneues Datenbankkonzept, das sich allgemein auf nicht-relationale Datenbanken bezieht.
Mit dem Aufkommen von Web 2.0-Websites im Internet sind traditionelle relationale Datenbanken unfähig geworden, mit Web 2.0-Websites fertig zu werden, insbesondere mit ultragroßen und hochparallelen SNS-ähnlichen rein dynamischen Web 2.0-Websites, was viele unüberwindbare Probleme aufwirft Datenbank hat sich aufgrund ihrer Eigenheiten sehr schnell entwickelt. Die NoSQL-Datenbank wurde erstellt, um die Herausforderungen zu lösen, die durch umfangreiche Datensammlungen und mehrere Datentypen entstehen, insbesondere durch die Anwendung von Big Data.
1.1.1 Vergleich von NOSQL und relationalen Datenbanken
Vorteil:
1. Kosten: Die nosql-Datenbank ist einfach und leicht zu implementieren. Sie ist im Grunde eine Open-Source-Software. Sie muss nicht viel Geld ausgeben, um sie zu kaufen und zu verwenden, wie die Verwendung von Oracle. Sie ist billiger als relationale Datenbanken.
2. Abfragegeschwindigkeit: Die nosql-Datenbank speichert Daten im Cache, die relationale Datenbank speichert Daten auf der Festplatte, und die natürliche Abfragegeschwindigkeit ist weitaus geringer als die der nosql-Datenbank.
3. Format der gespeicherten Daten: Das Speicherformat von Nosql ist Schlüssel, Wert, Dokument, Bild usw., sodass verschiedene Formate wie Grundtypen und Objekte oder Sammlungen gespeichert werden können, während die Datenbank nur Grundtypen unterstützt.
4. Skalierbarkeit: Relationale Datenbanken haben die Einschränkung von Abfragemechanismen für mehrere Tabellen wie Join, was eine Erweiterung erschwert.
Mangel:
1. Die Werkzeuge und Materialien für die Wartung sind begrenzt, da nosql eine neue Technologie ist und seit mehr als 10 Jahren nicht mehr mit der Technologie relationaler Datenbanken verglichen werden kann.
2. Es bietet keine Unterstützung für SQL Wenn es Industriestandards wie SQL nicht unterstützt, entstehen den Benutzern gewisse Kosten für das Erlernen und Verwenden.
3. Bietet keine relationale Datenbanktransaktionsverarbeitung.
1.1.2 Vorteile nicht relationaler Datenbanken
-
Leistung NOSQL basiert auf Schlüssel-Wert-Paaren, die man sich als Korrespondenz zwischen dem Primärschlüssel und dem Wert in der Tabelle vorstellen kann, und muss nicht von der SQL-Schicht geparst werden, daher ist die Leistung sehr hoch.
-
Die Skalierbarkeit liegt auch daran, dass es keine Kopplung zwischen Daten basierend auf Schlüssel-Wert-Paaren gibt, sodass eine horizontale Skalierung sehr einfach ist.
1.1.3 Vorteile relationaler Datenbanken
1. Komplexe Abfragen Sie können SQL-Anweisungen verwenden, um sehr komplexe Datenabfragen zwischen einer Tabelle und mehreren Tabellen durchzuführen.
2. Transaktionsunterstützung ermöglicht die Realisierung von Datenzugriffsanforderungen mit hoher Sicherheitsleistung. Bei diesen beiden Arten von Datenbanken sind die Stärken des jeweils anderen ihre Schwächen und umgekehrt.
1.1.4 Zusammenfassung
Relationale Datenbanken und NoSQL-Datenbanken sind kein Gegensatz, sondern komplementär, d. h. es werden in der Regel relationale Datenbanken verwendet, und NoSQL-Datenbanken werden verwendet, wenn NoSQL geeignet ist, sodass NoSQL-Datenbanken die Mängel relationaler Datenbanken ausgleichen können. Im Allgemeinen werden die Daten in der relationalen Datenbank gespeichert und die Daten der relationalen Datenbank werden in der nosql-Datenbank gesichert.
1.2 Mainstream-NOSQL-Produkte
Key-Value-Speicherdatenbank Verwandte Produkte: Tokyo Cabinet/Tyrant, Redis, Voldemort, Berkeley DB Typische Anwendungen: Inhalts-Caching, hauptsächlich verwendet, um hohe Zugriffslasten großer Datenmengen zu bewältigen. Datenmodell: Eine Reihe von Schlüssel-Wert-Paaren Vorteile: Schnelle Abfragen Nachteile: Die gespeicherten Daten sind weniger strukturiert
Verwandte Produkte für Spaltenspeicherdatenbanken: Cassandra, HBase, Riak Typische Anwendung: Verteiltes Dateisystem Datenmodell: Gespeichert in einem Spaltencluster , koexistierend mit derselben Datenspalte Vorteile: Schnelle Suchgeschwindigkeit, starke Skalierbarkeit und einfachere Verteilung Nachteile der Erweiterung: relativ eingeschränkte Funktionen
Dokumentendatenbank verwandte Produkte: CouchDB, MongoDB Typische Anwendung: Webanwendung (ähnlich Key-Value, Wert ist strukturiert) Datenmodell: Eine Reihe von Schlüssel-Wert-Paaren Vorteile: Die Anforderungen an die Datenstruktur sind nicht streng Nachteile: Die Abfrageleistung ist nicht hoch und Mangel an einheitlicher Abfragesyntax
Graphdatenbank Relevante Datenbank: Neo4J, InfoGrid, Infinite Graph Typische Anwendung: Soziales Netzwerk Datenmodell: Graphstruktur Vorteil: Verwenden Sie Graphstruktur-bezogene Algorithmen. Nachteil: Es ist notwendig, den gesamten Graphen zu berechnen, um das Ergebnis zu erhalten, und es ist nicht einfach, eine verteilte Clusterlösung zu erstellen.
1.3 Was ist Redis
Redis ist eine Open-Source-Hochleistungs-Schlüsselwertdatenbank, die in C-Sprache entwickelt wurde. Die offiziellen Testdaten werden bereitgestellt. 50 führen gleichzeitig 100.000 Anforderungen aus, die Lesegeschwindigkeit beträgt 110.000 Mal/s und die Schreibgeschwindigkeit 81.000 Mal. /s , und Redis passt sich den Speicheranforderungen in verschiedenen Szenarien an, indem es eine Vielzahl von Schlüsselwert-Datentypen bereitstellt
Die bisher von Redis unterstützten Schlüsselwert-Datentypen lauten wie folgt:
Zeichenfolge vom Typ Zeichenfolge
Hash-Typ Hash
Listentyp Liste
Sammlungstyp festgelegt
Sortierter Sammlungstyp sortedset
1.3.1 Anwendungsszenarien von redis
Cache (Datenabfrage, Kurzverbindung, News-Content, Commodity-Content etc.)
Chatroom Online-Freundesliste
Aufgabenwarteschlange. (Seckill, Hamsterkäufe, 12306 usw.)
Anwendungs-Bestenliste
Website-Besuchsstatistik
Datenablaufverarbeitung (kann auf Millisekunden genau sein
Sitzungstrennung in einer verteilten Clusterarchitektur
2. Herunterladen und installieren
Offizielle Website: Redis
Chinesische Website: Chinesische Redis-Website
Die Dekomprimierung kann direkt verwendet werden:
redis.windows.conf: Konfigurationsdatei
redis-cli.exe: Client für redis
redis-server.exe: Redis-Serverseite
3. Befehlsbetrieb
3.1 Die Datenstruktur von redis:
Redis speichert Daten im Format von Schlüssel und Wert, wobei der Schlüssel eine Zeichenfolge ist und der Wert 5 verschiedene Datenstrukturen hat
Die Datenstruktur des Wertes:
1. Zeichenfolge vom Typ Zeichenfolge
2. Hash-Typ Hash: Kartenformat
3. Listentyp Liste: Linkedlist-Format. Unterstützung für sich wiederholende Elemente
4. Collection Type Set: Doppelte Elemente sind nicht erlaubt
5. Sorted-Set-Typ sortedset: doppelte Elemente sind nicht erlaubt, und die Elemente haben eine Reihenfolge
3.2 Zeichenfolge vom Typ Zeichenfolge
3.2.1 Lagerung
Schlüsselwert festlegen
192.168.1.105:0>set username zhangsan
"OK"
3.2.2 Erhalten
Schlüssel bekommen
192.168.1.105:0>get username
"zhangsan"
3. Löschen
des Schlüssels
192.168.1.105:0>del username
"1"
3.3 Hash-Typ Hash
3.3.1 Lagerung
hset Schlüsselfeldwert
192.168.1.105:0>hset myhash username lisi
"1"
192.168.1.105:0>hset myhash password 123
"1"
3.3.2 Erhalten
hget Schlüsselfeld: Ruft den Wert ab, der dem angegebenen Feld entspricht
192.168.1.105:0>hget myhash username
"lisi"
hgetall-Schlüssel: Alle Felder und Werte abrufen
192.168.1.105:0>hgetall myhash
1) "username"
2) "lisi"
3) "password"
4) "123"
3.3.3 Löschen
hdel-Schlüsselfeld
192.168.1.105:0>hdel myhash username
"1"
3.4 Listentypen
Liste: Sie können ein Element zum Kopf (links) oder Ende (rechts) der Liste hinzufügen
3.4.1 Hinzufügen
lpush key value: fügt das Element zur linken Tabelle der Liste hinzu
rpush key value: fügt das Element rechts von der Liste hinzu
192.168.1.105:0>lpush mylist a
"1"
192.168.1.105:0>lpush mylist b
"2"
192.168.1.105:0>rpush mylist c
"3"
3.4.2 Erhalten
lrange key start end : Bereichserfassung
192.168.1.105:0>lrange mylist 0 -1
1) "b"
2) "a"
3) "c"
3.4.3 Löschen
lpop key: löscht das ganz linke Element der Liste und gibt das Element zurück
192.168.1.105:0>lpop mylist
"b"
rpop-Taste: löscht das ganz rechte Element der Liste und gibt das Element zurück
192.168.1.105:0>rpop mylist
"c"
3.5 Sammlungstypen
set erlaubt keine doppelten Elemente
3.5.1 Lagerung
sadd Schlüsselwert
192.168.1.105:0>sadd myset a
"1"
192.168.1.105:0>sadd myset a
"0"
3.5.2 Erhalten
smembers-Schlüssel: Holen Sie sich alle Elemente in der Set-Sammlung
192.168.1.105:0>smembers myset
1) "a"
3.5.3 Löschen
srem-Schlüsselwert: Löscht ein Element in der Set-Sammlung
192.168.1.105:0>srem myset a
"1"
3.6 Sortierte Set-Typen
sortedset: Doppelte Elemente sind nicht erlaubt, und die Elemente sind in der richtigen Reihenfolge.Jedes Element ist mit einer Punktzahl vom doppelten Typ verbunden. Redis sortiert die Mitglieder des Sets von klein nach groß durch Partituren.
3.6.1 Lagerung
zadd-Key-Score-Wert
192.168.1.105:0>zadd mysort 60 zhangsan
"1"
192.168.1.105:0>zadd mysort 50 lisi
"1"
192.168.1.105:0>zadd mysort 80 wangwu
"1"
3.6.2 Erhalten
zrange key start end [withscores]
192.168.1.105:0>zrange mysort 0 -1
1) "lisi"
2) "zhangsan"
3) "wangwu"
192.168.1.105:0>zrange mysort 0 -1 withscores
1) "lisi"
2) "50"
3) "zhangsan"
4) "60"
5) "wangwu"
6) "80"
3.6.3 Löschen
zrem-Schlüsselwert
192.168.1.105:0>zrem mysort lisi
"1"
3.7 Allgemeine Ordnung
1. Tasten * : Alle Tasten abfragen
2. type key : Holen Sie sich den Werttyp, der dem Schlüssel entspricht
3. del key: Löscht den angegebenen Schlüsselwert
4. Redis-Persistenzmechanismus
Redis ist eine In-Memory-Datenbank. Wenn der Redis-Server und der Computer neu gestartet werden, gehen die Daten verloren. Wir können die Daten im Redis-Speicher in einer Datei auf der Festplatte speichern.
4.1 RDB (Standardmodus)
Es ist keine Konfiguration erforderlich. Dieser Mechanismus wird standardmäßig verwendet. In einem bestimmten Intervall wird die Änderung des Schlüssels erkannt, und dann werden die Daten persistiert.
1. Bearbeiten Sie die redis.conf-Datei
# after 900 sec (15 min) if at least 1 key changed
save 900 1
# after 300 sec (5 min) if at least 10 keys changed
save 300 10
# after 60 sec if at least 10000 keys changed
save 60 10000
2. Starten Sie den Redis-Server neu und geben Sie den Namen der Konfigurationsdatei an
cd C:\develop\redis-2.4.5-win32-win64\64bit
redis-server.exe redis.conf
4.2 AOF
Die Art der Protokollierung kann die Ausführung jedes Befehls aufzeichnen. Daten können nach jeder Befehlsoperation persistiert werden
1. Bearbeiten Sie die redis.conf-Datei
appendonly no (aof ausschalten) --> appendonly yes (aof einschalten)
# appendfsync always : Jede Operation beibehalten
appendfsync everysec : jede Sekunde bestehen bleiben
# appendfsync no : nicht bestehen bleiben
5. Java-Client Jedis
Jedis: Ein Java-Tool zum Betrieb der Redis-Datenbank.
5.1 Schnellstart
1. Importieren Sie Maven-Koordinaten
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.11.1</version>
</dependency>
2. Verwenden
/**
* 快速入门
*/
@Test
public void test1(){
//1.获取连接
Jedis jedis = new Jedis("192.168.1.105",6379);//如果使用空参构造,默认值 "localhost",6379端口
//2.操作
jedis.set("username","zhangsan");
//3.关闭连接
jedis.close();
}
5.2 Jedis betreibt verschiedene Datenstrukturen in redis
5.2.1 Zeichenfolge vom Typ Zeichenfolge
Shop-Set
Sie können die Methode setex() verwenden, um einen Schlüsselwert zu speichern, der eine Ablaufzeit angeben kann
bekommen bekommen
@Test
public void test2() {
//1.获取连接
Jedis jedis = new Jedis("192.168.1.105", 6379);
//2.操作
//存储
jedis.set("username", "zhangsan");
jedis.setex("activecode",20,"hehe");//将activecode:hehe键值对存入redis,并且20秒后自动删除该键值对
//获取
String username = jedis.get("username");
System.out.println(username);
//3.关闭连接
jedis.close();
}
5.2.2 Hash-Typen
Hash: Kartenformat
hset
hget
hgetAll
@Test
public void test3() {
//1.获取连接
Jedis jedis = new Jedis("192.168.1.105", 6379);
//2.操作
// 存储hash
jedis.hset("user", "name", "lisi");
jedis.hset("user", "age", "23");
jedis.hset("user", "gender", "female");
// 获取hash
String name = jedis.hget("user", "name");
System.out.println(name);
// 获取hash的所有map中的数据
Map<String, String> user = jedis.hgetAll("user");
// keyset
Set<String> keySet = user.keySet();
for (String key : keySet) {
//获取value
String value = user.get(key);
System.out.println(key + ":" + value);
}
//3.关闭连接
jedis.close();
}
5.2.3 Listentypen
Liste : Linkedlist-Format. Unterstützung für sich wiederholende Elemente
lpush / rppush
lpop / rpop
lrange start end : Bereichserfassung
@Test
public void test4() {
//1.获取连接
Jedis jedis = new Jedis("192.168.1.105", 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 element1 = jedis.lpop("mylist");//c
System.out.println(element1);
String element2 = jedis.rpop("mylist");//c
System.out.println(element2);
// list 范围获取
List<String> mylist2 = jedis.lrange("mylist", 0, -1);
System.out.println(mylist2);
//3.关闭连接
jedis.close();
}
5.2.4 Sammlungstypen
set : Doppelte Elemente nicht zulassen
traurig
smembers: Holen Sie sich alle Elemente
@Test
public void test5() {
//1.获取连接
Jedis jedis = new Jedis("192.168.1.105", 6379);
//2.操作
// set 存储
jedis.sadd("myset","java","php","c++");
// set 获取
Set<String> myset = jedis.smembers("myset");
System.out.println(myset);
//3.关闭连接
jedis.close();
}
5.2.5 Sortierte Set-Typen
sortedset: Doppelte Elemente sind nicht erlaubt, und die Elemente sind geordnet
zadd
zrange
@Test
public void test6() {
//1.获取连接
Jedis jedis = new Jedis("192.168.1.105", 6379);
//2.操作
// sortedset 存储
jedis.zadd("mysortedset",3,"亚瑟");
jedis.zadd("mysortedset",30,"后裔");
jedis.zadd("mysortedset",55,"孙悟空");
// sortedset 获取
List<String> mysortedset = jedis.zrange("mysortedset", 0, -1);
System.out.println(mysortedset);
//3.关闭连接
jedis.close();
}
5.3 Jedis-Verbindungspool: JedisPoo
@Test
public void test7(){
//1.创建一个配置对象
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);
config.setMaxIdle(10);
//1.创建Jedis连接池对象
JedisPool jedisPool = new JedisPool(config,"192.168.1.105",6379);
//2.获取连接
Jedis jedis = jedisPool.getResource();
//3. 使用
jedis.set("hehe","heihei");
//4. 关闭 归还到连接池中
jedis.close();
}
Verbindungspool-Toolklasse
package com.itterence.utils;
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 JedisPoolUtils {
private static JedisPool jedisPool;
static {
//读取配置文件
InputStream is = JedisPoolUtils.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();
}
}
jedis.properties
host=192.168.1.105
port=6379
maxTotal=50
maxIdle=10
Prüfung
@Test
public void test8(){
//通过连接池工具类获取
Jedis jedis = JedisPoolUtils.getJedis();
jedis.set("hello","world");
String str = jedis.get("hello");
System.out.println(str);
jedis.close();
}