Redisの簡単な使用(一)
21074 ワード
1.Redisの概要
Redisは1つのオープンソースで、C言語を使って編纂して、“キー/値”のタイプのデータに対する分布式のNoSQLデータベースシステムに向いて、特徴は高性能で、持続的に保存して、高い同時の応用シーンに適応します.Redisは純粋にアプリケーションのために生成され、高性能のkey-valueデータベースであり、多くの言語のAPI性能テストの結果は、SET操作が1秒当たり110000回、GET操作が1秒当たり81000回(もちろん、異なるサーバ構成の性能が異なる)であることを示している.
redisは現在、string(文字列)、list(チェーンテーブル)、Hash(ハッシュ)、set(集合)、zset(sorted set)(秩序化集合)の5つのデータ型を提供しています.
2.RedisとMemcachedの比較
(1)Memcachedはマルチスレッドである、Redisはシングルスレッドを用いる.
(2)Memcachedは予め割り当てられたメモリプール方式を用い,Redisは現場申請メモリ方式を用いてデータを格納し,仮想メモリを構成することができる.
(3)Redisは永続化,主従レプリケーション,故障回復を実現できる.
(4)Memcachedは単純なkeyとvalueにすぎないが,Redisはデータ型をサポートすることが多い.
(5)Redisの記憶はメモリ記憶、ディスク記憶に分ける.この点から、RedisとMemcachedには違いがあることも説明されています.RedisはMemcachedと同様に,効率を確保するためにデータをメモリにキャッシュする.違いはredisが更新したデータを定期的にディスクに書き込むか、修正操作を追加の記録ファイルに書き込むか、それに基づいてmaster-slave同期を実現することである.
3.Redisストレージ方式
Redisは永続化をサポートするメモリ・データベースです.つまり、redisは常にメモリ内のデータをハードディスクに同期して永続化を保証する必要があります.
Redisは2つの持続化方式をサポートする.
(1):snapshotting(スナップショット)もデフォルトです.(データをバックアップしてファイルに保存する)
(2)Append-only file(aofと略す)の方式
スナップショットはデフォルトの永続化方式で、メモリ内のデータをスナップショットでバイナリファイルに書き込み、デフォルトのファイル名
はdump.rdb.スナップショットの持続性を自動的に設定する方法を設定できます.redisをn秒以内にm個のkeyを超えると
キーを変更すると自動的にスナップショットが作成されます.
aof方式:スナップショット方式は一定間隔で1回やっているので、redisが意外にダウンしてしまうと、最後の1回を失うことになります
スナップショット後のすべての変更.aofがスナップショット方式よりも持続性が高いのは、aofを使用するとredisが受信するたびに
書き込みコマンドはwrite関数でファイルに追加され、redisが再起動するとファイルに保存されている書き込みコマンドを再実行してメモリで再構築されます.
データベース全体の内容.
もちろんosはカーネルにwriteの変更をキャッシュするので、すぐにディスクに書き込むわけではないかもしれません.真陽aof方式の持続化
一部の修正が失われる可能性もあります.プロファイルを使用して、fsync関数でosをディスクに強制的に書き込むようにredisに伝えることができます.
というタイミングで.
Redisには2つのストレージ方式があり、デフォルトはsnapshot方式であり、実装方法はメモリのスナップショット(snapshot)を定期的にハードディスクに永続化することであり、この方法の欠点は永続化後にcrashが発生するとデータが失われることである.そのため、完璧主義者の推進の下で著者はaof方式を増やした.aofすなわちappend only modeは、メモリデータを書き込むと同時に操作コマンドをログファイルに保存し、同時に何万も変更するシステムでは、コマンドログは非常に膨大なデータであり、管理メンテナンスコストが非常に高く、リカバリ再構築時間が非常に長くなり、aofの高可用性の本意を失うことになります.さらに重要なのはRedisがメモリデータ構造モデルであり,すべての利点がメモリの複雑なデータ構造に対して効率的な原子操作に確立されていることであり,aofは非常に不調和な部分であることがわかる.
実はaofの目的は主にデータの信頼性と高可用性である.
4.Redisインストール
ダウンロード:https://github.com/dmajkic/redis/downloads
redis-server.exe:サービスプログラム
redis-check-dump.exe:ローカルデータベースチェック
redis-check-aof.exe:更新ログチェック
redis-benchmark.exe:性能テストは、N個のクライアントから同時にM個のSETs/GETsクエリを送信することをシミュレートする.
redis-cli.exe:サービス側がオンになると、クライアントはさまざまなコマンドテストを入力できます.
cmdウィンドウを開き、cdコマンドを使用して指定したディレクトリに切り替えます(F:Redis)
redis-serverを実行します.exe redis.conf
cmdウィンドウを再度開き、cdコマンドを使用して指定ディレクトリ(F:Redis)に切り替えてredis-cliを実行します.exe-h 127.0.0.1-p 6379、うち127.0.0.1はローカルip、6379はredisサービス側のデフォルトポートである(これにより、クライアントプログラムを開いて特殊な命令のテストを行うことができる).
このサービスをwindowsシステムサービスに設定して、Redisサービスインストールソフトウェアをダウンロードして、インストールすればいいです.(
https://github.com/rgl/redis/downloads )
C#コール
パッケージマネージャコンソール
PM> Install-Package ServiceStack.Redis
5.Redis共通データ型
l Redisで最もよく使われるデータ型は主に以下の5種類があります.
String、Hash、List、Set、SortedSet
Stringは最も一般的なデータ型であり、通常のkey/valueストレージはこのようなものに分類することができます.1つのキーは1つのValueに対応し、stringタイプはバイナリで安全です.Redisのstringは、jpgピクチャ(バイナリ生成)やシーケンス化されたオブジェクトなどの任意のデータを含むことができる.
Hashはstringタイプのfieldとvalueのマッピングテーブルです.hashは特にオブジェクトを格納するのに適している.オブジェクトの各フィールドを単一stringタイプに保存することに対して.1つのオブジェクトがhashタイプに格納されると、より少ないメモリが消費され、オブジェクト全体へのアクセスが容易になります.key valueとして存在し,多くの開発者が自然にset/get方式を用いてRedisを使用しているが,実際には最適化された使用方法ではない.特にVMが有効になっていない場合、Redisのすべてのデータはメモリを入れる必要があり、メモリを節約することが特に重要である.
Listはチェーンテーブル構造であり,主な機能はpush,popであり,1つの範囲のすべての値を取得するなど,操作中keyはチェーンテーブル名として理解される.Redisのlistタイプは、実は各サブ要素がstringタイプの双方向チェーンテーブルです.push,pop操作によりチェーンテーブルのヘッダまたはテールから削除要素を追加することができ,listはスタックとしてもキューとしてもよい.Redis listの実装は、逆検索とループをサポートする双方向チェーンテーブルであり、操作が容易であるが、メモリオーバーヘッドの一部をもたらし、送信バッファキューなど、Redis内部の実装の多くは、このデータ構造を使用している.
setはstringタイプの無秩序な集合です.setはhash tableによって実現され、追加、削除、検索され、集合に対して私たちは並列セット、交差、差セットを取ることができる.
sorted setはsetのアップグレードバージョンであり、setに基づいて順序の属性を追加し、この属性は変更を追加している.要素の場合は指定できますが、指定するたびにzset(整列集合を表す)が自動的に新しい値で順序を変更します.カラムのあるテーブル、1カラムvalue、1カラム順序として理解できます.操作中のkeyはzsetの名前と理解する.
Redis sorted setの使用シーンはsetと類似しており、setは自動秩序ではないが、sorted setはユーザが優先度(score)のパラメータを追加してメンバーをソートすることができ、挿入秩序、すなわち自動ソートである.秩序正しく重複しないコレクションリストが必要な場合は、sorted setデータ構造を選択できます.
事例コード:
Redisは1つのオープンソースで、C言語を使って編纂して、“キー/値”のタイプのデータに対する分布式のNoSQLデータベースシステムに向いて、特徴は高性能で、持続的に保存して、高い同時の応用シーンに適応します.Redisは純粋にアプリケーションのために生成され、高性能のkey-valueデータベースであり、多くの言語のAPI性能テストの結果は、SET操作が1秒当たり110000回、GET操作が1秒当たり81000回(もちろん、異なるサーバ構成の性能が異なる)であることを示している.
redisは現在、string(文字列)、list(チェーンテーブル)、Hash(ハッシュ)、set(集合)、zset(sorted set)(秩序化集合)の5つのデータ型を提供しています.
2.RedisとMemcachedの比較
(1)Memcachedはマルチスレッドである、Redisはシングルスレッドを用いる.
(2)Memcachedは予め割り当てられたメモリプール方式を用い,Redisは現場申請メモリ方式を用いてデータを格納し,仮想メモリを構成することができる.
(3)Redisは永続化,主従レプリケーション,故障回復を実現できる.
(4)Memcachedは単純なkeyとvalueにすぎないが,Redisはデータ型をサポートすることが多い.
(5)Redisの記憶はメモリ記憶、ディスク記憶に分ける.この点から、RedisとMemcachedには違いがあることも説明されています.RedisはMemcachedと同様に,効率を確保するためにデータをメモリにキャッシュする.違いはredisが更新したデータを定期的にディスクに書き込むか、修正操作を追加の記録ファイルに書き込むか、それに基づいてmaster-slave同期を実現することである.
3.Redisストレージ方式
Redisは永続化をサポートするメモリ・データベースです.つまり、redisは常にメモリ内のデータをハードディスクに同期して永続化を保証する必要があります.
Redisは2つの持続化方式をサポートする.
(1):snapshotting(スナップショット)もデフォルトです.(データをバックアップしてファイルに保存する)
(2)Append-only file(aofと略す)の方式
スナップショットはデフォルトの永続化方式で、メモリ内のデータをスナップショットでバイナリファイルに書き込み、デフォルトのファイル名
はdump.rdb.スナップショットの持続性を自動的に設定する方法を設定できます.redisをn秒以内にm個のkeyを超えると
キーを変更すると自動的にスナップショットが作成されます.
aof方式:スナップショット方式は一定間隔で1回やっているので、redisが意外にダウンしてしまうと、最後の1回を失うことになります
スナップショット後のすべての変更.aofがスナップショット方式よりも持続性が高いのは、aofを使用するとredisが受信するたびに
書き込みコマンドはwrite関数でファイルに追加され、redisが再起動するとファイルに保存されている書き込みコマンドを再実行してメモリで再構築されます.
データベース全体の内容.
もちろんosはカーネルにwriteの変更をキャッシュするので、すぐにディスクに書き込むわけではないかもしれません.真陽aof方式の持続化
一部の修正が失われる可能性もあります.プロファイルを使用して、fsync関数でosをディスクに強制的に書き込むようにredisに伝えることができます.
というタイミングで.
Redisには2つのストレージ方式があり、デフォルトはsnapshot方式であり、実装方法はメモリのスナップショット(snapshot)を定期的にハードディスクに永続化することであり、この方法の欠点は永続化後にcrashが発生するとデータが失われることである.そのため、完璧主義者の推進の下で著者はaof方式を増やした.aofすなわちappend only modeは、メモリデータを書き込むと同時に操作コマンドをログファイルに保存し、同時に何万も変更するシステムでは、コマンドログは非常に膨大なデータであり、管理メンテナンスコストが非常に高く、リカバリ再構築時間が非常に長くなり、aofの高可用性の本意を失うことになります.さらに重要なのはRedisがメモリデータ構造モデルであり,すべての利点がメモリの複雑なデータ構造に対して効率的な原子操作に確立されていることであり,aofは非常に不調和な部分であることがわかる.
実はaofの目的は主にデータの信頼性と高可用性である.
4.Redisインストール
ダウンロード:https://github.com/dmajkic/redis/downloads
redis-server.exe:サービスプログラム
redis-check-dump.exe:ローカルデータベースチェック
redis-check-aof.exe:更新ログチェック
redis-benchmark.exe:性能テストは、N個のクライアントから同時にM個のSETs/GETsクエリを送信することをシミュレートする.
redis-cli.exe:サービス側がオンになると、クライアントはさまざまなコマンドテストを入力できます.
cmdウィンドウを開き、cdコマンドを使用して指定したディレクトリに切り替えます(F:Redis)
redis-serverを実行します.exe redis.conf
cmdウィンドウを再度開き、cdコマンドを使用して指定ディレクトリ(F:Redis)に切り替えてredis-cliを実行します.exe-h 127.0.0.1-p 6379、うち127.0.0.1はローカルip、6379はredisサービス側のデフォルトポートである(これにより、クライアントプログラムを開いて特殊な命令のテストを行うことができる).
このサービスをwindowsシステムサービスに設定して、Redisサービスインストールソフトウェアをダウンロードして、インストールすればいいです.(
https://github.com/rgl/redis/downloads )
C#コール
パッケージマネージャコンソール
PM> Install-Package ServiceStack.Redis
5.Redis共通データ型
l Redisで最もよく使われるデータ型は主に以下の5種類があります.
String、Hash、List、Set、SortedSet
Stringは最も一般的なデータ型であり、通常のkey/valueストレージはこのようなものに分類することができます.1つのキーは1つのValueに対応し、stringタイプはバイナリで安全です.Redisのstringは、jpgピクチャ(バイナリ生成)やシーケンス化されたオブジェクトなどの任意のデータを含むことができる.
Hashはstringタイプのfieldとvalueのマッピングテーブルです.hashは特にオブジェクトを格納するのに適している.オブジェクトの各フィールドを単一stringタイプに保存することに対して.1つのオブジェクトがhashタイプに格納されると、より少ないメモリが消費され、オブジェクト全体へのアクセスが容易になります.key valueとして存在し,多くの開発者が自然にset/get方式を用いてRedisを使用しているが,実際には最適化された使用方法ではない.特にVMが有効になっていない場合、Redisのすべてのデータはメモリを入れる必要があり、メモリを節約することが特に重要である.
Listはチェーンテーブル構造であり,主な機能はpush,popであり,1つの範囲のすべての値を取得するなど,操作中keyはチェーンテーブル名として理解される.Redisのlistタイプは、実は各サブ要素がstringタイプの双方向チェーンテーブルです.push,pop操作によりチェーンテーブルのヘッダまたはテールから削除要素を追加することができ,listはスタックとしてもキューとしてもよい.Redis listの実装は、逆検索とループをサポートする双方向チェーンテーブルであり、操作が容易であるが、メモリオーバーヘッドの一部をもたらし、送信バッファキューなど、Redis内部の実装の多くは、このデータ構造を使用している.
setはstringタイプの無秩序な集合です.setはhash tableによって実現され、追加、削除、検索され、集合に対して私たちは並列セット、交差、差セットを取ることができる.
sorted setはsetのアップグレードバージョンであり、setに基づいて順序の属性を追加し、この属性は変更を追加している.要素の場合は指定できますが、指定するたびにzset(整列集合を表す)が自動的に新しい値で順序を変更します.カラムのあるテーブル、1カラムvalue、1カラム順序として理解できます.操作中のkeyはzsetの名前と理解する.
Redis sorted setの使用シーンはsetと類似しており、setは自動秩序ではないが、sorted setはユーザが優先度(score)のパラメータを追加してメンバーをソートすることができ、挿入秩序、すなわち自動ソートである.秩序正しく重複しないコレクションリストが必要な場合は、sorted setデータ構造を選択できます.
事例コード:
class Program
{
static void Main(string[] args)
{
RedisClient redisClient = new RedisClient("127.0.0.1",6379);
#region
//redisClient.Set<string>("name", "yxl");
//Console.WriteLine(redisClient.Get<string>("name"));
//UserInfo userInfo = new UserInfo() { UserName = "zhangsan", UserPwd = "1111" };// ( json )
//redisClient.Set<UserInfo>("userInfo", userInfo);
//UserInfo user = redisClient.Get<UserInfo>("userInfo");
//Console.WriteLine(user.UserName);
//List<UserInfo> list = new List<UserInfo>() { new UserInfo() { UserName = "lisi", UserPwd = "111" }, new UserInfo() { UserName = "wangwu", UserPwd = "123" } };
//redisClient.Set<List<UserInfo>>("list", list);
//List<UserInfo> userInfoList = redisClient.Get<List<UserInfo>>("list");
//foreach (UserInfo item in userInfoList)
//{
// Console.WriteLine(item.UserName);
//}
#endregion
#region Hash
// redisClient.SetEntryInHash("userInfoId", "name", "yxlhashName");
// redisClient.SetEntryInHash("userInfoId", "name2", "yxlhashName");
// List<string> hashKeys = redisClient.GetHashKeys("userInfoId");
//List<string> hashValues = redisClient.GetHashValues("userInfoId");
//long hashCount = redisClient.GetHashCount("userInfoId");
// Console.WriteLine(hashCount);//2
// foreach (string hashKey in hashKeys)
// {
// Console.WriteLine(hashKey);//name,name2
// }
// foreach (string hashValue in hashValues)
// {
// Console.WriteLine(hashValue);//yxlhashName,yxlhashName
// }
#endregion
#region List
#region ,
//redisClient.EnqueueItemOnList("name1", "zhangsan");
//redisClient.EnqueueItemOnList("name1", "lisi");
//long length = redisClient.GetListCount("name1");
//for (int i = 0; i < length; i++)
//{
// Console.WriteLine(redisClient.DequeueItemFromList("name1"));
//}
#endregion
#region ,
//redisClient.PushItemToList("name1", "zhangsan");
//redisClient.PushItemToList("name1", "lisi");
//long length = redisClient.GetListCount("name1");
//for (int i = 0; i < length; i++)
//{
// Console.WriteLine(redisClient.PopItemFromList("name1"));
//}
#endregion
#endregion
#region Set , , , , .
#region
//redisClient.AddItemToSet("a3", "ddd");
//redisClient.AddItemToSet("a3", "ccc");
//redisClient.AddItemToSet("a3", "tttt");
//redisClient.AddItemToSet("a3", "sssh");
//redisClient.AddItemToSet("a3", "hhhh");
//System.Collections.Generic.HashSet<string> hashset = redisClient.GetAllItemsFromSet("a3");
//foreach (string str in hashset)
//{
// Console.WriteLine(str);
//}
#endregion
#region
//redisClient.AddItemToSet("a3", "ddd");
//redisClient.AddItemToSet("a3", "ccc");
//redisClient.AddItemToSet("a3", "tttt");
//redisClient.AddItemToSet("a3", "sssh");
//redisClient.AddItemToSet("a3", "hhhh");
//redisClient.AddItemToSet("a4", "hhhh");
//redisClient.AddItemToSet("a4", "h777");
//System.Collections.Generic.HashSet<string> hashset = redisClient.GetUnionFromSets(new string[] { "a3", "a4" });
//foreach (string str in hashset)
//{
// Console.WriteLine(str);
//}
#endregion
#region
//redisClient.AddItemToSet("a3", "ddd");
//redisClient.AddItemToSet("a3", "ccc");
//redisClient.AddItemToSet("a3", "tttt");
//redisClient.AddItemToSet("a3", "sssh");
//redisClient.AddItemToSet("a3", "hhhh");
//redisClient.AddItemToSet("a4", "hhhh");
//redisClient.AddItemToSet("a4", "h777");
//System.Collections.Generic.HashSet<string> hashset = redisClient.GetIntersectFromSets(new string[] { "a3", "a4" });
//foreach (string str in hashset)
//{
// Console.WriteLine(str);
//}
#endregion
#region
//redisClient.AddItemToSet("a3", "ddd");
//redisClient.AddItemToSet("a3", "ccc");
//redisClient.AddItemToSet("a3", "tttt");
//redisClient.AddItemToSet("a3", "sssh");
//redisClient.AddItemToSet("a3", "hhhh");
//redisClient.AddItemToSet("a4", "hhhh");
//redisClient.AddItemToSet("a4", "h777");
//System.Collections.Generic.HashSet<string> hashset = redisClient.GetDifferencesFromSet("a3",new string[] { "a4" });
//// (a3), (a4)
//foreach (string str in hashset)
//{
// Console.WriteLine(str);
//}
#endregion
#endregion
#region Sorted Set
//redisClient.AddItemToSortedSet("a5", "ffff");
//redisClient.AddItemToSortedSet("a5", "bbbb");
//redisClient.AddItemToSortedSet("a5", "gggg");
//redisClient.AddItemToSortedSet("a5", "cccc");
//redisClient.AddItemToSortedSet("a5", "waaa");
//System.Collections.Generic.List<string> list = redisClient.GetAllItemsFromSortedSet("a5");
//foreach (string str in list)
//{
// Console.WriteLine(str);
//}
#endregion
}
public class UserInfo
{
public string UserName { get; set; }
public string UserPwd { get; set; }
}
}