I.はじめに
キー値は、本質的には、メモリデータベースのRedis(リモート辞書サーバ)の一種で、データベース全体をハードドライブに保存することがフラッシュ非同期のデータベース操作を通じて定期的に動作すべてが、メモリにロードされています。
二、Redisの使用シナリオ
セッション・キャッシュ
最も一般的に他の記憶装置(Memcachedの)オーバーRedisのキャッシュセッション利点と、Redisのシーンの一種を使用:Redisの永続性を提供します。
フルページキャッシュ(FPC)
基本的なセッショントークンに加えて、Redisのも、FPCのために非常に便利なプラットフォームを提供します。戻る一貫性、でも再起動Redisのインスタンスは、理由永続ディスクの、ユーザーがPHPローカルFPCに似て大きな改善であり、減少のページの読み込み速度を、表示されません。
キュー
Redisのメモリストレージエンジンでの大きな利点は、Redisのは、メッセージキューを使用するための良いプラットフォームとして機能することができます芸術とSet操作のリストを提供することにあります。
リスト、カウンタ
メモリ操作でデジタル上下には非常によく実装されているのRedis。コレクション(セット)と順序集合(ソートセット)も、私たちに、これらの操作は、Redisのは、ただ単にこれら2つのデータ構造を提供し、非常にシンプルになって実行するための時間を確保できます。
パブリッシュ、サブスクライブ
最後に(確かに最低ではないが)のRedisの機能をパブリッシュ/サブスクライブです。パブリッシュ/使用シナリオは確かに非常に多くのです購読します。私は人々がスクリプトトリガをパブリッシュ/サブスクライブ、さらに機能をサブスクライブ/ Redisのを公表ベースのチャットシステムを構築するためにも、ソーシャルネットワーキング接続を使用しますが、見てきました!
三、Redisの関連問題
いくつかのデータ型をサポートしています1。のRedis
- 文字列、リスト、セット、ソートセット、ハッシュ
リソースの2 Redisの主要な消費者
- メモリ
制圧戦略とは何か3. Redisの
Redisのはキャッシュとして、フルでメモリ空間ならば、それは自動的に古いデータベースを追放しますとき。
立ち退きポリシー
- no_eviction:あなたはより多くのメモリを必要とする場合、最大メモリ制限を達成するために、ポリシーを削除しないで、直接リターンエラーメッセージが表示されます。
- LRU-AllKeys:すべてのキーの共通;最低使用削除キーの優先順位。
- LRU-揮発性:セットの一部を期限切れにするための唯一の制限、最低使用削除キーの優先順位。
- ランダムAllKeys:すべてのキー一般的なのは、いくつかのランダムなキーを削除します。
- ランダム揮発性:新たに追加されたデータ・ストレージ・スペースがあることなどが、唯一のキーの有効期限のセットでランダムキー回復。
- TTL-揮発性:セクションの限られたセットが期限切れに、優先的に(ライブ、TTLまでの時間)を短いキーを残り時間を取り除きます。
内部追放を達成
1.立ち退きプロセス
- クライアントは、Redisのデータの増加、その結果、コマンドを実行し、より多くのメモリを取ります。
- あなたがmaxmemory制限を超えた場合のRedisは明確なポリシーに従って、キー部分をメモリ使用量を確認してください。
内部をプッシュするためには、継続するためのコマンド。
- このプロセスでは、メモリ使用量は、オーバーしてから削除キー、使用量が限界値を下回った、限界値に到達していきます。
- コマンドはメモリ使用量の多くを(新しいキーによって大きなセットを保存など)が発生した場合、時間をかけて、メモリ使用量が大幅にmaxmemory制限を超えることがあります。
2. LRUアルゴリズム
Redisのは完全にLRUアルゴリズムが使用されていません。キー自動追放、必ずしも最も満足LRUの機能が、おおよそLRUアルゴリズムにより、サンプルの鍵の少量を抽出して、キーの最古のアクセス時間を削除します。
追い出しアルゴリズム、最初からRedisの3.0を大幅にアルゴリズムの効率を向上させる候補としてプール(プール)を使用し、巨大な最適化されて、だけでなく、近いリアルLRUアルゴリズムにしました。
RedisのLRUアルゴリズムでは、サンプル数(サンプル)を設定することにより、アルゴリズムの精度が同調することが可能です。設定手順によって:
maxmemory-samples 5
4.文字列型の値は、最大容量はどのくらいです保存することができますか?
512M
5.なぜRedisのは、メモリにすべてのデータを必要としますか?
Redisのメモリへの最速の読み取りと書き込み速度データを得るため、および非同期データをディスクに書き込むことで。
- そのため、高速での機能の永続データをRedisの。真剣にあなたがメモリ内のデータを入れていない場合は、ディスクI / O速度はRedisののパフォーマンスに影響を与えます。
- メモリ今日安くなって、Redisのは、ますます人気になるだろう。
6. Redisのクラスタプログラムが行う方法をすべきですか?解決策は何ですか?
- CODIS
現在最も使用されるクラスタープログラム、基本的で一貫性のあるtwemproxy効果を、タルトは、ノードが新しいハッシュノードにデータを復元するために、ノードの数を変えることで対応しています。
彼の一貫性ハッシュアルゴリズムによって特徴付け2.redis cluster3.0自身のクラスタは、分散が、ノードからハッシュスロット、ならびにそれらの支持ノードの設定の概念ではありません。
どのような状況下で7 Redisのクラスタリングソリューションは、クラスタ全体が使用できない原因でしょうか?
レプリケーションモデルの非存在下での3つのノードのA、B、Cを持つクラスタ、ノードBに障害が発生した場合、クラスタ全体がこの範囲を5501から11000のスロットが利用できない欠くことになります。
8. MySQLは、そこ2000Wデータ、Redisのデータストアのみ20Wであり、そしてどのようにそのデータを確実にするためにRedisの中にホットデータのですか?
データセットのRedisのメモリサイズは、特定のサイズに上昇すると、彼らはデータ消去戦略を実行します。
どのような長所と短所9 Jedis Redissonコントラスト?
Jedisは、APIは、Redisのコマンドのより包括的なサポートを提供し、クライアントのRedisのJava実装です。
分散型でスケーラブルなJavaデータ構造をRedisson、そしてJedisは比較的単純な関数は、文字列操作がサポートされていないために比べ、特性、取引、パイプライン、および他のパーティションをソートするRedisのサポートされていません。Redisson目的は、それによって、ビジネスロジックにより狭く集中するユーザーを有効にすると、ユーザのRedisへの関心の分離を促進することです。
どのように10.Redisは、パスワードを設定し、パスワードを確認しますか?
パスワード:コンフィグ設定requirepass 123456
認証パスワード:認証123456
コンセプト11.Redisハッシュスロット?
クラスタの各ノードは、Redisのハッシュ一貫性が、クラスタの一部を担当して配置されるチャネルを決定するハッシュ溝、16384個のクラスタRedisのハッシュスロット、モジュロ16384のCRC16チェックサムによる各キーの概念の導入を使用していませんハッシュスロット。
附属書:Redisのデモを使用してJava
Redisのは、接続して取得します
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* @author Winstone
* @date 2019/12/20 - 1:26 下午
*/
public class RedisUtil {
//服务器IP地址
private static String ADDR = "127.0.0.1";
//端口
private static int PORT = 6379;
//密码
private static String AUTH;
//连接实例的最大连接数
private static int MAX_ACTIVE = 1024;
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
private static int MAX_IDLE = 200;
//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
private static int MAX_WAIT = 10000;
//连接超时的时间
private static int TIMEOUT = 10000;
// 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
private static boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool = null;
//数据库模式是16个数据库 0~15
public static final int DEFAULT_DATABASE = 0;
/**
* 初始化Redis连接池
*/
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(MAX_ACTIVE);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT,AUTH,DEFAULT_DATABASE);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取Jedis实例
*/
public synchronized static Jedis getJedis() {
try {
if (jedisPool != null) {
Jedis resource = jedisPool.getResource();
System.out.println("redis--服务正在运行: "+resource.ping());
return resource;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/***
*
* 释放资源
*/
public static void returnResource(final Jedis jedis) {
if(jedis != null) {
jedisPool.returnResource(jedis);
}
}
}
Redisの操作
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* @author Winstone
* @date 2019/12/20 - 12:15 上午
*/
public class RedisOptions {
private final static Jedis conn = RedisConnection.getRedisConnection();
// 字符串操作
public boolean set(String key, String value) {
try {
conn.set(key, value);
return true;
} catch (Exception e) {
return false;
}
}
public String get(String key) {
try {
return conn.get(key);
} catch (Exception e) {
return null;
}
}
//队列操作
public boolean setList(String name, String[] list) {
if (list.length != 0) {
for (String str : list) {
conn.lpush(name, str);
}
return true;
} else {
return false;
}
}
public boolean setList(String name, List<String> list) {
if (list.size() != 0) {
for (String str : list) {
conn.lpush(name, str);
}
return true;
} else {
return false;
}
}
public List<String> getList(String name){
long length = conn.llen(name);
List<String> list = new ArrayList<String>();
if (length>0){
list = conn.lrange(name,0,length-1);
}
return list;
}
//集合操作
public boolean setSet(String name, Set<String> set){
if (!set.isEmpty()){
for (String str:set){
conn.sadd(name,str);
}
return true;
}
return false;
}
}