ホームページ  >  記事  >  バックエンド開発  >  Windows で Redis キャッシュ サーバーを使用する方法

Windows で Redis キャッシュ サーバーを使用する方法

高洛峰
高洛峰オリジナル
2017-02-08 13:53:231385ブラウズ

1. Redis サーバー


まず Redis サーバーをダウンロードし、クリックして .msi バージョンをダウンロードし、ダブルクリックして Redis サーバーをインストールし、システムをサービスとして起動します:

Windows で Redis キャッシュ サーバーを使用する方法

Redis をインストールするサーバーの後に最初に行うことは、パスワードを設定してインストール ディレクトリを入力することです: C:Program FilesRedis - 構成ファイルを検索します: redis.windows-service.conf - 検索: # requirepass fo Bared - 入力して改行し、追加します: requirepass Writeここに新しいパスワードを入力します (先頭行にスペースを入れないでください) - サービスに移動して Redis サービスを再起動するか、コンピューターを再起動します

パスワードを設定しない場合のデメリットは、何が起こったかを見てください。 Ctrip のこの人: Redis が攻撃された事件を思い出してください


2. Redis クライアント (コマンド ラインおよび視覚化ツール RDM)

コマンド ライン モードのデモ: Redis クライアントを起動し、Redis サーバーの読み取りと書き込みを行います

Windows で Redis キャッシュ サーバーを使用する方法

上の図のコマンドの説明:

cd C:Program FilesRedis:cd このコマンドは、Redis インストール ディレクトリに入ります。これは、Windows システムの

redis-cli.exe をダブルクリックして Redis インストール ディレクトリに入るのと同じです。 redis-cli クライアント プログラムを開きます。これは、Windows システムで exe プログラムをダブルクリックして実行するのと同じです (上記の Redis サービスがインストールされています。サーバーに接続するにはクライアント プログラムが必要です。ローカル Redis サーバーに接続するには、このコマンドを直接入力して、リモート サーバーに接続するには、IP とポートを追加する必要があります。例: redis-cli.exe -h 111.11.11.111 -p 6379)


keys *: すべてのキーを表示します。値のペア (Redis サーバーがパスワードを設定している場合、このコマンドはエラーを報告します。最初にパスワードを入力する必要があります。次のコマンドを実行します: パスワードを認証します)

set blog oppoic.cnblogs.com: 設定 A キーと値ペア、キーは: blog、値は: oppoic.cnblogs.com (ディレクトリによって保存: ディレクトリ名を設定: キー値)

get blog: キー blog に対応する値を取得します

keys *: すべてのキーを表示値のペア

その他の一般的なコマンド:

config get dir: Redis インストール ディレクトリを取得します

ping: Redis サーバーが正常であることを示す PONG を返します

redis-cli.exe: 最初のデータベース (デフォルト)、redis を入力しますtotals 0 to 15 合計 16 のライブラリがあります。3 番目のライブラリに入ります。 redis-cli -n 2 (既に入力されています。0 ~ 15 を選択し、任意に切り替えます)

quit: redis プログラムを終了します

exit: dos ウィンドウを終了します

flushdb: 現在選択されているデータベースを削除します。

flushall のすべてのキーを削除します。

その他のコマンド: https://redis.io/commands

この時点で、このマシン上で Redis キャッシュ サーバーが実行されています。がセットアップされており、読み取りと書き込みが可能です。ただし、コマンド ラインは明らかに初心者ユーザーにとって使いやすいものではありません。ビジュアル ツールは次のとおりです: Redis Desktop Manager (https://redisdesktop.com/download)

Windows で Redis キャッシュ サーバーを使用する方法

左側のツリーは、すでに接続があることを示しています。下部の [Redis に接続] をクリックします。 サーバーが別の接続を追加します:

名前: 接続名、適当に選択します

ホスト: ホスト アドレス、このマシンは 127.0.0.1、リモート入力は IP に対応します

ポート: ポート、 Redis サーバーのデフォルトのポートは 6379 です

Auth: パスワード、設定されている場合は失われ、設定されていない場合は空白のままにしてください

Redis サーバーに接続すると、デフォルトで 16 のライブラリがあることがわかります (設定ファイルは変更可能)、そしてインデックスは 0 から始まります。一般的な使用法は、1 つのプロジェクトと 1 つのライブラリを持ち、プロジェクト内の異なる機能モジュールがこのライブラリの下の異なるディレクトリに保存されることです。

可視化ツールを手に入れた後の操作は言うまでもなく、ダブルクリック、右クリックで作成、削除です。 。 。 Windows システムの使用方法を知っている人なら誰でも、このツールを使用できます。 Redis Desktop Manager は、コマンド ラインと比較して、リモート サーバー上のデータをデバッグするのにさらに使いやすく便利なビジュアル ツールです。

注: このマシンではこれを実行できます。リモート サーバーに接続するには、サーバー上の Redis インストール ディレクトリに移動し、redis.windows-service.conf ファイルを見つけて、bind 127.0.0.1 を見つけてコメント化する必要があります。先頭に「#」を付けてサービスを右クリックし、redis サービスを再起動するか、Windows システムを再起動します

3. C# は Redis サーバーを操作します

上記は Redis サーバーを操作するためのコマンドラインとビジュアルツールです。C# プログラムは Redis を操作するために StackExchange.Redis (https://github.com/StackExchange/StackExchange.Redis) を使用する必要があります。統合呼び出しを行うために、RedisHelper ヘルパー クラスをカプセル化します:

using Newtonsoft.Json;
using StackExchange.Redis;
using System;
using System.ComponentModel;
using System.Configuration;
using System.Reflection;
using System.Text;

namespace redis_Demo
{
    /// <summary>
    /// Redis 帮助类
    /// </summary>
    public static class RedisHelper
    {
        private static string _conn = ConfigurationManager.AppSettings["redis_connection_string"] ?? "127.0.0.1:6379";
        private static string _pwd = ConfigurationManager.AppSettings["redis_connection_pwd"] ?? "123456";

        static ConnectionMultiplexer _redis;
        static readonly object _locker = new object();

        #region 单例模式
        public static ConnectionMultiplexer Manager
        {
            get
            {
                if (_redis == null)
                {
                    lock (_locker)
                    {
                        if (_redis != null) return _redis;

                        _redis = GetManager();
                        return _redis;
                    }
                }
                return _redis;
            }
        }

        private static ConnectionMultiplexer GetManager(string connectionString = null)
        {
            if (string.IsNullOrEmpty(connectionString))
            {
                connectionString = _conn;
            }
            var options = ConfigurationOptions.Parse(connectionString);
            options.Password = _pwd;
            return ConnectionMultiplexer.Connect(options);
        }
        #endregion

        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="folder">目录</param>
        /// <param name="key">键</param>
        /// <param name="value">值</param>
        /// <param name="expireMinutes">过期时间,单位:分钟。默认600分钟</param>
        /// <param name="db">库,默认第一个。0~15共16个库</param>
        /// <returns></returns>
        public static bool StringSet(CacheFolderEnum folder, string key, string value, int expireMinutes = 600, int db = -1)
        {
            string fd = GetDescription(folder);
            return Manager.GetDatabase(db).StringSet(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, value, TimeSpan.FromMinutes(expireMinutes));
        }

        /// <summary>
        /// 获取
        /// </summary>
        /// <param name="folder">目录</param>
        /// <param name="key">键</param>
        /// <param name="db">库,默认第一个。0~15共16个库</param>
        /// <returns></returns>
        public static string StringGet(CacheFolderEnum folder, string key, int db = -1)
        {
            try
            {
                string fd = GetDescription(folder);
                return Manager.GetDatabase(db).StringGet(string.IsNullOrEmpty(fd) ? key : fd + ":" + key);
            }
            catch (Exception)
            {
                return null;
            }
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="folder">目录</param>
        /// <param name="key">键</param>
        /// <param name="db">库,默认第一个。0~15共16个库</param>
        /// <returns></returns>
        public static bool StringRemove(CacheFolderEnum folder, string key, int db = -1)
        {
            try
            {
                string fd = GetDescription(folder);
                return Manager.GetDatabase(db).KeyDelete(string.IsNullOrEmpty(fd) ? key : fd + ":" + key);
            }
            catch (Exception)
            {
                return false;
            }
        }
        /// <summary>
        /// 是否存在
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="db">库,默认第一个。0~15共16个库</param>
        public static bool KeyExists(CacheFolderEnum folder, string key, int db = -1)
        {
            try
            {
                string fd = GetDescription(folder);
                return Manager.GetDatabase(db).KeyExists(string.IsNullOrEmpty(fd) ? key : fd + ":" + key);
            }
            catch (Exception)
            {
                return false;
            }
        }

        /// <summary>
        /// 延期
        /// </summary>
        /// <param name="folder">目录</param>
        /// <param name="key">键</param>
        /// <param name="min">延长时间,单位:分钟,默认600分钟</param>
        /// <param name="db">库,默认第一个。0~15共16个库</param>
        public static bool AddExpire(CacheFolderEnum folder, string key, int min = 600, int db = -1)
        {
            try
            {
                string fd = GetDescription(folder);
                return Manager.GetDatabase(db).KeyExpire(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, DateTime.Now.AddMinutes(min));
            }
            catch (Exception)
            {
                return false;
            }
        }

        /// <summary>
        /// 添加实体
        /// </summary>
        /// <param name="folder">目录</param>
        /// <param name="key">键</param>
        /// <param name="t">实体</param>
        /// <param name="ts">延长时间,单位:分钟,默认600分钟</param>
        /// <param name="db">库,默认第一个。0~15共16个库</param>
        public static bool Set<T>(CacheFolderEnum folder, string key, T t, int expireMinutes = 600, int db = -1)
        {
            string fd = GetDescription(folder);
            var str = JsonConvert.SerializeObject(t);
            return Manager.GetDatabase(db).StringSet(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, str, TimeSpan.FromMinutes(expireMinutes));
        }

        /// <summary>
        /// 获取实体
        /// </summary>
        /// <param name="folder">目录</param>
        /// <param name="key">键</param>
        /// <param name="db">库,默认第一个。0~15共16个库</param>
        public static T Get<T>(CacheFolderEnum folder, string key, int db = -1) where T : class
        {
            string fd = GetDescription(folder);
            var strValue = Manager.GetDatabase(db).StringGet(string.IsNullOrEmpty(fd) ? key : fd + ":" + key);
            return string.IsNullOrEmpty(strValue) ? null : JsonConvert.DeserializeObject<T>(strValue);
        }

        /// <summary>
        /// 获得枚举的Description
        /// </summary>
        /// <param name="value">枚举值</param>
        /// <param name="nameInstead">当枚举值没有定义DescriptionAttribute,是否使用枚举名代替,默认是使用</param>
        /// <returns>枚举的Description</returns>
        private static string GetDescription(this Enum value, Boolean nameInstead = true)
        {
            Type type = value.GetType();
            string name = Enum.GetName(type, value);
            if (name == null)
            {
                return null;
            }

            FieldInfo field = type.GetField(name);
            DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;

            if (attribute == null && nameInstead == true)
            {
                return name;
            }
            return attribute == null ? null : attribute.Description;
        }
    }
}

キー名と値 wangjie を持つレコードを Redis サーバーの最初のライブラリの fd1 ディレクトリに追加します:

RedisHelper.StringSet(CacheFolderEnum.Folder1, "name", "wangjie");

このレコードを取得します:

string key = RedisHelper.StringGet(CacheFolderEnum.Folder1, "name");
Console.WriteLine("键为name的记录对应的值:" + key);

このレコードを削除します:

bool result = RedisHelper.StringRemove(CacheFolderEnum.Folder1, "name");
if (result)
{
    Console.WriteLine("键为name的记录删除成功");
}
else
{
    Console.WriteLine("键为name的记录删除失败");
}

このレコードが存在するかどうかをクエリします:

bool ifExist = RedisHelper.KeyExists(CacheFolderEnum.Folder1, "name");
if (ifExist)
{
    Console.WriteLine("键为name的记录存在");
}
else
{
    Console.WriteLine("键为name的记录不存在");
}

キー sd1 とオブジェクトの値を持つレコードを Redis サーバーの 2 番目のライブラリの fd2 ディレクトリに追加します:

Student student = new Student() { Id = 1, Name = "张三", Class = "三年二班" };
RedisHelper.Set<Student>(CacheFolderEnum.Folder2, "sd1", student, 10, 1);

このオブジェクトを取得します:

Student sdGet = RedisHelper.Get<Student>(CacheFolderEnum.Folder2, "sd1", 1);
if (sdGet != null)
{
    Console.WriteLine("Id:" + sdGet.Id + " Name:" + sdGet.Name + " Class:" + sdGet.Class);
}
else
{
    Console.WriteLine("找不到键为sd1的记录");
}

ソースコード: (http://files.cnblogs.com/files/oppoic/redis_Demo.zip)

環境はVS 2013です。実行できない場合は、csにコードをコピーし、自分でコンパイルして実行してください


4. その他

MSOpenTech によって開発された Redis キャッシュ サーバーには、書き込み後、コンピューターが再起動されたときにもキーと値のペアが存在し続けるため、有効期限を設定する必要があります。キーと値のペアを書き込むと、占有されていたメモリが解放されません。 Redis の保存方法は、文字列に対応するキーだけでなく、List、HashTable などにも対応します。もちろん、Redis のより高度な使用法は、依然として Linux で行われています。

Windows での Redis キャッシュ サーバーの使用に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。