{"id":3317,"date":"2025-03-24T08:46:27","date_gmt":"2025-03-23T23:46:27","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=3317"},"modified":"2025-03-24T08:46:58","modified_gmt":"2025-03-23T23:46:58","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91go%e3%81%a7redis%e3%82%92%e4%bd%bf%e3%81%84%e3%81%93%e3%81%aa%e3%81%99%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89-%e5%ae%9f%e8%a3%85%e3%81%8b%e3%82%89","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=3317","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Go\u3067Redis\u3092\u4f7f\u3044\u3053\u306a\u3059\u5b8c\u5168\u30ac\u30a4\u30c9 &#8211; \u5b9f\u88c5\u304b\u3089\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u307e\u3067"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Go\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3078\u306eredis\u306e\u5c0e\u5165\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">go-redis\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u57fa\u672c\u8a2d\u5b9a<\/a>      <\/li>      <li>        <a href=\"#i-2\">Redis\u63a5\u7d9a\u306e\u78ba\u7acb\u3068\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-3\">\u74b0\u5883\u5909\u6570\u3092\u4f7f\u7528\u3057\u305f\u5b89\u5168\u306a\u8a2d\u5b9a\u7ba1\u7406<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-4\">Go\u3067\u306eRedis\u57fa\u672c\u64cd\u4f5c\u30de\u30b9\u30bf\u30fc\u30ac\u30a4\u30c9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-5\">\u6587\u5b57\u5217\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u66f8\u304d\u64cd\u4f5c<\/a>      <\/li>      <li>        <a href=\"#i-6\">Hash\u3084List\u306a\u3069\u5404\u30c7\u30fc\u30bf\u578b\u306e\u52b9\u679c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-9\">\u6709\u52b9\u671f\u9650\uff08TTL\uff09\u306e\u8a2d\u5b9a\u3068\u30ad\u30fc\u7ba1\u7406<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-10\">\u5b9f\u8df5\u7684\u306aRedis\u30d1\u30bf\u30fc\u30f3\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-11\">\u30ad\u30e3\u30c3\u30b7\u30e5\u5c64\u3068\u3057\u3066\u306e\u52b9\u7387\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-12\">\u5206\u6563\u30ed\u30c3\u30af\u6a5f\u80fd\u306e\u5b9f\u88c5\u624b\u9806<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-13\">\u30d1\u30d6\u30ea\u30c3\u30b7\u30e5\/\u30b5\u30d6\u30b9\u30af\u30e9\u30a4\u30d6\u30d1\u30bf\u30fc\u30f3\u306e\u6d3b\u7528<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-14\">Redis\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-15\">\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30eb\u306e\u9069\u5207\u306a\u8a2d\u5b9a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-16\">\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u3092\u4f7f\u7528\u3057\u305f\u51e6\u7406\u306e\u9ad8\u901f\u5316<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-17\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996\u3068\u6700\u9069\u5316\u6226\u7565<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-18\">\u672c\u756a\u74b0\u5883\u3067\u306e\u904b\u7528\u30ce\u30a6\u30cf\u30a6<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-19\">\u5197\u9577\u5316\u69cb\u6210\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-20\">\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3068\u5fa9\u65e7\u6226\u7565<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-21\">\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u3068\u76e3\u8996\u306e\u8a2d\u5b9a<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">Go\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3078\u306eredis\u306e\u5c0e\u5165\u65b9\u6cd5<\/h2>\n\n\n\n<p>Go\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067redis\u3092\u4f7f\u7528\u3059\u308b\u969b\u306e\u57fa\u672c\u7684\u306a\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u304b\u3089\u5b9f\u88c5\u65b9\u6cd5\u307e\u3067\u3001\u8a73\u3057\u304f\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">go-redis\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u57fa\u672c\u8a2d\u5b9a<\/h3>\n\n\n\n<p>\u307e\u305a\u3001Go\u8a00\u8a9e\u3067Redis\u3092\u4f7f\u7528\u3059\u308b\u305f\u3081\u306b\u6700\u3082\u5e83\u304f\u4f7f\u308f\u308c\u3066\u3044\u308b\u30e9\u30a4\u30d6\u30e9\u30ea\u300cgo-redis\u300d\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">go get github.com\/redis\/go-redis\/v9<\/pre>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u63a5\u7d9a\u8a2d\u5b9a\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u884c\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"github.com\/redis\/go-redis\/v9\"\n)\n\nfunc main() {\n    \/\/ Redis\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u521d\u671f\u5316\n    rdb := redis.NewClient(&amp;redis.Options{\n        Addr:     \"localhost:6379\", \/\/ Redis \u30b5\u30fc\u30d0\u30fc\u306e\u30a2\u30c9\u30ec\u30b9\n        Password: \"\",               \/\/ \u30d1\u30b9\u30ef\u30fc\u30c9\uff08\u5fc5\u8981\u306a\u5834\u5408\uff09\n        DB:       0,               \/\/ \u4f7f\u7528\u3059\u308b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u756a\u53f7\n    })\n\n    \/\/ \u63a5\u7d9a\u30c6\u30b9\u30c8\n    ctx := context.Background()\n    _, err := rdb.Ping(ctx).Result()\n    if err != nil {\n        panic(err)\n    }\n\n    fmt.Println(\"Successfully connected to Redis!\")\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">Redis\u63a5\u7d9a\u306e\u78ba\u7acb\u3068\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/h3>\n\n\n\n<p>\u5b9f\u8df5\u7684\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u9069\u5207\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u304c\u91cd\u8981\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u3088\u308a\u5805\u7262\u306a\u63a5\u7d9a\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b\u3092\u793a\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">type RedisClient struct {\n    client *redis.Client\n    ctx    context.Context\n}\n\nfunc NewRedisClient(ctx context.Context) (*RedisClient, error) {\n    \/\/ \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u521d\u671f\u5316\n    client := redis.NewClient(&amp;redis.Options{\n        Addr:         \"localhost:6379\",\n        Password:     \"\",\n        DB:           0,\n        DialTimeout:  10 * time.Second,\n        ReadTimeout:  30 * time.Second,\n        WriteTimeout: 30 * time.Second,\n        PoolSize:     10,\n        PoolTimeout:  30 * time.Second,\n    })\n\n    \/\/ \u63a5\u7d9a\u30c6\u30b9\u30c8\n    if err := client.Ping(ctx).Err(); err != nil {\n        return nil, fmt.Errorf(\"failed to connect to redis: %v\", err)\n    }\n\n    return &amp;RedisClient{\n        client: client,\n        ctx:    ctx,\n    }, nil\n}\n\n\/\/ \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u30af\u30ed\u30fc\u30ba\u51e6\u7406\nfunc (rc *RedisClient) Close() error {\n    return rc.client.Close()\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">\u74b0\u5883\u5909\u6570\u3092\u4f7f\u7528\u3057\u305f\u5b89\u5168\u306a\u8a2d\u5b9a\u7ba1\u7406<\/h3>\n\n\n\n<p>\u672c\u756a\u74b0\u5883\u3067\u306e\u904b\u7528\u3092\u8003\u616e\u3057\u3001\u74b0\u5883\u5909\u6570\u3092\u4f7f\u7528\u3057\u305f\u8a2d\u5b9a\u7ba1\u7406\u3092\u5b9f\u88c5\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package config\n\nimport (\n    \"os\"\n    \"strconv\"\n)\n\ntype RedisConfig struct {\n    Host     string\n    Port     string\n    Password string\n    DB       int\n    PoolSize int\n}\n\nfunc LoadRedisConfig() (*RedisConfig, error) {\n    \/\/ \u74b0\u5883\u5909\u6570\u304b\u3089\u8a2d\u5b9a\u3092\u8aad\u307f\u8fbc\u3080\n    db, err := strconv.Atoi(getEnvOrDefault(\"REDIS_DB\", \"0\"))\n    if err != nil {\n        return nil, err\n    }\n\n    poolSize, err := strconv.Atoi(getEnvOrDefault(\"REDIS_POOL_SIZE\", \"10\"))\n    if err != nil {\n        return nil, err\n    }\n\n    return &amp;RedisConfig{\n        Host:     getEnvOrDefault(\"REDIS_HOST\", \"localhost\"),\n        Port:     getEnvOrDefault(\"REDIS_PORT\", \"6379\"),\n        Password: getEnvOrDefault(\"REDIS_PASSWORD\", \"\"),\n        DB:       db,\n        PoolSize: poolSize,\n    }, nil\n}\n\nfunc getEnvOrDefault(key, defaultValue string) string {\n    if value := os.Getenv(key); value != \"\" {\n        return value\n    }\n    return defaultValue\n}<\/pre>\n\n\n\n<p>\u3053\u306e\u8a2d\u5b9a\u3092\u4f7f\u7528\u3059\u308b\u969b\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u74b0\u5883\u5909\u6570\u3092\u8a2d\u5b9a\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">export REDIS_HOST=redis.example.com\nexport REDIS_PORT=6379\nexport REDIS_PASSWORD=your_password\nexport REDIS_DB=0\nexport REDIS_POOL_SIZE=20<\/pre>\n\n\n\n<p>\u3053\u308c\u306b\u3088\u308a\u3001\u74b0\u5883\u306b\u5fdc\u3058\u3066\u67d4\u8edf\u306b\u8a2d\u5b9a\u3092\u5909\u66f4\u3067\u304d\u308b\u5805\u7262\u306aRedis\u63a5\u7d9a\u306e\u57fa\u76e4\u304c\u6574\u3044\u307e\u3059\u3002\u5404\u6a5f\u80fd\u306f\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u30e2\u30b8\u30e5\u30fc\u30eb\u5316\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4ed6\u306e\u90e8\u5206\u304b\u3089\u7c21\u5358\u306b\u5229\u7528\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-4\">Go\u3067\u306eRedis\u57fa\u672c\u64cd\u4f5c\u30de\u30b9\u30bf\u30fc\u30ac\u30a4\u30c9<\/h2>\n\n\n\n<p>Redis\u306e\u57fa\u672c\u7684\u306a\u30c7\u30fc\u30bf\u64cd\u4f5c\u306b\u3064\u3044\u3066\u3001\u5b9f\u8df5\u7684\u306a\u30b3\u30fc\u30c9\u4f8b\u3068\u3068\u3082\u306b\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u6587\u5b57\u5217\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u66f8\u304d\u64cd\u4f5c<\/h3>\n\n\n\n<p>\u6587\u5b57\u5217\u306f\u6700\u3082\u57fa\u672c\u7684\u306aRedis\u306e\u30c7\u30fc\u30bf\u578b\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u57fa\u672c\u7684\u306a\u64cd\u4f5c\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"github.com\/redis\/go-redis\/v9\"\n    \"time\"\n)\n\nfunc main() {\n    ctx := context.Background()\n    rdb := redis.NewClient(&amp;redis.Options{\n        Addr: \"localhost:6379\",\n    })\n\n    \/\/ \u6587\u5b57\u5217\u306e\u8a2d\u5b9a\n    err := rdb.Set(ctx, \"user:name\", \"John Doe\", 0).Err()\n    if err != nil {\n        panic(err)\n    }\n\n    \/\/ \u6587\u5b57\u5217\u306e\u53d6\u5f97\n    val, err := rdb.Get(ctx, \"user:name\").Result()\n    if err != nil {\n        panic(err)\n    }\n    fmt.Println(\"user:name\", val)\n\n    \/\/ \u6709\u52b9\u671f\u9650\u4ed8\u304d\u3067\u8a2d\u5b9a\n    err = rdb.Set(ctx, \"temporary:key\", \"\u4e00\u6642\u7684\u306a\u5024\", time.Hour).Err()\n    if err != nil {\n        panic(err)\n    }\n\n    \/\/ \u5b58\u5728\u78ba\u8a8d\n    exists, err := rdb.Exists(ctx, \"user:name\").Result()\n    if err != nil {\n        panic(err)\n    }\n    fmt.Printf(\"Key exists: %v\\n\", exists == 1)\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">Hash\u3084List\u306a\u3069\u5404\u30c7\u30fc\u30bf\u578b\u306e\u52b9\u679c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p>Redis\u306e\u5f37\u529b\u306a\u6a5f\u80fd\u306e\u4e00\u3064\u306f\u3001\u69d8\u3005\u306a\u30c7\u30fc\u30bf\u578b\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u308b\u3053\u3068\u3067\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-7\">Hash\u306e\u64cd\u4f5c\u4f8b\uff1a<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">func handleHash(ctx context.Context, rdb *redis.Client) {\n    \/\/ \u30e6\u30fc\u30b6\u30fc\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u3092\u30cf\u30c3\u30b7\u30e5\u3068\u3057\u3066\u4fdd\u5b58\n    err := rdb.HSet(ctx, \"user:1\", map[string]interface{}{\n        \"name\":  \"\u7530\u4e2d\u592a\u90ce\",\n        \"email\": \"tanaka@example.com\",\n        \"age\":   \"30\",\n    }).Err()\n    if err != nil {\n        panic(err)\n    }\n\n    \/\/ \u7279\u5b9a\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u53d6\u5f97\n    name, err := rdb.HGet(ctx, \"user:1\", \"name\").Result()\n    if err != nil {\n        panic(err)\n    }\n\n    \/\/ \u5168\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u53d6\u5f97\n    all, err := rdb.HGetAll(ctx, \"user:1\").Result()\n    if err != nil {\n        panic(err)\n    }\n    fmt.Printf(\"User profile: %v\\n\", all)\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-8\">List\u306e\u64cd\u4f5c\u4f8b\uff1a<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">func handleList(ctx context.Context, rdb *redis.Client) {\n    \/\/ \u30ea\u30b9\u30c8\u3078\u306e\u8ffd\u52a0\uff08\u672b\u5c3e\uff09\n    err := rdb.RPush(ctx, \"recent:logs\", \"\u30ed\u30b0\u30a4\u30f3\u64cd\u4f5c\", \"\u30c7\u30fc\u30bf\u66f4\u65b0\", \"\u30ed\u30b0\u30a2\u30a6\u30c8\").Err()\n    if err != nil {\n        panic(err)\n    }\n\n    \/\/ \u30ea\u30b9\u30c8\u306e\u5148\u982d\u306b\u8ffd\u52a0\n    err = rdb.LPush(ctx, \"recent:logs\", \"\u30b7\u30b9\u30c6\u30e0\u8d77\u52d5\").Err()\n    if err != nil {\n        panic(err)\n    }\n\n    \/\/ \u7bc4\u56f2\u3092\u6307\u5b9a\u3057\u3066\u53d6\u5f97\n    logs, err := rdb.LRange(ctx, \"recent:logs\", 0, -1).Result()\n    if err != nil {\n        panic(err)\n    }\n    fmt.Printf(\"Logs: %v\\n\", logs)\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u6709\u52b9\u671f\u9650\uff08TTL\uff09\u306e\u8a2d\u5b9a\u3068\u30ad\u30fc\u7ba1\u7406<\/h3>\n\n\n\n<p>\u30ad\u30fc\u306e\u6709\u52b9\u671f\u9650\u7ba1\u7406\u306f\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u30b7\u30b9\u30c6\u30e0\u3084\u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406\u3067\u91cd\u8981\u3067\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">func handleExpiration(ctx context.Context, rdb *redis.Client) {\n    \/\/ \u30bb\u30c3\u30b7\u30e7\u30f3\u30c7\u30fc\u30bf\u306e\u4fdd\u5b58\uff081\u6642\u9593\u306e\u6709\u52b9\u671f\u9650\u4ed8\u304d\uff09\n    err := rdb.Set(ctx, \"session:123\", \"\u30bb\u30c3\u30b7\u30e7\u30f3\u30c7\u30fc\u30bf\", time.Hour).Err()\n    if err != nil {\n        panic(err)\n    }\n\n    \/\/ \u6709\u52b9\u671f\u9650\u306e\u78ba\u8a8d\n    ttl, err := rdb.TTL(ctx, \"session:123\").Result()\n    if err != nil {\n        panic(err)\n    }\n    fmt.Printf(\"\u6b8b\u308a\u6709\u52b9\u671f\u9650: %v\\n\", ttl)\n\n    \/\/ \u6709\u52b9\u671f\u9650\u306e\u66f4\u65b0\n    err = rdb.Expire(ctx, \"session:123\", 2*time.Hour).Err()\n    if err != nil {\n        panic(err)\n    }\n\n    \/\/ \u30ad\u30fc\u306e\u30d1\u30bf\u30fc\u30f3\u691c\u7d22\n    keys, err := rdb.Keys(ctx, \"session:*\").Result()\n    if err != nil {\n        panic(err)\n    }\n    fmt.Printf(\"\u30bb\u30c3\u30b7\u30e7\u30f3\u30ad\u30fc\u4e00\u89a7: %v\\n\", keys)\n\n    \/\/ \u6ce8\u610f: Keys\u30b3\u30de\u30f3\u30c9\u306f\u672c\u756a\u74b0\u5883\u3067\u306f\u4f7f\u7528\u3092\u907f\u3051\u3001\n    \/\/ \u4ee3\u308f\u308a\u306bSCAN\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3092\u63a8\u5968\n    var cursor uint64\n    var totalKeys []string\n    for {\n        var keys []string\n        cursor, keys, err = rdb.Scan(ctx, cursor, \"session:*\", 10).Result()\n        if err != nil {\n            panic(err)\n        }\n        totalKeys = append(totalKeys, keys...)\n        if cursor == 0 {\n            break\n        }\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u3001Redis\u306e\u57fa\u672c\u7684\u306a\u30c7\u30fc\u30bf\u578b\u3068\u64cd\u4f5c\u3092\u7406\u89e3\u3059\u308b\u3053\u3068\u3067\u3001\u69d8\u3005\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u306b\u5bfe\u5fdc\u3067\u304d\u308b\u67d4\u8edf\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u57fa\u672c\u64cd\u4f5c\u3092\u6d3b\u7528\u3057\u305f\u5b9f\u8df5\u7684\u306a\u30d1\u30bf\u30fc\u30f3\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-10\">\u5b9f\u8df5\u7684\u306aRedis\u30d1\u30bf\u30fc\u30f3\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<p>\u5b9f\u969b\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u3067\u4f7f\u7528\u3055\u308c\u308b\u4e00\u822c\u7684\u306aRedis\u30d1\u30bf\u30fc\u30f3\u3068\u3001\u305d\u306e\u5b9f\u88c5\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u30ad\u30e3\u30c3\u30b7\u30e5\u5c64\u3068\u3057\u3066\u306e\u52b9\u7387\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30ad\u30e3\u30c3\u30b7\u30e5\u306f\u6700\u3082\u4e00\u822c\u7684\u306aRedis\u306e\u4f7f\u7528\u30d1\u30bf\u30fc\u30f3\u306e\u4e00\u3064\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u52b9\u7387\u7684\u306a\u30ad\u30e3\u30c3\u30b7\u30e5\u5b9f\u88c5\u306e\u4f8b\u3092\u793a\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">type CacheService struct {\n    rdb *redis.Client\n    ctx context.Context\n}\n\n\/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u304b\u3089\u53d6\u5f97\u3001\u306a\u3051\u308c\u3070DB\u304b\u3089\u53d6\u5f97\u3057\u3066\u30ad\u30e3\u30c3\u30b7\u30e5\u306b\u4fdd\u5b58\nfunc (cs *CacheService) GetUserWithCache(userID string) (*User, error) {\n    \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u304b\u3089\u306e\u53d6\u5f97\u3092\u8a66\u307f\u308b\n    cacheKey := fmt.Sprintf(\"user:%s\", userID)\n    userData, err := cs.rdb.Get(cs.ctx, cacheKey).Result()\n\n    if err == nil {\n        \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u30d2\u30c3\u30c8\n        var user User\n        err = json.Unmarshal([]byte(userData), &amp;user)\n        return &amp;user, err\n    }\n\n    if err != redis.Nil {\n        \/\/ \u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\n        return nil, err\n    }\n\n    \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u30df\u30b9\uff1aDB\u304b\u3089\u53d6\u5f97\n    user, err := cs.getUserFromDB(userID)\n    if err != nil {\n        return nil, err\n    }\n\n    \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u306b\u4fdd\u5b58\uff081\u6642\u9593\u306e\u6709\u52b9\u671f\u9650\uff09\n    userData, err = json.Marshal(user)\n    if err != nil {\n        return nil, err\n    }\n\n    err = cs.rdb.Set(cs.ctx, cacheKey, userData, time.Hour).Err()\n    if err != nil {\n        \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u4fdd\u5b58\u30a8\u30e9\u30fc\u306f\u30ed\u30b0\u306b\u8a18\u9332\u3059\u308b\u304c\u3001\u30e6\u30fc\u30b6\u30fc\u30c7\u30fc\u30bf\u306f\u8fd4\u3059\n        log.Printf(\"Failed to cache user data: %v\", err)\n    }\n\n    return user, nil\n}\n\n\/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u66f4\u65b0\uff08Write-Through \u30d1\u30bf\u30fc\u30f3\uff09\nfunc (cs *CacheService) UpdateUserWithCache(user *User) error {\n    \/\/ \u307e\u305aDB\u3092\u66f4\u65b0\n    err := cs.updateUserInDB(user)\n    if err != nil {\n        return err\n    }\n\n    \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u66f4\u65b0\n    userData, err := json.Marshal(user)\n    if err != nil {\n        return err\n    }\n\n    cacheKey := fmt.Sprintf(\"user:%s\", user.ID)\n    return cs.rdb.Set(cs.ctx, cacheKey, userData, time.Hour).Err()\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-12\">\u5206\u6563\u30ed\u30c3\u30af\u6a5f\u80fd\u306e\u5b9f\u88c5\u624b\u9806<\/h3>\n\n\n\n<p>\u5206\u6563\u30b7\u30b9\u30c6\u30e0\u3067\u306e\u540c\u671f\u51e6\u7406\u306b\u4f7f\u7528\u3059\u308b\u5206\u6563\u30ed\u30c3\u30af\u306e\u5b9f\u88c5\u4f8b\u3067\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">type DistributedLock struct {\n    rdb    *redis.Client\n    ctx    context.Context\n    key    string\n    value  string\n    expiry time.Duration\n}\n\nfunc NewDistributedLock(rdb *redis.Client, key string) *DistributedLock {\n    return &amp;DistributedLock{\n        rdb:    rdb,\n        ctx:    context.Background(),\n        key:    fmt.Sprintf(\"lock:%s\", key),\n        value:  uuid.New().String(),\n        expiry: 30 * time.Second,\n    }\n}\n\n\/\/ \u30ed\u30c3\u30af\u306e\u53d6\u5f97\nfunc (dl *DistributedLock) Acquire() (bool, error) {\n    return dl.rdb.SetNX(dl.ctx, dl.key, dl.value, dl.expiry).Result()\n}\n\n\/\/ \u30ed\u30c3\u30af\u306e\u89e3\u653e\uff08\u81ea\u5206\u304c\u53d6\u5f97\u3057\u305f\u30ed\u30c3\u30af\u306e\u307f\u89e3\u653e\u53ef\u80fd\uff09\nfunc (dl *DistributedLock) Release() error {\n    \/\/ Lua\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3001\u30a2\u30c8\u30df\u30c3\u30af\u306b\u78ba\u8a8d\u3068\u524a\u9664\u3092\u884c\u3046\n    script := `\n        if redis.call(\"get\", KEYS[1]) == ARGV[1] then\n            return redis.call(\"del\", KEYS[1])\n        else\n            return 0\n        end\n    `\n\n    result, err := dl.rdb.Eval(dl.ctx, script, []string{dl.key}, dl.value).Result()\n    if err != nil {\n        return err\n    }\n\n    if result.(int64) == 0 {\n        return fmt.Errorf(\"lock not owned\")\n    }\n\n    return nil\n}\n\n\/\/ \u4f7f\u7528\u4f8b\nfunc ExampleDistributedLock() {\n    rdb := redis.NewClient(&amp;redis.Options{\n        Addr: \"localhost:6379\",\n    })\n\n    lock := NewDistributedLock(rdb, \"critical-section\")\n\n    acquired, err := lock.Acquire()\n    if err != nil {\n        panic(err)\n    }\n\n    if acquired {\n        defer lock.Release()\n        \/\/ \u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u306e\u51e6\u7406\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u30d1\u30d6\u30ea\u30c3\u30b7\u30e5\/\u30b5\u30d6\u30b9\u30af\u30e9\u30a4\u30d6\u30d1\u30bf\u30fc\u30f3\u306e\u6d3b\u7528<\/h3>\n\n\n\n<p>\u30a4\u30d9\u30f3\u30c8\u99c6\u52d5\u578b\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u3067\u3088\u304f\u4f7f\u7528\u3055\u308c\u308bPub\/Sub\u30d1\u30bf\u30fc\u30f3\u306e\u5b9f\u88c5\u4f8b\u3067\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">type PubSubService struct {\n    rdb *redis.Client\n    ctx context.Context\n}\n\n\/\/ \u30d1\u30d6\u30ea\u30c3\u30b7\u30e3\u30fc\u306e\u5b9f\u88c5\nfunc (ps *PubSubService) PublishEvent(channel string, event interface{}) error {\n    eventData, err := json.Marshal(event)\n    if err != nil {\n        return err\n    }\n\n    return ps.rdb.Publish(ps.ctx, channel, eventData).Err()\n}\n\n\/\/ \u30b5\u30d6\u30b9\u30af\u30e9\u30a4\u30d0\u30fc\u306e\u5b9f\u88c5\nfunc (ps *PubSubService) SubscribeToEvents(channel string, handler func([]byte) error) error {\n    pubsub := ps.rdb.Subscribe(ps.ctx, channel)\n    defer pubsub.Close()\n\n    \/\/ \u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\u78ba\u8a8d\n    _, err := pubsub.Receive(ps.ctx)\n    if err != nil {\n        return err\n    }\n\n    ch := pubsub.Channel()\n    for msg := range ch {\n        if err := handler([]byte(msg.Payload)); err != nil {\n            log.Printf(\"Error handling message: %v\", err)\n        }\n    }\n\n    return nil\n}\n\n\/\/ \u4f7f\u7528\u4f8b\nfunc ExamplePubSub() {\n    rdb := redis.NewClient(&amp;redis.Options{\n        Addr: \"localhost:6379\",\n    })\n\n    pubSubService := &amp;PubSubService{\n        rdb: rdb,\n        ctx: context.Background(),\n    }\n\n    \/\/ \u30b5\u30d6\u30b9\u30af\u30e9\u30a4\u30d0\u30fc\u306e\u8d77\u52d5\uff08\u5225\u306e\u30b4\u30eb\u30fc\u30c1\u30f3\u3067\uff09\n    go func() {\n        err := pubSubService.SubscribeToEvents(\"user-events\", func(data []byte) error {\n            var event UserEvent\n            if err := json.Unmarshal(data, &amp;event); err != nil {\n                return err\n            }\n            fmt.Printf(\"Received event: %+v\\n\", event)\n            return nil\n        })\n        if err != nil {\n            log.Printf(\"Subscription error: %v\", err)\n        }\n    }()\n\n    \/\/ \u30a4\u30d9\u30f3\u30c8\u306e\u30d1\u30d6\u30ea\u30c3\u30b7\u30e5\n    event := UserEvent{\n        Type: \"user_created\",\n        UserID: \"123\",\n        Timestamp: time.Now(),\n    }\n\n    err := pubSubService.PublishEvent(\"user-events\", event)\n    if err != nil {\n        log.Printf(\"Failed to publish event: %v\", err)\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d1\u30bf\u30fc\u30f3\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u30b9\u30b1\u30fc\u30e9\u30d6\u30eb\u3067\u4fe1\u983c\u6027\u306e\u9ad8\u3044\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u5b9f\u88c5\u3092\u3055\u3089\u306b\u6700\u9069\u5316\u3059\u308b\u305f\u3081\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-14\">Redis\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<p>Redis\u306e\u6027\u80fd\u3092\u6700\u5927\u9650\u306b\u5f15\u304d\u51fa\u3059\u305f\u3081\u306e\u6700\u9069\u5316\u624b\u6cd5\u306b\u3064\u3044\u3066\u3001\u5b9f\u88c5\u4f8b\u3068\u3068\u3082\u306b\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30eb\u306e\u9069\u5207\u306a\u8a2d\u5b9a\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30eb\u306e\u9069\u5207\u306a\u8a2d\u5b9a\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306b\u5927\u304d\u306a\u5f71\u97ff\u3092\u4e0e\u3048\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">type PoolConfig struct {\n    PoolSize     int\n    MinIdleConns int\n    MaxRetries   int\n    DialTimeout  time.Duration\n    ReadTimeout  time.Duration\n    WriteTimeout time.Duration\n    PoolTimeout  time.Duration\n    IdleTimeout  time.Duration\n}\n\nfunc NewOptimizedRedisClient(cfg *PoolConfig) *redis.Client {\n    return redis.NewClient(&amp;redis.Options{\n        Addr:         \"localhost:6379\",\n        PoolSize:     cfg.PoolSize,     \/\/ \u540c\u6642\u63a5\u7d9a\u6570\u306e\u6700\u5927\u5024\n        MinIdleConns: cfg.MinIdleConns, \/\/ \u30d7\u30fc\u30eb\u5185\u306e\u6700\u5c0f\u30a2\u30a4\u30c9\u30eb\u63a5\u7d9a\u6570\n        MaxRetries:   cfg.MaxRetries,   \/\/ \u518d\u8a66\u884c\u56de\u6570\n\n        \/\/ \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u8a2d\u5b9a\n        DialTimeout:  cfg.DialTimeout,\n        ReadTimeout:  cfg.ReadTimeout,\n        WriteTimeout: cfg.WriteTimeout,\n        PoolTimeout:  cfg.PoolTimeout,\n        IdleTimeout:  cfg.IdleTimeout,\n    })\n}\n\n\/\/ \u4f7f\u7528\u4f8b\u3068\u8ca0\u8377\u30c6\u30b9\u30c8\nfunc ExamplePoolConfiguration() {\n    cfg := &amp;PoolConfig{\n        PoolSize:     100,              \/\/ \u540c\u6642\u30ea\u30af\u30a8\u30b9\u30c8\u6570\u306b\u5fdc\u3058\u3066\u8abf\u6574\n        MinIdleConns: 10,\n        MaxRetries:   3,\n        DialTimeout:  5 * time.Second,\n        ReadTimeout:  3 * time.Second,\n        WriteTimeout: 3 * time.Second,\n        PoolTimeout:  4 * time.Second,\n        IdleTimeout:  300 * time.Second,\n    }\n\n    rdb := NewOptimizedRedisClient(cfg)\n\n    \/\/ \u30d7\u30fc\u30eb\u7d71\u8a08\u60c5\u5831\u306e\u53d6\u5f97\n    stats := rdb.PoolStats()\n    fmt.Printf(\"Total Connections: %d\\n\", stats.TotalConns)\n    fmt.Printf(\"Idle Connections: %d\\n\", stats.IdleConns)\n    fmt.Printf(\"Stale Connections: %d\\n\", stats.StaleConns)\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u3092\u4f7f\u7528\u3057\u305f\u51e6\u7406\u306e\u9ad8\u901f\u5316<\/h3>\n\n\n\n<p>\u8907\u6570\u306e\u30b3\u30de\u30f3\u30c9\u3092\u4e00\u62ec\u3067\u5b9f\u884c\u3059\u308b\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u30e9\u30a6\u30f3\u30c9\u30c8\u30ea\u30c3\u30d7\u3092\u524a\u6e1b\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">type BatchProcessor struct {\n    rdb *redis.Client\n    ctx context.Context\n}\n\nfunc (bp *BatchProcessor) ProcessBatch(keys []string) error {\n    \/\/ \u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306e\u4f5c\u6210\n    pipe := bp.rdb.Pipeline()\n\n    \/\/ \u30b3\u30de\u30f3\u30c9\u306e\u4e00\u62ec\u767b\u9332\n    for _, key := range keys {\n        pipe.Get(bp.ctx, key)\n    }\n\n    \/\/ \u4e00\u62ec\u5b9f\u884c\n    cmds, err := pipe.Exec(bp.ctx)\n    if err != nil {\n        return err\n    }\n\n    \/\/ \u7d50\u679c\u306e\u51e6\u7406\n    for i, cmd := range cmds {\n        val, err := cmd.(*redis.StringCmd).Result()\n        if err != nil &amp;&amp; err != redis.Nil {\n            fmt.Printf(\"Error processing key %s: %v\\n\", keys[i], err)\n            continue\n        }\n        \/\/ \u7d50\u679c\u306e\u51e6\u7406\n        fmt.Printf(\"Key: %s, Value: %s\\n\", keys[i], val)\n    }\n\n    return nil\n}\n\n\/\/ TxPipeline\u3092\u4f7f\u7528\u3057\u305f\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u51e6\u7406\u306e\u4f8b\nfunc (bp *BatchProcessor) ProcessBatchWithTransaction(keys []string) error {\n    \/\/ \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306e\u4f5c\u6210\n    pipe := bp.rdb.TxPipeline()\n\n    \/\/ \u30b3\u30de\u30f3\u30c9\u306e\u4e00\u62ec\u767b\u9332\n    for _, key := range keys {\n        pipe.Get(bp.ctx, key)\n    }\n\n    \/\/ \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5b9f\u884c\n    cmds, err := pipe.Exec(bp.ctx)\n    if err != nil {\n        return err\n    }\n\n    \/\/ \u7d50\u679c\u306e\u51e6\u7406\n    for i, cmd := range cmds {\n        val, err := cmd.(*redis.StringCmd).Result()\n        if err != nil &amp;&amp; err != redis.Nil {\n            fmt.Printf(\"Error processing key %s: %v\\n\", keys[i], err)\n            continue\n        }\n        fmt.Printf(\"Key: %s, Value: %s\\n\", keys[i], val)\n    }\n\n    return nil\n}\n\n\/\/ \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u8a08\u6e2c\u7528\u306e\u30d9\u30f3\u30c1\u30de\u30fc\u30af\nfunc BenchmarkBatchProcessing(b *testing.B) {\n    rdb := redis.NewClient(&amp;redis.Options{\n        Addr: \"localhost:6379\",\n    })\n\n    bp := &amp;BatchProcessor{\n        rdb: rdb,\n        ctx: context.Background(),\n    }\n\n    keys := make([]string, 1000)\n    for i := range keys {\n        keys[i] = fmt.Sprintf(\"key:%d\", i)\n    }\n\n    b.Run(\"Without Pipeline\", func(b *testing.B) {\n        for i := 0; i &lt; b.N; i++ {\n            for _, key := range keys {\n                rdb.Get(context.Background(), key)\n            }\n        }\n    })\n\n    b.Run(\"With Pipeline\", func(b *testing.B) {\n        for i := 0; i &lt; b.N; i++ {\n            bp.ProcessBatch(keys)\n        }\n    })\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996\u3068\u6700\u9069\u5316\u6226\u7565<\/h3>\n\n\n\n<p>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u76e3\u8996\u3057\u3001\u6700\u9069\u5316\u3059\u308b\u305f\u3081\u306e\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u95a2\u6570\u7fa4\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">type MemoryStats struct {\n    UsedMemory     int64\n    PeakMemory     int64\n    FragmentRatio  float64\n    EvictedKeys    int64\n    ExpiredKeys    int64\n}\n\ntype MemoryMonitor struct {\n    rdb *redis.Client\n    ctx context.Context\n}\n\nfunc NewMemoryMonitor(rdb *redis.Client) *MemoryMonitor {\n    return &amp;MemoryMonitor{\n        rdb: rdb,\n        ctx: context.Background(),\n    }\n}\n\n\/\/ \u30e1\u30e2\u30ea\u7d71\u8a08\u60c5\u5831\u306e\u53d6\u5f97\nfunc (mm *MemoryMonitor) GetMemoryStats() (*MemoryStats, error) {\n    info, err := mm.rdb.Info(mm.ctx, \"memory\").Result()\n    if err != nil {\n        return nil, err\n    }\n\n    \/\/ INFO \u30b3\u30de\u30f3\u30c9\u306e\u7d50\u679c\u3092\u30d1\u30fc\u30b9\n    stats := &amp;MemoryStats{}\n    lines := strings.Split(info, \"\\r\\n\")\n    for _, line := range lines {\n        if strings.HasPrefix(line, \"used_memory:\") {\n            stats.UsedMemory, _ = strconv.ParseInt(strings.Split(line, \":\")[1], 10, 64)\n        }\n        if strings.HasPrefix(line, \"used_memory_peak:\") {\n            stats.PeakMemory, _ = strconv.ParseInt(strings.Split(line, \":\")[1], 10, 64)\n        }\n    }\n\n    return stats, nil\n}\n\n\/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u5b9a\u671f\u76e3\u8996\nfunc (mm *MemoryMonitor) StartMonitoring(interval time.Duration, threshold int64) {\n    ticker := time.NewTicker(interval)\n    go func() {\n        for range ticker.C {\n            stats, err := mm.GetMemoryStats()\n            if err != nil {\n                log.Printf(\"Error getting memory stats: %v\", err)\n                continue\n            }\n\n            \/\/ \u3057\u304d\u3044\u5024\u30c1\u30a7\u30c3\u30af\n            if stats.UsedMemory &gt; threshold {\n                log.Printf(\"WARNING: Memory usage exceeds threshold: %d bytes\", stats.UsedMemory)\n                \/\/ \u30a2\u30e9\u30fc\u30c8\u9001\u4fe1\u3084\u30e1\u30c8\u30ea\u30af\u30b9\u8a18\u9332\u306a\u3069\u306e\u51e6\u7406\u3092\u8ffd\u52a0\n            }\n        }\n    }()\n}\n\n\/\/ \u30ad\u30fc\u306e\u6709\u52b9\u671f\u9650\u8a2d\u5b9a\u306b\u3088\u308b\u81ea\u52d5\u30e1\u30e2\u30ea\u89e3\u653e\nfunc (mm *MemoryMonitor) SetExpirationForPattern(pattern string, ttl time.Duration) error {\n    var cursor uint64\n    for {\n        var keys []string\n        var err error\n        cursor, keys, err = mm.rdb.Scan(mm.ctx, cursor, pattern, 100).Result()\n        if err != nil {\n            return err\n        }\n\n        \/\/ \u30d0\u30c3\u30c1\u3067\u6709\u52b9\u671f\u9650\u3092\u8a2d\u5b9a\n        pipe := mm.rdb.Pipeline()\n        for _, key := range keys {\n            pipe.Expire(mm.ctx, key, ttl)\n        }\n        _, err = pipe.Exec(mm.ctx)\n        if err != nil {\n            return err\n        }\n\n        if cursor == 0 {\n            break\n        }\n    }\n    return nil\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001Redis\u306e\u6027\u80fd\u3092\u6700\u5927\u9650\u306b\u5f15\u304d\u51fa\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u3092\u542b\u3081\u305f\u672c\u756a\u74b0\u5883\u3067\u306e\u904b\u7528\u30ce\u30a6\u30cf\u30a6\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-18\">\u672c\u756a\u74b0\u5883\u3067\u306e\u904b\u7528\u30ce\u30a6\u30cf\u30a6<\/h2>\n\n\n\n<p>\u672c\u756a\u74b0\u5883\u3067Redis\u3092\u5b89\u5168\u304b\u3064\u52b9\u7387\u7684\u306b\u904b\u7528\u3059\u308b\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306b\u3064\u3044\u3066\u3001\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u4f8b\u3068\u3068\u3082\u306b\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u5197\u9577\u5316\u69cb\u6210\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u9ad8\u53ef\u7528\u6027\u3092\u78ba\u4fdd\u3059\u308b\u305f\u3081\u306eRedis\u30bb\u30f3\u30c8inel\u69cb\u6210\u306e\u5b9f\u88c5\u4f8b\u3092\u793a\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">type SentinelClient struct {\n    rdb    *redis.Client\n    ctx    context.Context\n    config *SentinelConfig\n}\n\ntype SentinelConfig struct {\n    MasterName     string\n    SentinelAddrs  []string\n    Password       string\n    DB             int\n    PoolSize       int\n    RouteByLatency bool\n    RouteRandomly  bool\n}\n\nfunc NewSentinelClient(config *SentinelConfig) (*SentinelClient, error) {\n    \/\/ Sentinel\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u8a2d\u5b9a\n    rdb := redis.NewFailoverClient(&amp;redis.FailoverOptions{\n        MasterName:     config.MasterName,\n        SentinelAddrs:  config.SentinelAddrs,\n        Password:       config.Password,\n        DB:             config.DB,\n        PoolSize:       config.PoolSize,\n        RouteByLatency: config.RouteByLatency,\n        RouteRandomly:  config.RouteRandomly,\n\n        \/\/ \u8010\u969c\u5bb3\u6027\u306e\u305f\u3081\u306e\u8a2d\u5b9a\n        MaxRetries:      3,\n        MinRetryBackoff: time.Millisecond * 100,\n        MaxRetryBackoff: time.Second * 2,\n\n        \/\/ \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u8a2d\u5b9a\n        DialTimeout:  time.Second * 5,\n        ReadTimeout:  time.Second * 3,\n        WriteTimeout: time.Second * 3,\n    })\n\n    \/\/ \u63a5\u7d9a\u30c6\u30b9\u30c8\n    ctx := context.Background()\n    if err := rdb.Ping(ctx).Err(); err != nil {\n        return nil, fmt.Errorf(\"failed to connect to Redis: %v\", err)\n    }\n\n    return &amp;SentinelClient{\n        rdb:    rdb,\n        ctx:    ctx,\n        config: config,\n    }, nil\n}\n\n\/\/ \u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u306e\u5b9f\u88c5\nfunc (sc *SentinelClient) HealthCheck() (*HealthStatus, error) {\n    status := &amp;HealthStatus{\n        Time: time.Now(),\n    }\n\n    \/\/ Ping\u306b\u3088\u308b\u758e\u901a\u78ba\u8a8d\n    start := time.Now()\n    err := sc.rdb.Ping(sc.ctx).Err()\n    status.Latency = time.Since(start)\n\n    if err != nil {\n        status.Status = \"unhealthy\"\n        status.Error = err.Error()\n        return status, err\n    }\n\n    \/\/ INFO \u30b3\u30de\u30f3\u30c9\u306b\u3088\u308b\u8a73\u7d30\u60c5\u5831\u306e\u53d6\u5f97\n    info, err := sc.rdb.Info(sc.ctx, \"replication\").Result()\n    if err != nil {\n        status.Status = \"degraded\"\n        status.Error = fmt.Sprintf(\"failed to get replication info: %v\", err)\n        return status, err\n    }\n\n    \/\/ \u30ec\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u60c5\u5831\u306e\u89e3\u6790\n    status.Role = sc.parseRole(info)\n    status.Status = \"healthy\"\n\n    return status, nil\n}\n\n\/\/ \u30e1\u30c8\u30ea\u30af\u30b9\u53ce\u96c6\u306e\u5b9f\u88c5\nfunc (sc *SentinelClient) CollectMetrics() (*RedisMetrics, error) {\n    metrics := &amp;RedisMetrics{\n        Timestamp: time.Now(),\n    }\n\n    \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u53d6\u5f97\n    memory, err := sc.rdb.Info(sc.ctx, \"memory\").Result()\n    if err == nil {\n        metrics.MemoryStats = sc.parseMemoryStats(memory)\n    }\n\n    \/\/ \u30ad\u30fc\u7d71\u8a08\u306e\u53d6\u5f97\n    keyspace, err := sc.rdb.Info(sc.ctx, \"keyspace\").Result()\n    if err == nil {\n        metrics.KeyStats = sc.parseKeyspaceStats(keyspace)\n    }\n\n    \/\/ \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u63a5\u7d9a\u60c5\u5831\u306e\u53d6\u5f97\n    clients, err := sc.rdb.Info(sc.ctx, \"clients\").Result()\n    if err == nil {\n        metrics.ClientStats = sc.parseClientStats(clients)\n    }\n\n    return metrics, nil\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3068\u5fa9\u65e7\u6226\u7565<\/h3>\n\n\n\n<p>\u81ea\u52d5\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3068\u5fa9\u65e7\u624b\u9806\u306e\u5b9f\u88c5\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">type BackupManager struct {\n    rdb        *redis.Client\n    ctx        context.Context\n    backupDir  string\n    maxBackups int\n}\n\nfunc NewBackupManager(rdb *redis.Client, backupDir string, maxBackups int) *BackupManager {\n    return &amp;BackupManager{\n        rdb:        rdb,\n        ctx:        context.Background(),\n        backupDir:  backupDir,\n        maxBackups: maxBackups,\n    }\n}\n\n\/\/ \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u5b9f\u884c\nfunc (bm *BackupManager) CreateBackup() error {\n    \/\/ \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u30d5\u30a1\u30a4\u30eb\u540d\u306e\u751f\u6210\n    timestamp := time.Now().Format(\"20060102150405\")\n    filename := filepath.Join(bm.backupDir, fmt.Sprintf(\"redis_backup_%s.rdb\", timestamp))\n\n    \/\/ SAVE \u30b3\u30de\u30f3\u30c9\u306e\u5b9f\u884c\n    if err := bm.rdb.Save(bm.ctx).Err(); err != nil {\n        return fmt.Errorf(\"failed to create backup: %v\", err)\n    }\n\n    \/\/ \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u5727\u7e2e\n    if err := bm.compressBackup(filename); err != nil {\n        return fmt.Errorf(\"failed to compress backup: %v\", err)\n    }\n\n    \/\/ \u53e4\u3044\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u524a\u9664\n    if err := bm.cleanOldBackups(); err != nil {\n        log.Printf(\"Warning: failed to clean old backups: %v\", err)\n    }\n\n    return nil\n}\n\n\/\/ \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u8a2d\u5b9a\nfunc (bm *BackupManager) ScheduleBackups(interval time.Duration) {\n    ticker := time.NewTicker(interval)\n    go func() {\n        for range ticker.C {\n            if err := bm.CreateBackup(); err != nil {\n                log.Printf(\"Backup failed: %v\", err)\n            }\n        }\n    }()\n}\n\n\/\/ \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u5fa9\u5143\nfunc (bm *BackupManager) RestoreFromBackup(backupFile string) error {\n    \/\/ \u5fa9\u5143\u524d\u306e\u78ba\u8a8d\n    if err := bm.validateBackup(backupFile); err != nil {\n        return fmt.Errorf(\"backup validation failed: %v\", err)\n    }\n\n    \/\/ \u65e2\u5b58\u30c7\u30fc\u30bf\u306e\u30af\u30ea\u30a2\n    if err := bm.rdb.FlushAll(bm.ctx).Err(); err != nil {\n        return fmt.Errorf(\"failed to clear existing data: %v\", err)\n    }\n\n    \/\/ \u5fa9\u5143\u306e\u5b9f\u884c\n    if err := bm.restoreData(backupFile); err != nil {\n        return fmt.Errorf(\"failed to restore data: %v\", err)\n    }\n\n    return nil\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u3068\u76e3\u8996\u306e\u8a2d\u5b9a<\/h3>\n\n\n\n<p>\u5305\u62ec\u7684\u306a\u76e3\u8996\u30b7\u30b9\u30c6\u30e0\u306e\u5b9f\u88c5\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">type MonitoringService struct {\n    rdb      *redis.Client\n    ctx      context.Context\n    metrics  chan Metric\n    alerting AlertingConfig\n}\n\ntype Metric struct {\n    Name      string\n    Value     float64\n    Timestamp time.Time\n    Labels    map[string]string\n}\n\nfunc (ms *MonitoringService) StartMonitoring() {\n    go ms.collectBasicMetrics()\n    go ms.collectPerformanceMetrics()\n    go ms.monitorSlowLogs()\n    go ms.processMetrics()\n}\n\n\/\/ \u57fa\u672c\u30e1\u30c8\u30ea\u30af\u30b9\u306e\u53ce\u96c6\nfunc (ms *MonitoringService) collectBasicMetrics() {\n    ticker := time.NewTicker(time.Second * 30)\n    for range ticker.C {\n        info, err := ms.rdb.Info(ms.ctx, \"memory\", \"clients\", \"stats\").Result()\n        if err != nil {\n            log.Printf(\"Error collecting basic metrics: %v\", err)\n            continue\n        }\n\n        metrics := ms.parseRedisInfo(info)\n        for _, metric := range metrics {\n            ms.metrics &lt;- metric\n        }\n    }\n}\n\n\/\/ \u30b9\u30ed\u30fc\u30af\u30a8\u30ea\u306e\u76e3\u8996\nfunc (ms *MonitoringService) monitorSlowLogs() {\n    ticker := time.NewTicker(time.Minute)\n    for range ticker.C {\n        logs, err := ms.rdb.SlowLogGet(ms.ctx, 10).Result()\n        if err != nil {\n            log.Printf(\"Error getting slow logs: %v\", err)\n            continue\n        }\n\n        for _, entry := range logs {\n            if entry.Duration &gt; time.Millisecond*100 {\n                ms.alertSlowQuery(entry)\n            }\n        }\n    }\n}\n\n\/\/ \u30e1\u30c8\u30ea\u30af\u30b9\u306e\u51e6\u7406\u3068\u30a2\u30e9\u30fc\u30c8\nfunc (ms *MonitoringService) processMetrics() {\n    for metric := range ms.metrics {\n        \/\/ \u30e1\u30c8\u30ea\u30af\u30b9\u306e\u4fdd\u5b58\n        if err := ms.storeMetric(metric); err != nil {\n            log.Printf(\"Error storing metric: %v\", err)\n            continue\n        }\n\n        \/\/ \u30a2\u30e9\u30fc\u30c8\u30eb\u30fc\u30eb\u306e\u30c1\u30a7\u30c3\u30af\n        if ms.shouldAlert(metric) {\n            ms.sendAlert(metric)\n        }\n    }\n}\n\n\/\/ \u30a2\u30e9\u30fc\u30c8\u306e\u9001\u4fe1\nfunc (ms *MonitoringService) sendAlert(metric Metric) {\n    alert := Alert{\n        Title:       fmt.Sprintf(\"Redis Alert: %s threshold exceeded\", metric.Name),\n        Description: fmt.Sprintf(\"Current value: %v\", metric.Value),\n        Severity:    \"warning\",\n        Timestamp:   time.Now(),\n    }\n\n    if err := ms.alerting.Send(alert); err != nil {\n        log.Printf(\"Failed to send alert: %v\", err)\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u4f8b\u306f\u3001\u672c\u756a\u74b0\u5883\u3067\u306eRedis\u904b\u7528\u306b\u304a\u3051\u308b\u57fa\u672c\u7684\u306a\u8981\u4ef6\u3092\u30ab\u30d0\u30fc\u3057\u3066\u3044\u307e\u3059\u3002\u5b9f\u969b\u306e\u904b\u7528\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u70b9\u306b\u7279\u306b\u6ce8\u610f\u3092\u6255\u3046\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u76e3\u8996\u3068\u30a2\u30e9\u30fc\u30c8<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf<\/li>\n\n\n\n<li>\u30ec\u30a4\u30c6\u30f3\u30b7<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30ec\u30fc\u30c8<\/li>\n\n\n\n<li>\u63a5\u7d9a\u6570<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u6226\u7565<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b9a\u671f\u7684\u306a\u30d0\u30c3\u30af\u30a2\u30c3\u30d7<\/li>\n\n\n\n<li>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u81ea\u52d5\u5316<\/li>\n\n\n\n<li>\u5fa9\u65e7\u624b\u9806\u306e\u6587\u66f8\u5316<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8ca0\u8377\u76e3\u8996<\/li>\n\n\n\n<li>\u30ad\u30e3\u30d1\u30b7\u30c6\u30a3\u30d7\u30e9\u30f3\u30cb\u30f3\u30b0<\/li>\n\n\n\n<li>\u30b7\u30e3\u30fc\u30c7\u30a3\u30f3\u30b0\u6226\u7565<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30a2\u30af\u30bb\u30b9\u5236\u5fa1<\/li>\n\n\n\n<li>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u6697\u53f7\u5316<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u8981\u7d20\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u5b89\u5b9a\u3057\u305f\u672c\u756a\u74b0\u5883\u306eRedis\u904b\u7528\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":{"0":"post-3317","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3317","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3317"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3317\/revisions"}],"predecessor-version":[{"id":3318,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3317\/revisions\/3318"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}