1.Redisとは
redisは、非リレーショナルデータベースの高性能NOSQLシリーズです。
1.1NOSQLとは
NoSQL(NoSQL = SQLだけではない)は、「SQLだけではない」という意味で、一般に非リレーショナルデータベースを指すまったく新しいデータベースの概念です。
インターネットWeb2.0Webサイトの台頭により、従来のリレーショナルデータベースはWeb 2.0 Webサイト、特に超大規模で同時実行性の高いSNSタイプのWeb 2.0純粋動的Webサイトに対応できなくなり、多くの克服できない問題が発生します。データベースは、独自の特性により非常に急速に発展してきました。NoSQLデータベースは、大規模なデータ収集と複数のデータ型、特にビッグデータのアプリケーションによってもたらされる課題を解決するために作成されました。
1.1.1NOSQLとリレーショナルデータベースの比較
アドバンテージ:
1.コスト:nosqlデータベースはシンプルでデプロイが簡単です。基本的にはオープンソースソフトウェアです。Oracleのように購入して使用するのに多額の費用をかける必要はありません。リレーショナルデータベースよりも安価です。
2.クエリ速度:nosqlデータベースはデータをキャッシュに保存し、リレーショナルデータベースはデータをハードディスクに保存します。自然なクエリ速度はnosqlデータベースよりもはるかに低速です。
3.保存データの形式:Nosqlの保存形式はキー、値、ドキュメント、画像などであるため、データベースは基本タイプのみをサポートしますが、基本タイプやオブジェクトまたはコレクションなどのさまざまな形式を保存できます。
4.スケーラビリティ:リレーショナルデータベースには、結合などのマルチテーブルクエリメカニズムの制限があり、拡張が困難です。
欠点:
1. nosqlは新しいテクノロジーであり、リレーショナルデータベースのテクノロジーと10年以上比較できないため、メンテナンス用のツールと資料は限られています。
2. SQLをサポートしていません。SQLなどの業界標準をサポートしていない場合、ユーザーが学習して使用するために一定のコストが発生します。
3.リレーショナルデータベースのトランザクション処理を提供しません。
1.1.2非リレーショナルデータベースの利点
-
パフォーマンスNOSQLは、キーと値のペアに基づいています。これは、主キーとテーブル内の値の間の対応として想像でき、SQLレイヤーで解析する必要がないため、パフォーマンスは非常に高くなります。
-
スケーラビリティは、キーと値のペアに基づくデータ間の結合がないため、水平方向のスケーリングが非常に簡単であるためでもあります。
1.1.3リレーショナルデータベースの利点
1.複雑なクエリSQLステートメントを使用して、1つのテーブルと複数のテーブルの間で非常に複雑なデータクエリを簡単に実行できます。
2.トランザクションサポートにより、高いセキュリティパフォーマンスでデータアクセス要件を実現できます。これら2種類のデータベースの場合、互いの長所は短所であり、その逆も同様です。
1.1.4まとめ
リレーショナルデータベースとNoSQLデータベースは反対ではありませんが、補完的です。つまり、通常はリレーショナルデータベースが使用され、NoSQLが適切な場合はNoSQLデータベースが使用されるため、NoSQLデータベースはリレーショナルデータベースの欠陥を補うことができます。通常、データはリレーショナルデータベースに保存され、リレーショナルデータベースのデータはnosqlデータベースにバックアップされます。
1.2主流のNOSQL製品
Key-Valueストレージデータベース関連製品:Tokyo Cabinet / Tyrant、Redis、Voldemort、Berkeley DB代表的なアプリケーション:コンテンツキャッシング。主に、大量のデータの高アクセス負荷を処理するために使用されます。データモデル:一連のキーと値のペア長所:高速クエリ短所:保存されるデータの構造化が少ない
列ストレージデータベース関連製品:Cassandra、HBase、Riak代表的なアプリケーション:分散ファイルシステムデータモデル:列クラスターに格納され、同じデータ列が共存する長所:高速検索、強力なスケーラビリティ、分散の容易化拡張の短所:比較的限られた機能
ドキュメントデータベース関連製品:CouchDB、MongoDB一般的なアプリケーション:Webアプリケーション(キー値に類似、値は構造化されています)データモデル:一連のキーと値のペア長所:データ構造の要件は厳密ではありません短所:クエリのパフォーマンスはそうではありません高く、統一されたクエリ構文の欠如
グラフデータベース関連データベース:Neo4J、InfoGrid、Infinite Graph代表的なアプリケーション:ソーシャルネットワークデータモデル:グラフ構造利点:グラフ構造関連のアルゴリズムを使用します。短所:結果を得るにはグラフ全体を計算する必要があり、分散クラスターソリューションを実行するのは簡単ではありません。
1.3Redisとは
Redisは、C言語で開発されたオープンソースの高性能Key-Valueデータベースです。公式のテストデータが提供されます。50の同時実行100,000リクエスト、読み取り速度は110,000回/秒、書き込み速度は81,000倍です。/s、また、Redisは、さまざまなKey-Valueデータタイプを提供することにより、さまざまなシナリオのストレージ要件に適応します
これまでにRedisでサポートされているKey-Valueデータ型は次のとおりです。
文字列型文字列
ハッシュタイプハッシュ
リストタイプリスト
コレクションタイプセット
ソートされたコレクションタイプsortedset
1.3.1redisのアプリケーションシナリオ
キャッシュ(データクエリ、短い接続、ニュースコンテンツ、商品コンテンツなど)
チャットルームのオンライン友達リスト
タスクキュー。(Seckill、パニック買い、12306など)
アプリケーションリーダーボード
ウェブサイト訪問統計
データの有効期限処理(ミリ秒単位で正確にすることができます)
分散クラスターアーキテクチャでのセッション分離
2.ダウンロードしてインストールします
公式サイト:Redis
中国語のウェブサイト:Redis中国語のウェブサイト
解凍は直接使用できます。
redis.windows.conf:構成ファイル
redis-cli.exe:redisのクライアント
redis-server.exe:redisサーバー側
3.コマンド操作
3.1 redisのデータ構造:
Redisは、キーと値の形式でデータを保存します。ここで、キーは文字列であり、値には5つの異なるデータ構造があります。
価値のあるデータ構造:
1.文字列型文字列
2.ハッシュタイプハッシュ:マップ形式
3.リストタイプリスト:リンクリスト形式。繰り返し要素のサポート
4.コレクションタイプセット:重複する要素は許可されていません
5.ソートされたセットタイプsortedset:重複する要素は許可されておらず、要素には順序があります
3.2文字列型文字列
3.2.1ストレージ
キー値を設定する
192.168.1.105:0>set username zhangsan
"OK"
3.2.2取得
キーを取得
192.168.1.105:0>get username
"zhangsan"
3.削除
キーの
192.168.1.105:0>del username
"1"
3.3ハッシュタイプのハッシュ
3.3.1ストレージ
hsetキーフィールド値
192.168.1.105:0>hset myhash username lisi
"1"
192.168.1.105:0>hset myhash password 123
"1"
3.3.2取得
hget key field:指定されたフィールドに対応する値を取得します
192.168.1.105:0>hget myhash username
"lisi"
hgetallキー:すべてのフィールドと値を取得します
192.168.1.105:0>hgetall myhash
1) "username"
2) "lisi"
3) "password"
4) "123"
3.3.3削除
hdelキーフィールド
192.168.1.105:0>hdel myhash username
"1"
3.4リストタイプ
リスト:リストの先頭(左)または末尾(右)に要素を追加できます
3.4.1追加
lpushキー値:リストの左側のテーブルに要素を追加します
rpushキー値:リストの右側に要素を追加します
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取得
lrangeキー開始終了:範囲取得
192.168.1.105:0>lrange mylist 0 -1
1) "b"
2) "a"
3) "c"
3.4.3削除
lpopキー:リストの左端の要素を削除し、要素を返します
192.168.1.105:0>lpop mylist
"b"
rpopキー:リストの右端の要素を削除し、要素を返します
192.168.1.105:0>rpop mylist
"c"
3.5コレクションの種類
セットは重複要素を許可しません
3.5.1ストレージ
悲しいキー値
192.168.1.105:0>sadd myset a
"1"
192.168.1.105:0>sadd myset a
"0"
3.5.2取得
smembers key:セットコレクション内のすべての要素を取得します
192.168.1.105:0>smembers myset
1) "a"
3.5.3削除
sremキー値:セットコレクション内の要素を削除します
192.168.1.105:0>srem myset a
"1"
3.6ソートされたセットタイプ
ソートセット:重複する要素は許可されておらず、要素は順番に並んでいます。各要素は、ダブルタイプのスコアに関連付けられています。Redisは、セットのメンバーをスコアによって小さいものから大きいものに並べ替えます。
3.6.1ストレージ
zaddキースコア値
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取得
zrangeキー開始終了[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削除
zremキー値
192.168.1.105:0>zrem mysort lisi
"1"
3.7 通用命令
1.キー*:すべてのキーを照会します
2.タイプキー:キーに対応する値のタイプを取得します
3. del key:指定されたキー値を削除します
4.Redis永続化メカニズム
Redisはインメモリデータベースです。Redisサーバーが再起動してコンピューターが再起動すると、データが失われます。Redisメモリ内のデータをハードディスク上のファイルに永続化できます。
4.1 RDB(デフォルトモード)
設定は不要です。デフォルトでこのメカニズムが使用されます。一定の間隔でキーの変更が検出され、データが保持されます。
1.redis.confファイルを編集します
# 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. redisサーバーを再起動し、構成ファイル名を指定します
cd C:\develop\redis-2.4.5-win32-win64\64bit
redis-server.exe redis.conf
4.2 AOF
ロギングの方法は、各コマンドの操作を記録できます。各コマンド操作後にデータを永続化できます
1.redis.confファイルを編集します
appendonly no(aofをオフにする)-> appendonly yes(aofをオンにする)
#appendfsync always:すべての操作を永続化する
appendfsync everysec:毎秒持続
#appendfsync no:永続化しない
5.JavaクライアントJedis
Jedis:redisデータベースを操作するためのJavaツール。
5.1クイックスタート
1.Maven座標をインポートします
<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.使用する
/**
* 快速入门
*/
@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.2Jedisはredisでさまざまなデータ構造を操作します
5.2.1文字列型文字列
ストアセット
setex()メソッドを使用して、有効期限を指定できるキー値を格納できます
取得する
@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ハッシュタイプ
ハッシュ:マップ形式
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リストタイプ
リスト:リンクリスト形式。繰り返し要素のサポート
lpush / rpush
lpop / rpop
lrange開始終了:範囲取得
@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コレクションタイプ
set:重複する要素を許可しない
悲しい
smembers:すべての要素を取得します
@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ソートされたセットタイプ
ソートされたセット:重複する要素は許可されておらず、要素は順番に並んでいます
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接続プール: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();
}
接続プールツールクラス
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
テスト
@Test
public void test8(){
//通过连接池工具类获取
Jedis jedis = JedisPoolUtils.getJedis();
jedis.set("hello","world");
String str = jedis.get("hello");
System.out.println(str);
jedis.close();
}