{"id":3340,"date":"2025-03-24T08:46:25","date_gmt":"2025-03-23T23:46:25","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=3340"},"modified":"2025-03-24T08:46:55","modified_gmt":"2025-03-23T23:46:55","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91redis-with-python-%e5%ae%8c%e5%85%a8%e5%85%a5%e9%96%80%e3%82%ac%e3%82%a4%e3%83%89-10%e5%88%86%e3%81%a7%e3%82%8f%e3%81%8b%e3%82%8b%e3%82%ad%e3%83%a3","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=3340","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Redis with Python \u5b8c\u5168\u5165\u9580\u30ac\u30a4\u30c9 &#8211; 10\u5206\u3067\u308f\u304b\u308b\u30ad\u30e3\u30c3\u30b7\u30e5\u51e6\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5"},"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\">Redis\u3068\u306f\uff1fPython\u3067\u306e\u6d3b\u7528\u30b7\u30fc\u30f3\u3092\u5fb9\u5e95\u89e3\u8aac<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">\u9ad8\u901f\u306a\u30ad\u30e3\u30c3\u30b7\u30e5\u30b7\u30b9\u30c6\u30e0\u3068\u3057\u3066\u306eRedis<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-2\">Python\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067Redis\u304c\u9078\u3070\u308c\u308b\u7406\u7531<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-3\">Redis\u74b0\u5883\u69cb\u7bc9\u304b\u3089Python\u3067\u306e\u63a5\u7d9a\u307e\u3067<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-4\">Docker\u3067\u306eRedis\u74b0\u5883\u69cb\u7bc9\u624b\u9806<\/a>      <\/li>      <li>        <a href=\"#i-5\">redis-py\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u57fa\u672c\u8a2d\u5b9a<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-6\">\u63a5\u7d9a\u30c6\u30b9\u30c8\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-7\">Python\u3067\u5b9f\u88c5\u3059\u308bRedis\u306e\u57fa\u672c\u64cd\u4f5c<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-8\">\u6587\u5b57\u5217\u30c7\u30fc\u30bf\u306e\u66f8\u304d\u8fbc\u307f\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-9\">\u30ea\u30b9\u30c8\u3068\u30cf\u30c3\u30b7\u30e5\u306e\u64cd\u4f5c\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-10\">\u6709\u52b9\u671f\u9650\u4ed8\u304d\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-11\">\u5b9f\u8df5\u7684\u306aRedis\u6d3b\u7528\u30d1\u30bf\u30fc\u30f3<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-12\">API\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u5b9f\u88c5\u4f8b<\/a>      <\/li>      <li>        <a href=\"#i-13\">\u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406\u3067\u306e\u6d3b\u7528\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-14\">\u30b8\u30e7\u30d6\u30ad\u30e5\u30fc\u30b7\u30b9\u30c6\u30e0\u306e\u69cb\u7bc9\u624b\u9806<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-15\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u3068\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-16\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316\u624b\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-17\">\u30ad\u30e3\u30c3\u30b7\u30e5\u30d2\u30c3\u30c8\u7387\u306e\u5411\u4e0a\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-18\">\u904b\u7528\u76e3\u8996\u306e\u5b9f\u88c5\u30a2\u30d7\u30ed\u30fc\u30c1<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-19\">\u672c\u756a\u74b0\u5883\u3067\u306e\u904b\u7528\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-20\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u306e\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-21\">\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3068\u5fa9\u65e7\u624b\u9806\u306e\u89e3\u8aac<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-22\">\u30b9\u30b1\u30fc\u30eb\u30a2\u30c3\u30d7\u3068\u30b9\u30b1\u30fc\u30eb\u30a2\u30a6\u30c8\u306e\u6226\u7565<\/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\">Redis\u3068\u306f\uff1fPython\u3067\u306e\u6d3b\u7528\u30b7\u30fc\u30f3\u3092\u5fb9\u5e95\u89e3\u8aac<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">\u9ad8\u901f\u306a\u30ad\u30e3\u30c3\u30b7\u30e5\u30b7\u30b9\u30c6\u30e0\u3068\u3057\u3066\u306eRedis<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Redis\u306f\u3001\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u306e\u30a4\u30f3\u30e1\u30e2\u30ea\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2\u30fb\u30ad\u30e3\u30c3\u30b7\u30e5\u30b7\u30b9\u30c6\u30e0\u3067\u3059\u3002\u305d\u306e\u540d\u524d\u306f\u201dREmote DIctionary Server\u201d\u306e\u7565\u3067\u3001\u30e1\u30e2\u30ea\u4e0a\u3067\u30c7\u30fc\u30bf\u3092\u7ba1\u7406\u3059\u308b\u3053\u3068\u3067\u3001\u5f93\u6765\u306e\u30c7\u30a3\u30b9\u30af\u30d9\u30fc\u30b9\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068\u6bd4\u8f03\u3057\u3066\u5727\u5012\u7684\u306a\u9ad8\u901f\u6027\u3092\u5b9f\u73fe\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e3b\u306a\u7279\u5fb4\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30a4\u30f3\u30e1\u30e2\u30ea\u51e6\u7406\u306b\u3088\u308b\u8d85\u9ad8\u901f\u306a\u8aad\u307f\u66f8\u304d\uff08\u5e73\u5747\u30ec\u30a4\u30c6\u30f3\u30b71ms\u672a\u6e80\uff09<\/li>\n\n\n\n<li>\u591a\u69d8\u306a\u30c7\u30fc\u30bf\u69cb\u9020\uff08\u6587\u5b57\u5217\u3001\u30ea\u30b9\u30c8\u3001\u30cf\u30c3\u30b7\u30e5\u3001\u30bb\u30c3\u30c8\u306a\u3069\uff09\u306e\u30b5\u30dd\u30fc\u30c8<\/li>\n\n\n\n<li>\u6c38\u7d9a\u5316\u6a5f\u80fd\u306b\u3088\u308b\u30c7\u30fc\u30bf\u306e\u6c38\u7d9a\u6027\u78ba\u4fdd<\/li>\n\n\n\n<li>\u30a2\u30c8\u30df\u30c3\u30af\u64cd\u4f5c\u306e\u30b5\u30dd\u30fc\u30c8\u306b\u3088\u308b\u9ad8\u3044\u4fe1\u983c\u6027<\/li>\n\n\n\n<li>\u30b7\u30f3\u30d7\u30eb\u306a\u30d7\u30ed\u30c8\u30b3\u30eb\u306b\u3088\u308b\u5bb9\u6613\u306a\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">Python\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067Redis\u304c\u9078\u3070\u308c\u308b\u7406\u7531<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Python\u306e\u958b\u767a\u73fe\u5834\u3067Redis\u304c\u5e83\u304f\u63a1\u7528\u3055\u308c\u3066\u3044\u308b\u7406\u7531\u306f\u3001\u4ee5\u4e0b\u306e3\u3064\u306e\u4e3b\u8981\u306a\u30e1\u30ea\u30c3\u30c8\u306b\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b9f\u88c5\u306e\u5bb9\u6613\u3055<\/strong><\/li>\n<\/ol>\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=\"\"># redis-py\u3092\u4f7f\u7528\u3057\u305f\u5b9f\u88c5\u4f8b\nimport redis\n\n# Redis\u30b5\u30fc\u30d0\u30fc\u3078\u306e\u63a5\u7d9a\nredis_client = redis.Redis(host='localhost', port=6379, db=0)\n\n# \u30b7\u30f3\u30d7\u30eb\u306a\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u5b9f\u88c5\nredis_client.set('user:1', 'John Doe')\nuser_data = redis_client.get('user:1')  # b'John Doe'<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u8c4a\u5bcc\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406<\/li>\n\n\n\n<li>API\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u30ad\u30e3\u30c3\u30b7\u30e5<\/li>\n\n\n\n<li>\u30b8\u30e7\u30d6\u30ad\u30e5\u30fc<\/li>\n\n\n\n<li>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u30e9\u30f3\u30ad\u30f3\u30b0<\/li>\n\n\n\n<li>\u30ec\u30fc\u30c8\u5236\u9650<\/li>\n\n\n\n<li>\u5206\u6563\u30ed\u30c3\u30af<\/li>\n<\/ul>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u512a\u308c\u305f\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u7279\u6027<\/strong><\/li>\n<\/ol>\n\n\n<div id=\"id-b4dd5cd1-0849-419e-b0fd-4f89f9259fe4\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u64cd\u4f5c<\/th><th>\u5e73\u5747\u30ec\u30a4\u30c6\u30f3\u30b7<\/th><th>\u30b9\u30eb\u30fc\u30d7\u30c3\u30c8<\/th><\/tr><\/thead><tbody><tr><td>GET\/SET<\/td><td>&lt;1ms<\/td><td>100,000+ ops\/sec<\/td><\/tr><tr><td>List\u64cd\u4f5c<\/td><td>&lt;1ms<\/td><td>80,000+ ops\/sec<\/td><\/tr><tr><td>Hash\u64cd\u4f5c<\/td><td>&lt;1ms<\/td><td>90,000+ ops\/sec<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Python\u3067\u306e\u4e00\u822c\u7684\u306a\u6d3b\u7528\u30b7\u30fc\u30f3\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3078\u306e\u30a2\u30af\u30bb\u30b9\u524a\u6e1b<\/li>\n\n\n\n<li>\u983b\u7e41\u306b\u30a2\u30af\u30bb\u30b9\u3055\u308c\u308b\u30c7\u30fc\u30bf\u306e\u30ad\u30e3\u30c3\u30b7\u30e5<\/li>\n\n\n\n<li>\u30bb\u30c3\u30b7\u30e7\u30f3\u60c5\u5831\u306e\u7ba1\u7406<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5206\u6563\u30b7\u30b9\u30c6\u30e0\u3067\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u9593\u306e\u30c7\u30fc\u30bf\u5171\u6709<\/li>\n\n\n\n<li>\u5206\u6563\u30ad\u30e3\u30c3\u30b7\u30e5\u3068\u3057\u3066\u306e\u5229\u7528<\/li>\n\n\n\n<li>\u30a4\u30d9\u30f3\u30c8\u99c6\u52d5\u578b\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u30c7\u30fc\u30bf\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u5206\u6790<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u306e\u8ffd\u8de1<\/li>\n\n\n\n<li>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u7279\u5fb4\u306b\u3088\u308a\u3001Redis\u306fPython\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u304a\u3044\u3066\u3001\u5358\u306a\u308b\u30ad\u30e3\u30c3\u30b7\u30e5\u30b7\u30b9\u30c6\u30e0\u4ee5\u4e0a\u306e\u4fa1\u5024\u3092\u63d0\u4f9b\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u6027\u80fd\u3068\u6a5f\u80fd\u6027\u3092\u5927\u304d\u304f\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-3\">Redis\u74b0\u5883\u69cb\u7bc9\u304b\u3089Python\u3067\u306e\u63a5\u7d9a\u307e\u3067<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">Docker\u3067\u306eRedis\u74b0\u5883\u69cb\u7bc9\u624b\u9806<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Docker\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u7c21\u5358\u304b\u3064\u518d\u73fe\u6027\u306e\u9ad8\u3044Redis\u74b0\u5883\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u5177\u4f53\u7684\u306a\u624b\u9806\u3092\u793a\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>docker-compose.yml\u306e\u4f5c\u6210<\/strong><\/li>\n<\/ol>\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=\"\">version: '3.8'\nservices:\n  redis:\n    image: redis:latest\n    ports:\n      - \"6379:6379\"\n    volumes:\n      - redis_data:\/data\n    command: redis-server --appendonly yes\nvolumes:\n  redis_data:<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30c6\u30ca\u306e\u8d77\u52d5<\/strong><\/li>\n<\/ol>\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=\"\"># \u30b3\u30f3\u30c6\u30ca\u3092\u8d77\u52d5\ndocker-compose up -d\n\n# \u8d77\u52d5\u78ba\u8a8d\ndocker-compose ps<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">redis-py\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u57fa\u672c\u8a2d\u5b9a<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Python\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3001\u57fa\u672c\u7684\u306a\u63a5\u7d9a\u8a2d\u5b9a\u3092\u884c\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/strong><\/li>\n<\/ol>\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=\"\">pip install redis python-dotenv<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u63a5\u7d9a\u8a2d\u5b9a\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\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=\"\"># config.py\nimport os\nfrom dotenv import load_dotenv\n\n# \u74b0\u5883\u5909\u6570\u306e\u8aad\u307f\u8fbc\u307f\nload_dotenv()\n\nREDIS_CONFIG = {\n    'host': os.getenv('REDIS_HOST', 'localhost'),\n    'port': int(os.getenv('REDIS_PORT', 6379)),\n    'db': int(os.getenv('REDIS_DB', 0)),\n    'decode_responses': True  # \u30d0\u30a4\u30c8\u5217\u3092\u6587\u5b57\u5217\u3068\u3057\u3066\u53d6\u5f97\n}<\/pre>\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=\"\"># redis_client.py\nimport redis\nfrom config import REDIS_CONFIG\n\ndef get_redis_client():\n    \"\"\"Redis \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u53d6\u5f97\"\"\"\n    try:\n        client = redis.Redis(**REDIS_CONFIG)\n        return client\n    except redis.ConnectionError as e:\n        print(f\"Redis\u63a5\u7d9a\u30a8\u30e9\u30fc: {e}\")\n        raise<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">\u63a5\u7d9a\u30c6\u30b9\u30c8\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u63a5\u7d9a\u306e\u78ba\u8a8d\u3068\u4e00\u822c\u7684\u306a\u554f\u984c\u306e\u89e3\u6c7a\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u63a5\u7d9a\u30c6\u30b9\u30c8\u30b9\u30af\u30ea\u30d7\u30c8<\/strong><\/li>\n<\/ol>\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=\"\"># test_connection.py\nfrom redis_client import get_redis_client\n\ndef test_redis_connection():\n    \"\"\"Redis\u63a5\u7d9a\u30c6\u30b9\u30c8\"\"\"\n    client = get_redis_client()\n    try:\n        # PING\u30b3\u30de\u30f3\u30c9\u3067\u306e\u758e\u901a\u78ba\u8a8d\n        response = client.ping()\n        if response:\n            print(\"Redis\u63a5\u7d9a\u6210\u529f\uff01\")\n\n        # \u57fa\u672c\u7684\u306a\u8aad\u307f\u66f8\u304d\u30c6\u30b9\u30c8\n        client.set('test_key', 'Hello Redis!')\n        value = client.get('test_key')\n        print(f\"\u30c6\u30b9\u30c8\u5024\u306e\u53d6\u5f97: {value}\")\n\n    except Exception as e:\n        print(f\"\u30c6\u30b9\u30c8\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f: {e}\")\n    finally:\n        client.close()\n\nif __name__ == \"__main__\":\n    test_redis_connection()<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e00\u822c\u7684\u306a\u30c8\u30e9\u30d6\u30eb\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\uff1a<\/p>\n\n\n<div id=\"id-6c26f65e-492f-44a4-a997-87424f288c3e\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30a8\u30e9\u30fc<\/th><th>\u539f\u56e0<\/th><th>\u89e3\u6c7a\u65b9\u6cd5<\/th><\/tr><\/thead><tbody><tr><td>Connection refused<\/td><td>Redis\u30b5\u30fc\u30d0\u30fc\u304c\u8d77\u52d5\u3057\u3066\u3044\u306a\u3044<\/td><td><code>docker-compose ps<\/code>\u3067\u72b6\u614b\u78ba\u8a8d\u3001\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u518d\u8d77\u52d5<\/td><\/tr><tr><td>Authentication required<\/td><td>\u30d1\u30b9\u30ef\u30fc\u30c9\u8a8d\u8a3c\u304c\u5fc5\u8981<\/td><td>\u74b0\u5883\u5909\u6570<code>REDIS_PASSWORD<\/code>\u3092\u8a2d\u5b9a<\/td><\/tr><tr><td>Cannot assign requested address<\/td><td>\u30db\u30b9\u30c8\u540d\u306e\u89e3\u6c7a\u5931\u6557<\/td><td>hosts\u8a2d\u5b9a\u3084DNS\u306e\u78ba\u8a8d<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">\u30c7\u30d0\u30c3\u30b0\u306e\u305f\u3081\u306e\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u30c4\u30fc\u30eb\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=\"\"># Redis\u30b3\u30f3\u30c6\u30ca\u306e\u72b6\u614b\u78ba\u8a8d\ndocker logs redis\n\n# Redis\u30b3\u30f3\u30c6\u30ca\u5185\u3067\u306eCLI\u5b9f\u884c\ndocker exec -it redis redis-cli\n\n# \u30e1\u30e2\u30ea\u4f7f\u7528\u72b6\u6cc1\u306e\u78ba\u8a8d\ndocker exec -it redis redis-cli info memory<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u306e\u74b0\u5883\u69cb\u7bc9\u306b\u3088\u308a\u3001\u958b\u767a\u304b\u3089\u30c6\u30b9\u30c8\u3001\u672c\u756a\u74b0\u5883\u307e\u3067\u4e00\u8cab\u3057\u305fRedis\u64cd\u4f5c\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u306e\u74b0\u5883\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u969b\u306eRedis\u64cd\u4f5c\u3092\u5b66\u3093\u3067\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-7\">Python\u3067\u5b9f\u88c5\u3059\u308bRedis\u306e\u57fa\u672c\u64cd\u4f5c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">\u6587\u5b57\u5217\u30c7\u30fc\u30bf\u306e\u66f8\u304d\u8fbc\u307f\u65b9\u6cd5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Redis\u306e\u6700\u3082\u57fa\u672c\u7684\u306a\u30c7\u30fc\u30bf\u578b\u3067\u3042\u308b\u6587\u5b57\u5217\uff08String\uff09\u306e\u64cd\u4f5c\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002\u6587\u5b57\u5217\u578b\u306f\u3001\u30c6\u30ad\u30b9\u30c8\u30c7\u30fc\u30bf\u3060\u3051\u3067\u306a\u304f\u3001\u6570\u5024\u3084\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba\u3055\u308c\u305f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u4fdd\u5b58\u306b\u3082\u4f7f\u7528\u3067\u304d\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=\"\">import redis\nimport json\nfrom datetime import timedelta\n\n# Redis \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u521d\u671f\u5316\nredis_client = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)\n\n# \u57fa\u672c\u7684\u306a\u6587\u5b57\u5217\u306e\u8a2d\u5b9a\u3068\u53d6\u5f97\nredis_client.set('user:name', 'John Doe')\nname = redis_client.get('user:name')  # 'John Doe'\n\n# \u6709\u52b9\u671f\u9650\u4ed8\u304d\u3067\u30c7\u30fc\u30bf\u3092\u4fdd\u5b58\nredis_client.setex('session:token', timedelta(hours=1), 'abc123')\n\n# \u8907\u6570\u306e\u5024\u3092\u4e00\u5ea6\u306b\u8a2d\u5b9a\u30fb\u53d6\u5f97\nredis_client.mset({'key1': 'value1', 'key2': 'value2'})\nvalues = redis_client.mget(['key1', 'key2'])  # ['value1', 'value2']\n\n# JSON\u30c7\u30fc\u30bf\u306e\u4fdd\u5b58\u3068\u53d6\u5f97\nuser_data = {\n    'id': 1,\n    'name': 'John Doe',\n    'email': 'john@example.com'\n}\nredis_client.set('user:1:data', json.dumps(user_data))\nstored_user = json.loads(redis_client.get('user:1:data'))<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u30ea\u30b9\u30c8\u3068\u30cf\u30c3\u30b7\u30e5\u306e\u64cd\u4f5c\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Redis\u306e\u30ea\u30b9\u30c8\u3068\u30cf\u30c3\u30b7\u30e5\u306f\u3001\u3088\u308a\u8907\u96d1\u306a\u30c7\u30fc\u30bf\u69cb\u9020\u3092\u6271\u3046\u969b\u306b\u4fbf\u5229\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u4e3b\u8981\u306a\u64cd\u4f5c\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u30ea\u30b9\u30c8\u64cd\u4f5c\u306e\u4f8b\uff1a<\/strong><\/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=\"\"># \u30bf\u30b9\u30af\u30ad\u30e5\u30fc\u306e\u5b9f\u88c5\u4f8b\ndef add_task(task_data):\n    \"\"\"\u30bf\u30b9\u30af\u3092\u30ad\u30e5\u30fc\u306b\u8ffd\u52a0\"\"\"\n    redis_client.lpush('task:queue', json.dumps(task_data))\n\ndef process_task():\n    \"\"\"\u30bf\u30b9\u30af\u3092\u30ad\u30e5\u30fc\u304b\u3089\u53d6\u5f97\u3057\u3066\u51e6\u7406\"\"\"\n    # \u53f3\u7aef\u304b\u3089\u30dd\u30c3\u30d7\uff08FIFO\u65b9\u5f0f\uff09\n    task_data = redis_client.rpop('task:queue')\n    if task_data:\n        task = json.loads(task_data)\n        return task\n    return None\n\n# \u4f7f\u7528\u4f8b\nadd_task({'id': 1, 'type': 'email', 'recipient': 'user@example.com'})\nadd_task({'id': 2, 'type': 'notification', 'user_id': 123})\n\n# \u30bf\u30b9\u30af\u51e6\u7406\nwhile task := process_task():\n    print(f\"Processing task: {task}\")<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u30cf\u30c3\u30b7\u30e5\u64cd\u4f5c\u306e\u4f8b\uff1a<\/strong><\/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=\"\"># \u30e6\u30fc\u30b6\u30fc\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u306e\u7ba1\u7406\ndef update_user_profile(user_id, **profile_data):\n    \"\"\"\u30e6\u30fc\u30b6\u30fc\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u306e\u66f4\u65b0\"\"\"\n    key = f'user:{user_id}:profile'\n    redis_client.hmset(key, profile_data)\n\ndef get_user_profile(user_id):\n    \"\"\"\u30e6\u30fc\u30b6\u30fc\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u306e\u53d6\u5f97\"\"\"\n    key = f'user:{user_id}:profile'\n    return redis_client.hgetall(key)\n\n# \u4f7f\u7528\u4f8b\nupdate_user_profile(\n    123,\n    name='Jane Doe',\n    email='jane@example.com',\n    age='28',\n    location='Tokyo'\n)\n\nprofile = get_user_profile(123)\nprint(f\"User profile: {profile}\")<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u6709\u52b9\u671f\u9650\u4ed8\u304d\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6709\u52b9\u671f\u9650\u7ba1\u7406\u306f\u3001\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316\u3068\u30c7\u30fc\u30bf\u306e\u9bae\u5ea6\u7dad\u6301\u306b\u91cd\u8981\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u4f8b\u3092\u793a\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=\"\">class CacheManager:\n    def __init__(self, redis_client):\n        self.redis = redis_client\n\n    def cache_data(self, key, data, expire_seconds=3600):\n        \"\"\"\u30c7\u30fc\u30bf\u3092\u30ad\u30e3\u30c3\u30b7\u30e5\u306b\u4fdd\u5b58\"\"\"\n        serialized_data = json.dumps(data)\n        self.redis.setex(key, expire_seconds, serialized_data)\n\n    def get_cached_data(self, key, default=None):\n        \"\"\"\u30ad\u30e3\u30c3\u30b7\u30e5\u304b\u3089\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\"\"\"\n        data = self.redis.get(key)\n        return json.loads(data) if data else default\n\n    def cache_exists(self, key):\n        \"\"\"\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u5b58\u5728\u78ba\u8a8d\"\"\"\n        return self.redis.exists(key)\n\n    def get_ttl(self, key):\n        \"\"\"\u6b8b\u308a\u6709\u52b9\u671f\u9650\u306e\u53d6\u5f97\"\"\"\n        return self.redis.ttl(key)\n\n# \u4f7f\u7528\u4f8b\ncache = CacheManager(redis_client)\n\n# API\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\ndef get_user_data(user_id):\n    cache_key = f'user:data:{user_id}'\n\n    # \u30ad\u30e3\u30c3\u30b7\u30e5\u30c1\u30a7\u30c3\u30af\n    if cached_data := cache.get_cached_data(cache_key):\n        print(\"Cache hit!\")\n        return cached_data\n\n    # \u30ad\u30e3\u30c3\u30b7\u30e5\u30df\u30b9\u6642\u306e\u51e6\u7406\n    print(\"Cache miss, fetching from API...\")\n    user_data = fetch_from_api(user_id)  # \u4eee\u60f3\u7684\u306aAPI\u547c\u3073\u51fa\u3057\n\n    # \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u66f4\u65b0\n    cache.cache_data(cache_key, user_data, expire_seconds=1800)\n    return user_data<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u57fa\u672c\u64cd\u4f5c\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u9ad8\u5ea6\u306a\u30ad\u30e3\u30c3\u30b7\u30e5\u30b7\u30b9\u30c6\u30e0\u3084\u30c7\u30fc\u30bf\u7ba1\u7406\u6a5f\u80fd\u3092\u5b9f\u88c5\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\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-11\">\u5b9f\u8df5\u7684\u306aRedis\u6d3b\u7528\u30d1\u30bf\u30fc\u30f3<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-12\">API\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u5b9f\u88c5\u4f8b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">API\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u305f\u3081\u306e\u5b9f\u8df5\u7684\u306a\u30ad\u30e3\u30c3\u30b7\u30e5\u5b9f\u88c5\u3092\u89e3\u8aac\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=\"\">from functools import wraps\nimport json\nimport redis\nfrom typing import Optional, Any\n\nclass APICache:\n    def __init__(self, redis_client: redis.Redis):\n        self.redis = redis_client\n\n    def cache_decorator(self, expire_seconds: int = 3600):\n        \"\"\"API\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u30ad\u30e3\u30c3\u30b7\u30e5\u3059\u308b\u30c7\u30b3\u30ec\u30fc\u30bf\"\"\"\n        def decorator(func):\n            @wraps(func)\n            async def wrapper(*args, **kwargs):\n                # \u30ad\u30e3\u30c3\u30b7\u30e5\u30ad\u30fc\u306e\u751f\u6210\n                cache_key = f\"api:cache:{func.__name__}:{hash(str(args) + str(kwargs))}\"\n\n                # \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u78ba\u8a8d\n                cached_response = self.redis.get(cache_key)\n                if cached_response:\n                    return json.loads(cached_response)\n\n                # API\u304b\u3089\u30c7\u30fc\u30bf\u53d6\u5f97\n                response = await func(*args, **kwargs)\n\n                # \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u4fdd\u5b58\n                self.redis.setex(\n                    cache_key,\n                    expire_seconds,\n                    json.dumps(response)\n                )\n                return response\n            return wrapper\n        return decorator\n\n# \u4f7f\u7528\u4f8b\nredis_client = redis.Redis(host='localhost', port=6379, db=0)\ncache = APICache(redis_client)\n\n@cache.cache_decorator(expire_seconds=1800)\nasync def get_user_data(user_id: int) -&gt; dict:\n    # \u5b9f\u969b\u306eAPI\u547c\u3073\u51fa\u3057\u3092\u30b7\u30df\u30e5\u30ec\u30fc\u30c8\n    user_data = {\"id\": user_id, \"name\": \"John Doe\", \"email\": \"john@example.com\"}\n    return user_data<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406\u3067\u306e\u6d3b\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Redis\u3092\u4f7f\u7528\u3057\u305f\u5b89\u5168\u3067\u52b9\u7387\u7684\u306a\u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\u306e\u5b9f\u88c5\u4f8b\u3067\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=\"\">from datetime import datetime, timedelta\nimport secrets\nfrom typing import Optional\n\nclass SessionManager:\n    def __init__(self, redis_client: redis.Redis):\n        self.redis = redis_client\n        self.session_duration = timedelta(hours=24)\n\n    def create_session(self, user_id: int) -&gt; str:\n        \"\"\"\u65b0\u898f\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4f5c\u6210\"\"\"\n        session_id = secrets.token_urlsafe(32)\n        session_data = {\n            'user_id': user_id,\n            'created_at': datetime.now().isoformat(),\n            'last_accessed': datetime.now().isoformat()\n        }\n\n        session_key = f\"session:{session_id}\"\n        self.redis.hmset(session_key, session_data)\n        self.redis.expire(session_key, self.session_duration)\n\n        return session_id\n\n    def get_session(self, session_id: str) -&gt; Optional[dict]:\n        \"\"\"\u30bb\u30c3\u30b7\u30e7\u30f3\u60c5\u5831\u306e\u53d6\u5f97\u3068\u66f4\u65b0\"\"\"\n        session_key = f\"session:{session_id}\"\n        session_data = self.redis.hgetall(session_key)\n\n        if session_data:\n            # \u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u6709\u52b9\u671f\u9650\u3092\u66f4\u65b0\n            self.redis.hset(session_key, 'last_accessed', datetime.now().isoformat())\n            self.redis.expire(session_key, self.session_duration)\n            return session_data\n\n        return None\n\n    def invalidate_session(self, session_id: str) -&gt; bool:\n        \"\"\"\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u7121\u52b9\u5316\"\"\"\n        return bool(self.redis.delete(f\"session:{session_id}\"))\n\n# \u4f7f\u7528\u4f8b\nsession_manager = SessionManager(redis_client)\n\n# \u30bb\u30c3\u30b7\u30e7\u30f3\u4f5c\u6210\nuser_id = 12345\nsession_id = session_manager.create_session(user_id)\n\n# \u30bb\u30c3\u30b7\u30e7\u30f3\u78ba\u8a8d\nsession = session_manager.get_session(session_id)\nif session:\n    print(f\"Active session for user: {session['user_id']}\")<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u30b8\u30e7\u30d6\u30ad\u30e5\u30fc\u30b7\u30b9\u30c6\u30e0\u306e\u69cb\u7bc9\u624b\u9806<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5206\u6563\u51e6\u7406\u306e\u305f\u3081\u306e\u30b8\u30e7\u30d6\u30ad\u30e5\u30fc\u30b7\u30b9\u30c6\u30e0\u3092Redis\u3067\u5b9f\u88c5\u3059\u308b\u4f8b\u3092\u793a\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=\"\">import json\nfrom datetime import datetime\nfrom typing import Any, Optional\nimport time\n\nclass JobQueue:\n    def __init__(self, redis_client: redis.Redis, queue_name: str):\n        self.redis = redis_client\n        self.queue_name = queue_name\n        self.processing_queue = f\"{queue_name}:processing\"\n        self.failed_queue = f\"{queue_name}:failed\"\n\n    def enqueue(self, job_data: dict) -&gt; str:\n        \"\"\"\u30b8\u30e7\u30d6\u3092\u30ad\u30e5\u30fc\u306b\u8ffd\u52a0\"\"\"\n        job_id = secrets.token_hex(8)\n        job = {\n            'id': job_id,\n            'data': job_data,\n            'status': 'pending',\n            'created_at': datetime.now().isoformat(),\n            'attempts': 0\n        }\n\n        self.redis.lpush(self.queue_name, json.dumps(job))\n        return job_id\n\n    def process_jobs(self, max_attempts: int = 3):\n        \"\"\"\u30b8\u30e7\u30d6\u306e\u51e6\u7406\"\"\"\n        while True:\n            # \u30ad\u30e5\u30fc\u304b\u3089\u30b8\u30e7\u30d6\u3092\u53d6\u5f97\n            raw_job = self.redis.brpoplpush(\n                self.queue_name,\n                self.processing_queue,\n                timeout=1\n            )\n\n            if not raw_job:\n                continue\n\n            job = json.loads(raw_job)\n            job['attempts'] += 1\n\n            try:\n                # \u30b8\u30e7\u30d6\u306e\u5b9f\u884c\uff08\u5b9f\u969b\u306e\u51e6\u7406\u3092\u3053\u3053\u306b\u5b9f\u88c5\uff09\n                self._process_job(job['data'])\n\n                # \u6210\u529f\u3057\u305f\u30b8\u30e7\u30d6\u306e\u524a\u9664\n                self.redis.lrem(self.processing_queue, 1, raw_job)\n\n            except Exception as e:\n                if job['attempts'] &gt;= max_attempts:\n                    # \u5931\u6557\u30ad\u30e5\u30fc\u306b\u79fb\u52d5\n                    self.redis.lrem(self.processing_queue, 1, raw_job)\n                    job['status'] = 'failed'\n                    job['error'] = str(e)\n                    self.redis.lpush(\n                        self.failed_queue,\n                        json.dumps(job)\n                    )\n                else:\n                    # \u30ea\u30c8\u30e9\u30a4\u306e\u305f\u3081\u30e1\u30a4\u30f3\u30ad\u30e5\u30fc\u306b\u623b\u3059\n                    self.redis.lrem(self.processing_queue, 1, raw_job)\n                    self.redis.lpush(\n                        self.queue_name,\n                        json.dumps(job)\n                    )\n\n    def _process_job(self, job_data: dict):\n        \"\"\"\u30b8\u30e7\u30d6\u306e\u5b9f\u969b\u306e\u51e6\u7406\u3092\u884c\u3046\uff08\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u7528\uff09\"\"\"\n        raise NotImplementedError\n\n# \u4f7f\u7528\u4f8b\nclass EmailJobQueue(JobQueue):\n    def _process_job(self, job_data: dict):\n        print(f\"Sending email to: {job_data['recipient']}\")\n        # \u5b9f\u969b\u306e\u30e1\u30fc\u30eb\u9001\u4fe1\u51e6\u7406\u3092\u3053\u3053\u306b\u5b9f\u88c5\n        time.sleep(1)  # \u51e6\u7406\u3092\u30b7\u30df\u30e5\u30ec\u30fc\u30c8\n\n# \u30ad\u30e5\u30fc\u306e\u521d\u671f\u5316\u3068\u4f7f\u7528\nemail_queue = EmailJobQueue(redis_client, 'email:queue')\n\n# \u30b8\u30e7\u30d6\u306e\u8ffd\u52a0\njob_id = email_queue.enqueue({\n    'recipient': 'user@example.com',\n    'subject': 'Welcome',\n    'body': 'Welcome to our service!'\n})\n\n# \u30b8\u30e7\u30d6\u306e\u51e6\u7406\uff08\u5225\u30b9\u30ec\u30c3\u30c9\u3067\u5b9f\u884c\uff09\nimport threading\nworker = threading.Thread(target=email_queue.process_jobs)\nworker.start()<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u5b9f\u88c5\u4f8b\u306f\u3001\u5b9f\u969b\u306e\u958b\u767a\u73fe\u5834\u3067\u4f7f\u7528\u3067\u304d\u308b\u5b9f\u8df5\u7684\u306a\u30d1\u30bf\u30fc\u30f3\u3092\u793a\u3057\u3066\u3044\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u30b7\u30b9\u30c6\u30e0\u3092\u52b9\u7387\u7684\u306b\u904b\u7528\u3059\u308b\u305f\u3081\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u3068\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-15\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u3068\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316\u624b\u6cd5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Redis\u306e\u30e1\u30e2\u30ea\u4f7f\u7528\u3092\u52b9\u7387\u7684\u306b\u7ba1\u7406\u3057\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u6700\u9069\u5316\u3059\u308b\u65b9\u6cd5\u3092\u89e3\u8aac\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=\"\">import redis\nfrom typing import Dict, Any\nimport json\nimport sys\n\nclass RedisMemoryOptimizer:\n    def __init__(self, redis_client: redis.Redis):\n        self.redis = redis_client\n\n    def analyze_memory_usage(self) -&gt; Dict[str, Any]:\n        \"\"\"\u30e1\u30e2\u30ea\u4f7f\u7528\u72b6\u6cc1\u306e\u5206\u6790\"\"\"\n        memory_info = self.redis.info(section='memory')\n        return {\n            'used_memory_human': memory_info['used_memory_human'],\n            'used_memory_peak_human': memory_info['used_memory_peak_human'],\n            'maxmemory_human': memory_info.get('maxmemory_human', 'not set'),\n            'maxmemory_policy': memory_info.get('maxmemory_policy', 'noeviction')\n        }\n\n    def get_key_memory_usage(self, key: str) -&gt; int:\n        \"\"\"\u7279\u5b9a\u306e\u30ad\u30fc\u306e\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u53d6\u5f97\"\"\"\n        return self.redis.memory_usage(key)\n\n    def find_large_keys(self, min_size_bytes: int = 1024) -&gt; Dict[str, int]:\n        \"\"\"\u5927\u304d\u306a\u30e1\u30e2\u30ea\u3092\u4f7f\u7528\u3057\u3066\u3044\u308b\u30ad\u30fc\u3092\u7279\u5b9a\"\"\"\n        large_keys = {}\n        for key in self.redis.scan_iter(\"*\"):\n            size = self.redis.memory_usage(key)\n            if size and size &gt; min_size_bytes:\n                large_keys[key] = size\n        return dict(sorted(large_keys.items(), key=lambda x: x[1], reverse=True))\n\n# \u30e1\u30e2\u30ea\u6700\u9069\u5316\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u5b9f\u88c5\u4f8b\nclass OptimizedCacheManager:\n    def __init__(self, redis_client: redis.Redis):\n        self.redis = redis_client\n\n    def store_compressed(self, key: str, data: dict, expire_seconds: int = 3600):\n        \"\"\"\u30c7\u30fc\u30bf\u3092\u5727\u7e2e\u3057\u3066\u4fdd\u5b58\"\"\"\n        import zlib\n        compressed_data = zlib.compress(json.dumps(data).encode())\n        self.redis.setex(key, expire_seconds, compressed_data)\n\n    def get_compressed(self, key: str) -&gt; dict:\n        \"\"\"\u5727\u7e2e\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3057\u3066\u5c55\u958b\"\"\"\n        import zlib\n        compressed_data = self.redis.get(key)\n        if compressed_data:\n            return json.loads(zlib.decompress(compressed_data).decode())\n        return None\n\n# \u4f7f\u7528\u4f8b\noptimizer = RedisMemoryOptimizer(redis_client)\nmemory_stats = optimizer.analyze_memory_usage()\nprint(\"Memory usage statistics:\", memory_stats)\n\n# \u5927\u304d\u306a\u30ad\u30fc\u306e\u7279\u5b9a\nlarge_keys = optimizer.find_large_keys(min_size_bytes=10000)\nprint(\"Large keys:\", large_keys)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u30ad\u30e3\u30c3\u30b7\u30e5\u30d2\u30c3\u30c8\u7387\u306e\u5411\u4e0a\u65b9\u6cd5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u52b9\u7387\u3092\u6700\u5927\u5316\u3057\u3001\u30d2\u30c3\u30c8\u7387\u3092\u5411\u4e0a\u3055\u305b\u308b\u305f\u3081\u306e\u5b9f\u88c5\u4f8b\u3092\u793a\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=\"\">class CacheAnalyzer:\n    def __init__(self, redis_client: redis.Redis):\n        self.redis = redis_client\n        self.hits_key = \"cache:stats:hits\"\n        self.misses_key = \"cache:stats:misses\"\n\n    def record_cache_hit(self):\n        \"\"\"\u30ad\u30e3\u30c3\u30b7\u30e5\u30d2\u30c3\u30c8\u3092\u8a18\u9332\"\"\"\n        self.redis.incr(self.hits_key)\n\n    def record_cache_miss(self):\n        \"\"\"\u30ad\u30e3\u30c3\u30b7\u30e5\u30df\u30b9\u3092\u8a18\u9332\"\"\"\n        self.redis.incr(self.misses_key)\n\n    def get_hit_rate(self) -&gt; float:\n        \"\"\"\u30ad\u30e3\u30c3\u30b7\u30e5\u30d2\u30c3\u30c8\u7387\u3092\u8a08\u7b97\"\"\"\n        hits = int(self.redis.get(self.hits_key) or 0)\n        misses = int(self.redis.get(self.misses_key) or 0)\n        total = hits + misses\n        return (hits \/ total * 100) if total &gt; 0 else 0\n\n    def reset_stats(self):\n        \"\"\"\u7d71\u8a08\u60c5\u5831\u3092\u30ea\u30bb\u30c3\u30c8\"\"\"\n        self.redis.delete(self.hits_key, self.misses_key)\n\nclass SmartCache:\n    def __init__(self, redis_client: redis.Redis):\n        self.redis = redis_client\n        self.analyzer = CacheAnalyzer(redis_client)\n\n    def get_with_stats(self, key: str) -&gt; Any:\n        \"\"\"\u7d71\u8a08\u60c5\u5831\u3092\u8a18\u9332\u3057\u306a\u304c\u3089\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u53d6\u5f97\"\"\"\n        value = self.redis.get(key)\n        if value:\n            self.analyzer.record_cache_hit()\n        else:\n            self.analyzer.record_cache_miss()\n        return value\n\n    def set_with_adaptive_ttl(self, key: str, value: Any):\n        \"\"\"\u30a2\u30af\u30bb\u30b9\u983b\u5ea6\u306b\u57fa\u3065\u3044\u3066\u6709\u52b9\u671f\u9650\u3092\u8abf\u6574\"\"\"\n        access_count_key = f\"access_count:{key}\"\n        count = self.redis.incr(access_count_key)\n\n        # \u30a2\u30af\u30bb\u30b9\u983b\u5ea6\u306b\u5fdc\u3058\u3066TTL\u3092\u8abf\u6574\n        if count &gt; 100:\n            ttl = 7200  # \u9ad8\u983b\u5ea6\u30a2\u30af\u30bb\u30b9: 2\u6642\u9593\n        elif count &gt; 50:\n            ttl = 3600  # \u4e2d\u983b\u5ea6\u30a2\u30af\u30bb\u30b9: 1\u6642\u9593\n        else:\n            ttl = 1800  # \u4f4e\u983b\u5ea6\u30a2\u30af\u30bb\u30b9: 30\u5206\n\n        self.redis.setex(key, ttl, value)\n        self.redis.expire(access_count_key, 86400)  # \u30a2\u30af\u30bb\u30b9\u30ab\u30a6\u30f3\u30bf\u306f24\u6642\u9593\u6709\u52b9<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\u904b\u7528\u76e3\u8996\u306e\u5b9f\u88c5\u30a2\u30d7\u30ed\u30fc\u30c1<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Redis\u30b7\u30b9\u30c6\u30e0\u306e\u5065\u5168\u6027\u3092\u76e3\u8996\u3057\u3001\u554f\u984c\u3092\u65e9\u671f\u306b\u691c\u51fa\u3059\u308b\u305f\u3081\u306e\u5b9f\u88c5\u4f8b\u3092\u793a\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=\"\">import time\nfrom datetime import datetime\nimport logging\n\nclass RedisMonitor:\n    def __init__(self, redis_client: redis.Redis):\n        self.redis = redis_client\n        self.logger = logging.getLogger('redis_monitor')\n\n    def check_health(self) -&gt; Dict[str, Any]:\n        \"\"\"Redis\u306e\u5065\u5168\u6027\u30c1\u30a7\u30c3\u30af\"\"\"\n        try:\n            start_time = time.time()\n            self.redis.ping()\n            latency = (time.time() - start_time) * 1000\n\n            info = self.redis.info()\n            return {\n                'status': 'healthy',\n                'latency_ms': round(latency, 2),\n                'connected_clients': info['connected_clients'],\n                'used_memory': info['used_memory_human'],\n                'total_commands_processed': info['total_commands_processed']\n            }\n        except redis.ConnectionError as e:\n            return {\n                'status': 'unhealthy',\n                'error': str(e)\n            }\n\n    def monitor_metrics(self, interval: int = 60):\n        \"\"\"\u5b9a\u671f\u7684\u306a\u30e1\u30c8\u30ea\u30af\u30b9\u53ce\u96c6\"\"\"\n        while True:\n            metrics = {\n                'timestamp': datetime.now().isoformat(),\n                **self.check_health()\n            }\n\n            # \u30e1\u30c8\u30ea\u30af\u30b9\u306e\u4fdd\u5b58\n            self.redis.lpush('redis:metrics', json.dumps(metrics))\n            self.redis.ltrim('redis:metrics', 0, 1000)  # \u76f4\u8fd11000\u4ef6\u306e\u307f\u4fdd\u6301\n\n            # \u30a2\u30e9\u30fc\u30c8\u306e\u78ba\u8a8d\n            self._check_alerts(metrics)\n\n            time.sleep(interval)\n\n    def _check_alerts(self, metrics: Dict[str, Any]):\n        \"\"\"\u30e1\u30c8\u30ea\u30af\u30b9\u306b\u57fa\u3065\u304f\u30a2\u30e9\u30fc\u30c8\u5224\u5b9a\"\"\"\n        if metrics['status'] == 'healthy':\n            if metrics['latency_ms'] &gt; 100:\n                self._send_alert('High latency detected')\n\n            if metrics['connected_clients'] &gt; 1000:\n                self._send_alert('High number of connected clients')\n\n    def _send_alert(self, message: str):\n        \"\"\"\u30a2\u30e9\u30fc\u30c8\u306e\u9001\u4fe1\uff08\u5b9f\u969b\u306e\u5b9f\u88c5\u306f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u5fdc\u3058\u3066\uff09\"\"\"\n        self.logger.warning(f\"Redis Alert: {message}\")\n        # \u3053\u3053\u306bSlack\u901a\u77e5\u3084\u30e1\u30fc\u30eb\u9001\u4fe1\u306a\u3069\u306e\u5b9f\u88c5\u3092\u8ffd\u52a0\n\n# \u4f7f\u7528\u4f8b\nmonitor = RedisMonitor(redis_client)\n\n# \u5065\u5168\u6027\u30c1\u30a7\u30c3\u30af\nhealth_status = monitor.check_health()\nprint(\"Redis health status:\", health_status)\n\n# \u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u3067\u306e\u76e3\u8996\u958b\u59cb\nimport threading\nmonitoring_thread = threading.Thread(\n    target=monitor.monitor_metrics,\n    args=(30,)  # 30\u79d2\u9593\u9694\u3067\u30c1\u30a7\u30c3\u30af\n)\nmonitoring_thread.daemon = True\nmonitoring_thread.start()<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u5b9f\u88c5\u306b\u3088\u308a\u3001Redis\u30b7\u30b9\u30c6\u30e0\u306e\u52b9\u7387\u7684\u306a\u904b\u7528\u3068\u65e9\u671f\u306e\u554f\u984c\u691c\u51fa\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u672c\u756a\u74b0\u5883\u3067\u306e\u904b\u7528\u306b\u95a2\u3059\u308b\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-19\">\u672c\u756a\u74b0\u5883\u3067\u306e\u904b\u7528\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u306e\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u756a\u74b0\u5883\u3067\u306eRedis\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u78ba\u4fdd\u3059\u308b\u305f\u3081\u306e\u5b9f\u88c5\u4f8b\u3092\u793a\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=\"\">import redis\nfrom cryptography.fernet import Fernet\nimport secrets\nimport ssl\nfrom typing import Optional\n\nclass SecureRedisClient:\n    def __init__(self, host: str, port: int, password: str):\n        self.redis = redis.Redis(\n            host=host,\n            port=port,\n            password=password,\n            ssl=True,\n            ssl_cert_reqs=ssl.CERT_REQUIRED,\n            ssl_ca_certs='\/path\/to\/ca.pem'  # SSL\u8a3c\u660e\u66f8\u306e\u30d1\u30b9\n        )\n        # \u6697\u53f7\u5316\u30ad\u30fc\u306e\u521d\u671f\u5316\n        self.cipher_suite = Fernet(Fernet.generate_key())\n\n    def set_encrypted(self, key: str, value: str, expire: Optional[int] = None):\n        \"\"\"\u30c7\u30fc\u30bf\u3092\u6697\u53f7\u5316\u3057\u3066\u4fdd\u5b58\"\"\"\n        encrypted_value = self.cipher_suite.encrypt(value.encode())\n        if expire:\n            self.redis.setex(key, expire, encrypted_value)\n        else:\n            self.redis.set(key, encrypted_value)\n\n    def get_encrypted(self, key: str) -&gt; Optional[str]:\n        \"\"\"\u6697\u53f7\u5316\u3055\u308c\u305f\u30c7\u30fc\u30bf\u3092\u5fa9\u53f7\u5316\u3057\u3066\u53d6\u5f97\"\"\"\n        encrypted_value = self.redis.get(key)\n        if encrypted_value:\n            return self.cipher_suite.decrypt(encrypted_value).decode()\n        return None\n\nclass RedisSecurityManager:\n    def __init__(self, redis_client: redis.Redis):\n        self.redis = redis_client\n\n    def setup_security_config(self):\n        \"\"\"\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8a2d\u5b9a\u306e\u5b9f\u88c5\"\"\"\n        # \u30d1\u30b9\u30ef\u30fc\u30c9\u8981\u6c42\u306e\u8a2d\u5b9a\n        self.redis.config_set('requirepass', secrets.token_urlsafe(32))\n\n        # \u5371\u967a\u306a\u30b3\u30de\u30f3\u30c9\u306e\u7121\u52b9\u5316\n        dangerous_commands = ['FLUSHALL', 'FLUSHDB', 'CONFIG', 'KEYS']\n        for cmd in dangerous_commands:\n            self.redis.config_set(f'rename-command {cmd}', f'\"{secrets.token_hex(16)}\"')\n\n        # \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30a2\u30af\u30bb\u30b9\u5236\u9650\n        self.redis.config_set('bind', '127.0.0.1')\n\n    def implement_rate_limiting(self, key_prefix: str, max_requests: int, window_seconds: int):\n        \"\"\"\u30ec\u30fc\u30c8\u5236\u9650\u306e\u5b9f\u88c5\"\"\"\n        lua_script = \"\"\"\n        local key = KEYS[1]\n        local max_requests = tonumber(ARGV[1])\n        local window = tonumber(ARGV[2])\n        local current = redis.call('INCR', key)\n        if current == 1 then\n            redis.call('EXPIRE', key, window)\n        end\n        return current &lt;= max_requests\n        \"\"\"\n        return self.redis.eval(lua_script, 1, key_prefix, max_requests, window_seconds)\n\n# \u30bb\u30ad\u30e5\u30a2\u306a\u63a5\u7d9a\u306e\u4f7f\u7528\u4f8b\nsecure_client = SecureRedisClient(\n    host='redis.example.com',\n    port=6379,\n    password='your_strong_password'\n)\n\n# \u6a5f\u5bc6\u30c7\u30fc\u30bf\u306e\u5b89\u5168\u306a\u4fdd\u5b58\nsecure_client.set_encrypted(\n    'user:123:credit_card',\n    '1234-5678-9012-3456',\n    expire=3600\n)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3068\u5fa9\u65e7\u624b\u9806\u306e\u89e3\u8aac<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u30c7\u30fc\u30bf\u306e\u5b89\u5168\u306a\u4fdd\u8b77\u3068\u5fa9\u65e7\u306e\u305f\u3081\u306e\u5b9f\u88c5\u4f8b\u3092\u793a\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=\"\">import subprocess\nimport os\nfrom datetime import datetime\nimport gzip\nimport shutil\n\nclass RedisBackupManager:\n    def __init__(self, redis_client: redis.Redis, backup_dir: str):\n        self.redis = redis_client\n        self.backup_dir = backup_dir\n        os.makedirs(backup_dir, exist_ok=True)\n\n    def create_backup(self) -&gt; str:\n        \"\"\"RDB\u30d5\u30a1\u30a4\u30eb\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3092\u4f5c\u6210\"\"\"\n        timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')\n        backup_file = f\"redis_backup_{timestamp}.rdb\"\n        backup_path = os.path.join(self.backup_dir, backup_file)\n\n        # SAVE \u30b3\u30de\u30f3\u30c9\u3067RDB\u30d5\u30a1\u30a4\u30eb\u3092\u751f\u6210\n        self.redis.save()\n\n        # RDB\u30d5\u30a1\u30a4\u30eb\u3092\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\n        rdb_path = self.redis.config_get('dir')['dir'] + '\/dump.rdb'\n        shutil.copy2(rdb_path, backup_path)\n\n        # \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u5727\u7e2e\n        self._compress_file(backup_path)\n\n        return f\"{backup_path}.gz\"\n\n    def restore_backup(self, backup_file: str):\n        \"\"\"\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u304b\u3089\u306e\u5fa9\u5143\"\"\"\n        if backup_file.endswith('.gz'):\n            uncompressed_file = backup_file[:-3]\n            self._decompress_file(backup_file, uncompressed_file)\n            backup_file = uncompressed_file\n\n        # Redis\u30b5\u30fc\u30d0\u30fc\u306e\u505c\u6b62\n        self.redis.shutdown()\n\n        # RDB\u30d5\u30a1\u30a4\u30eb\u306e\u5fa9\u5143\n        rdb_path = self.redis.config_get('dir')['dir'] + '\/dump.rdb'\n        shutil.copy2(backup_file, rdb_path)\n\n        # Redis\u30b5\u30fc\u30d0\u30fc\u306e\u518d\u8d77\u52d5\uff08\u5b9f\u969b\u306e\u74b0\u5883\u306b\u5fdc\u3058\u3066\u5b9f\u88c5\uff09\n        subprocess.run(['service', 'redis', 'start'])\n\n    def _compress_file(self, file_path: str):\n        \"\"\"\u30d5\u30a1\u30a4\u30eb\u306e\u5727\u7e2e\"\"\"\n        with open(file_path, 'rb') as f_in:\n            with gzip.open(f\"{file_path}.gz\", 'wb') as f_out:\n                shutil.copyfileobj(f_in, f_out)\n        os.remove(file_path)\n\n    def _decompress_file(self, compressed_file: str, output_file: str):\n        \"\"\"\u30d5\u30a1\u30a4\u30eb\u306e\u89e3\u51cd\"\"\"\n        with gzip.open(compressed_file, 'rb') as f_in:\n            with open(output_file, 'wb') as f_out:\n                shutil.copyfileobj(f_in, f_out)\n\n# \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u7ba1\u7406\u306e\u4f7f\u7528\u4f8b\nbackup_manager = RedisBackupManager(redis_client, '\/path\/to\/backups')\n\n# \u5b9a\u671f\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u8a2d\u5b9a\ndef schedule_backups():\n    from apscheduler.schedulers.background import BackgroundScheduler\n    scheduler = BackgroundScheduler()\n    scheduler.add_job(\n        backup_manager.create_backup,\n        'cron',\n        hour=3  # \u6bce\u65e5\u5348\u524d3\u6642\u306b\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\n    )\n    scheduler.start()<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">\u30b9\u30b1\u30fc\u30eb\u30a2\u30c3\u30d7\u3068\u30b9\u30b1\u30fc\u30eb\u30a2\u30a6\u30c8\u306e\u6226\u7565<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Redis\u30b7\u30b9\u30c6\u30e0\u306e\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u6226\u7565\u3068\u5b9f\u88c5\u4f8b\u3092\u793a\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=\"\">from redis.sentinel import Sentinel\nfrom redis.cluster import RedisCluster\nfrom typing import List, Dict\n\nclass RedisScalingManager:\n    def __init__(self):\n        self.sentinel_nodes = [\n            ('sentinel1.example.com', 26379),\n            ('sentinel2.example.com', 26379),\n            ('sentinel3.example.com', 26379)\n        ]\n\n        self.cluster_nodes = [\n            {'host': 'redis1.example.com', 'port': 6379},\n            {'host': 'redis2.example.com', 'port': 6379},\n            {'host': 'redis3.example.com', 'port': 6379}\n        ]\n\n    def setup_sentinel_client(self) -&gt; redis.Redis:\n        \"\"\"Sentinel\u3092\u4f7f\u7528\u3057\u305f\u9ad8\u53ef\u7528\u6027\u69cb\u6210\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\"\"\"\n        sentinel = Sentinel(\n            self.sentinel_nodes,\n            socket_timeout=0.1\n        )\n\n        # \u30de\u30b9\u30bf\u30fc\u30ce\u30fc\u30c9\u3078\u306e\u63a5\u7d9a\u53d6\u5f97\n        master = sentinel.master_for(\n            'mymaster',\n            socket_timeout=0.1,\n            password='your_redis_password'\n        )\n\n        # \u30b9\u30ec\u30fc\u30d6\u30ce\u30fc\u30c9\u3078\u306e\u63a5\u7d9a\u53d6\u5f97\uff08\u8aad\u307f\u53d6\u308a\u5c02\u7528\uff09\n        slave = sentinel.slave_for(\n            'mymaster',\n            socket_timeout=0.1,\n            password='your_redis_password'\n        )\n\n        return master, slave\n\n    def setup_cluster_client(self) -&gt; RedisCluster:\n        \"\"\"Redis\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\"\"\"\n        return RedisCluster(\n            startup_nodes=self.cluster_nodes,\n            decode_responses=True,\n            password='your_redis_password'\n        )\n\n    def implement_read_write_splitting(self):\n        \"\"\"\u8aad\u307f\u66f8\u304d\u5206\u96e2\u306e\u5b9f\u88c5\"\"\"\n        master, slave = self.setup_sentinel_client()\n\n        def write_operation(key: str, value: str):\n            \"\"\"\u66f8\u304d\u8fbc\u307f\u64cd\u4f5c\u306f\u30de\u30b9\u30bf\u30fc\u306b\"\"\"\n            return master.set(key, value)\n\n        def read_operation(key: str) -&gt; str:\n            \"\"\"\u8aad\u307f\u53d6\u308a\u64cd\u4f5c\u306f\u30b9\u30ec\u30fc\u30d6\u304b\u3089\"\"\"\n            return slave.get(key)\n\n        return write_operation, read_operation\n\nclass LoadBalancer:\n    def __init__(self, redis_nodes: List[redis.Redis]):\n        self.nodes = redis_nodes\n        self.current_node = 0\n\n    def get_next_node(self) -&gt; redis.Redis:\n        \"\"\"\u30e9\u30a6\u30f3\u30c9\u30ed\u30d3\u30f3\u65b9\u5f0f\u3067\u30ce\u30fc\u30c9\u3092\u9078\u629e\"\"\"\n        node = self.nodes[self.current_node]\n        self.current_node = (self.current_node + 1) % len(self.nodes)\n        return node\n\n    def execute_command(self, command: str, *args, **kwargs):\n        \"\"\"\u8ca0\u8377\u5206\u6563\u3057\u3066\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\"\"\"\n        node = self.get_next_node()\n        return getattr(node, command)(*args, **kwargs)\n\n# \u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u7ba1\u7406\u306e\u4f7f\u7528\u4f8b\nscaling_manager = RedisScalingManager()\n\n# Sentinel\u3092\u4f7f\u7528\u3057\u305f\u9ad8\u53ef\u7528\u6027\u69cb\u6210\nmaster, slave = scaling_manager.setup_sentinel_client()\n\n# \u30af\u30e9\u30b9\u30bf\u30fc\u30e2\u30fc\u30c9\u3067\u306e\u904b\u7528\ncluster = scaling_manager.setup_cluster_client()\n\n# \u8aad\u307f\u66f8\u304d\u5206\u96e2\u306e\u5b9f\u88c5\nwrite_op, read_op = scaling_manager.implement_read_write_splitting()<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u756a\u74b0\u5883\u3067\u306e\u904b\u7528\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u3001\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u6226\u7565\u3001\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u624b\u6cd5\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002\u307e\u305f\u3001\u5b9a\u671f\u7684\u306a\u76e3\u8996\u3068\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u3092\u884c\u3044\u3001\u30b7\u30b9\u30c6\u30e0\u306e\u5065\u5168\u6027\u3092\u7dad\u6301\u3059\u308b\u3053\u3068\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee5\u4e0a\u3067\u3001Redis\u3068Python\u3092\u4f7f\u7528\u3057\u305f\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u3068\u904b\u7528\u65b9\u6cd5\u306e\u89e3\u8aac\u3092\u7d42\u308f\u308a\u307e\u3059\u3002\u3053\u308c\u3089\u306e\u77e5\u8b58\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u3067\u5b89\u5b9a\u3057\u305fRedis\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u30fb\u904b\u7528\u3059\u308b\u3053\u3068\u304c\u3067\u304d\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":["post-3340","post","type-post","status-publish","format-standard","category-php","nothumb"],"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3340","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=3340"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3340\/revisions"}],"predecessor-version":[{"id":3342,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3340\/revisions\/3342"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3340"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3340"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3340"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}