{"id":4558,"date":"2026-07-15T07:00:00","date_gmt":"2026-07-14T22:00:00","guid":{"rendered":"https:\/\/litcoder.com\/?p=4558"},"modified":"2026-06-27T16:56:16","modified_gmt":"2026-06-27T07:56:16","slug":"redis-stream%ec%9d%84-%ec%9d%b4%ec%9a%a9%ed%95%9c-task-queue-%ea%b5%ac%ec%84%b1","status":"publish","type":"post","link":"https:\/\/litcoder.com\/?p=4558","title":{"rendered":"Redis Stream\uc744 \uc774\uc6a9\ud55c task queue \uad6c\uc131"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Redis stream\uc740 \ub370\uc774\ud130\uac00 \uacc4\uc18d \ucd94\uac00\ub418\ub294 logging\uac19\uc740 \uc0ac\uc6a9 \ucf00\uc774\uc2a4\ub97c \uc5fc\ub450\ud574 \ub450\uace0 \ub3c4\uc785\uc5c8\ub2e4\uace0 \ud55c\ub2e4. \ud558\uc9c0\ub9cc stream \ub0b4\uc5d0 \uc313\uc5ec \uc788\ub294 \uc544\uc774\ud15c \ub4e4 \uc911 ACK\ub97c \ubc1b\uc9c0 \ubabb\ud55c \uc544\uc774\ud15c\ub4e4\uc744 PEL(Pending Entries List)\ub85c \uad00\ub9ac \ud560 \uc218 \uc788\ub2e4 \ubcf4\ub2c8 \ucc98\ub9ac \ub0b4\uc5ed\uc744 \ud30c\uc545\ud558\uac70\ub098 \uc911\ubcf5\ub41c \ucc98\ub9ac\ub97c \ub9c9\ub294\ub370\uc5d0\ub3c4 \uc720\uc6a9\ud558\uac8c \uc0ac\uc6a9\ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Redis\ub294 \ub2e4\uc591\ud55c \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4 API\ub97c \uc9c0\uc6d0\ud558\uc9c0\ub9cc \uc774 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 \uac01 \uba85\ub839\uc5b4\ub4e4\uc758 \ud65c\uc6a9\uc5d0 \uc911\uc810\uc744 \ub450\uc5b4 \uba85\ub839\uc5b4 \uc778\ud130\ud398\uc774\uc2a4(CLI)\ub97c \uc54c\uc544\ubcf4\uace0 task queue\ub97c \uc0dd\uc131\ud558\uace0 \ucc98\ub9ac\ud558\ub294 \uacfc\uc815\uc744 bash script\ub85c \uad6c\uc131\ud574 \ubcf8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Task Queue<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Task \uc2e4\ud589\uc694\uccad\uc774 queue\ub97c \ud1b5\ud574 \ub4e4\uc5b4\uc640\uc11c \uc5ec\ub7ec\uac1c\uc758 consumer\ub4e4\uc774 \uc774 \ub0b4\uc6a9\uc744 \uc77d\uc5b4\uc11c \ucc98\ub9ac\ud558\ub294 \uc0c1\ud669\uc744 \uac00\uc815\ud574 \ubcf4\uc790. \ub2e4\uc74c\uc758 \uadf8\ub9bc\uc5d0\uc11c &#8216;P&#8217;\ub294 \uc0dd\uc0b0\uc790(Producer)\ub85c task\ub97c queue\uc5d0 \ub123\uc5b4\uc8fc\uace0, &#8216;C1&#8217;, &#8216;C2&#8217;, &#8216;C3&#8217;\ub294 \uc18c\ube44\uc790\ub4e4(Customers)\ub85c task queue\uc5d0\uc11c item(task)\ub97c \uaebc\ub0b4\uc11c \ucc98\ub9ac\ud55c\ub2e4.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"711\" height=\"287\" src=\"https:\/\/litcoder.com\/wp-content\/uploads\/2026\/06\/redis_task_queue.png\" alt=\"\" class=\"wp-image-4561\" srcset=\"https:\/\/litcoder.com\/wp-content\/uploads\/2026\/06\/redis_task_queue.png 711w, https:\/\/litcoder.com\/wp-content\/uploads\/2026\/06\/redis_task_queue-300x121.png 300w, https:\/\/litcoder.com\/wp-content\/uploads\/2026\/06\/redis_task_queue-624x252.png 624w\" sizes=\"auto, (max-width: 711px) 100vw, 711px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Redis\ub85c \uc774\ub97c \uad6c\ud604\ud558\uae30 \uc704\ud574\uc11c\ub294 \ud06c\uac8c \ub450\uac1c\uc758 \ub3d9\uc791\uc774 \ud544\uc694 \ud55c\ub370, \ud558\ub098\ub294 <code>READGROUP<\/code>\uc73c\ub85c task\ub97c \uc77d\uc5b4 \ub4e4\uc774\ub294 \uac83\uc774\uace0, \ub2e4\ub978 \ud558\ub098\ub294 \ucc98\ub9ac\uac00 \uc644\ub8cc \ub418\uc5c8\ub2e4\ub294 \uac83\uc744 <code>ACK<\/code>\ub85c Redis\uc5d0 \uc54c\ub824 \uc8fc\ub294 \uac83\uc774\ub2e4. \uc774 \uc751\ub2f5\uc744 \ubc1b\uc73c\uba74 \ud574\ub2f9 task\ub294 queue\uc5d0\uc11c \uc81c\uac70\ub41c\ub2e4.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"711\" height=\"424\" src=\"https:\/\/litcoder.com\/wp-content\/uploads\/2026\/06\/redis_task_queue_act.png\" alt=\"\" class=\"wp-image-4562\" srcset=\"https:\/\/litcoder.com\/wp-content\/uploads\/2026\/06\/redis_task_queue_act.png 711w, https:\/\/litcoder.com\/wp-content\/uploads\/2026\/06\/redis_task_queue_act-300x179.png 300w, https:\/\/litcoder.com\/wp-content\/uploads\/2026\/06\/redis_task_queue_act-624x372.png 624w\" sizes=\"auto, (max-width: 711px) 100vw, 711px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">\uc21c\uc11c\ub300\ub85c \uc0b4\ud3b4\ubcf4\uba74, \uba3c\uc800 \u2460 Producer\uac00 task\ub97c queue\uc5d0 \ucd94\uac00\ud55c\ub2e4. \u2461 Consumer\ub4e4\uc774 READGROUP\uba85\ub839\uc73c\ub85c task\ub97c \uac00\uc838 \uac00\uc11c \ucc98\ub9ac\ud55c\ub2e4. \u2462 \ucc98\ub9ac\uac00 \uc644\ub8cc\ub418\uba74 \ud574\ub2f9 consumer\ub294 ACK\ub97c \ubcf4\ub0b8\ub2e4. \u2463 ACK \uc804\uc1a1\uc744 \ubc1b\uc740 task\ub294 queue\uc5d0\uc11c \uc81c\uac70\ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc38\uace0\ub85c \uc2e4\uc81c Redis\uc758 stream\uad00\ub828\uba85\ub839\uc5b4 \uc55e\uc5d0\ub294 &#8216;X&#8217; prefix\uac00 \ubd99\ub294\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">redis-cli\ub97c \uc774\uc6a9\ud55c \uc2e4\uc2b5<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/redis.io\/docs\/latest\/develop\/tools\/cli\/\" data-type=\"link\" data-id=\"https:\/\/redis.io\/docs\/latest\/develop\/tools\/cli\/\">redis-cli<\/a>\ub294 \ub2e4\uc591\ud55c \uc6b4\uc601\uccb4\uc81c\uc5d0\uc11c \uc0ac\uc6a9\ud560\uc218 \uc788\ub294 \uba85\ub839\uc5b4 \uc778\ud130\ud398\uc774\uc2a4\ub85c \ud504\ub85c\uadf8\ub798\ubc0d API\uc5c6\uc774\ub3c4 Redis\uba85\ub839\uc5b4\ub97c \uc218\ud589\ud560 \uc218 \uc788\ub3c4\ub85d \ud574\uc900\ub2e4.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\uadf8\ub8f9\ub9cc\ub4e4\uae30<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\uc55e\uc73c\ub85c \uc0ac\uc6a9\ud560 Redis stream\uc744 <code>taskq<\/code> \ub77c\uace0 \uc774\ub984 \uc9d3\uace0 \uc774\uac83\uc5d0 \uc811\uadfc\ud558\ub294 \uadf8\ub8f9\uba85\uc744 <code>consumers<\/code> \ub77c\uace0 \ubd80\ub974\ub3c4\ub85d \ud558\uc790. \ub2e4\uc74c\uc758 \uba85\ub839\uc5b4\ub294 Redis stream\uacfc \uc5ec\uae30\uc5d0 \uc811\uadfc\ud560 \uadf8\ub8f9\uc744 \uc0dd\uc131\ud574\uc900\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">redis-cli XGROUP CREATE taskq consumers 0 MKSTREAM<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u2460 Queue\uc5d0 \ucd94\uac00\ud558\uae30<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><code>XADD<\/code> \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud574\uc11c <code>taskq<\/code> stream\uc5d0 <code>task_id<\/code>\ub85c \uc2dc\uc791\ud558\ub294 \uba54\uc138\uc9c0\ub97c \ub2e4\uc74c\uacfc \uac19\uc774 \ucd94\uac00\ud55c\ub2e4. <code>\"*\"<\/code> \ud45c\uc2dc\ub294 item\uc758 identifier\ub97c \ub530\ub85c \uc9c0\uc815\ud558\uc9c0 \uc54a\uace0 \uc790\ub3d9\ud560\ub2f9 \ud558\ub3c4\ub85d \ud558\uaca0\ub2e4\ub294 \uc758\ubbf8\uc774\ub2e4. Identifier\ub294 \uc22b\uc790\ub85c\ub41c timestamp \ud615\uc2dd\uc774 \uc544\ub2c8\uba74 \ubc1b\uc544\ub4e4\uc5ec\uc9c0\uc9c0 \uc54a\uc73c\ub2c8 \uc218\ub3d9\uc73c\ub85c \uc9c0\uc815\ud574 \uc904 \uac83\uc774\ub77c\uba74 \ud615\uc2dd\uc5d0 \uc8fc\uc758\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">XADD taskq \"*\" task_id task_1 data \"1\ubc88\uc9f8\ub85c \ub123\uc740 \ud0dc\uc2a4\ud06c\"\nXADD taskq \"*\" task_id task_2 data \"2\ubc88\uc9f8\ub85c \ub123\uc740 \ud0dc\uc2a4\ud06c\"\nXADD taskq \"*\" task_id task_3 data \"3\ubc88\uc9f8\ub85c \ub123\uc740 \ud0dc\uc2a4\ud06c\"\n...<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u2461 Task \ucc98\ub9ac(consume)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><code>XREADGROUP<\/code> \uba85\ub839\uc5b4\ub85c <code>taskq<\/code>\ub85c \ubd80\ud130 \uc544\uc774\ud15c\uc744 \ud558\ub098 \uc77d\ub294\ub2e4. <code>BLOCK<\/code> \uad6c\ubb38 \ub4a4\uc758 \uc22b\uc790\ub294 \uc544\uc774\ud15c\uc774 \uc5c6\uc744 \ub54c \uc5bc\ub9c8\ub098 \uae30\ub2e4\ub9b4 \uac83\uc778\uac00\ub97c \ubc00\ub9ac\ucd08 \ub2e8\uc704\ub85c \ub098\ud0c0\ub0b4\ub294 \uac83\uc774\ub2e4. \uadf8\ub9ac\uace0 \uba85\ub839\uc5b4 \ub9c8\uc9c0\ub9c9\uc5d0 \ubd99\ub294 <code><strong>\">\"<\/strong><\/code>\uac00 \uc774 \uba85\ub839\uc5b4\uc5d0\uc11c \uc911\uc694\ud55c \uc5ed\ud560\uc744 \ud558\ub294\ub370, \uc774\uac83 \ub54c\ubb38\uc5d0 \ub2e4\ub978 consumers \uba64\ubc84\uac00 \uac00\uc838\uac00\uc9c0 \uc54a\uc740 task\uac00 \ubc18\ud658\ub41c\ub2e4. \ub9cc\uc57d \ubaa8\ub450 \uac00\uc838\uac00\uc11c queue\uac00 \ube44\uc5b4 \uc788\ub2e4\uba74 BLOCK\uc5d0 \uc124\uc815\ub41c 10\ucd08(10000ms)\ub97c \uae30\ub2e4\ub838\ub2e4\uac00 \uc885\ub8cc\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">XREADGROUP GROUP consumers c1 COUNT 1 BLOCK 10000 STREAMS taskq \">\"<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u2462 ACK \uc804\uc1a1<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc98\ub9ac\uac00 \uc644\ub8cc\ub41c \uc544\uc774\ud15c\uc744 \ud45c\uc2dc\ud558\uae30 \uc704\ud574 <code>XACK<\/code> \uba85\ub839\uc5b4\ub85c \ud574\ub2f9 message id\ub97c \uc804\uc1a1\ud558\uba74 \ud574\ub2f9 task\ub294 queue\uc5d0\uc11c \uc0ad\uc81c\ub41c\ub2e4. \uc704\uc758 \uba85\ub839\uc5b4\uc5d0\uc11c message id\ub97c \uc790\ub3d9 \uc0dd\uc131\ud558\ub3c4\ub85d \uc124\uc815\ud574 \ub450\uc5c8\uae30 \ub54c\ubb38\uc5d0 \uc774 \ub584 \ubc18\ud658\ub418\ub294 id\uac12\uc744 \uae30\uc5b5\ud574 \ub450\uc5c8\ub2e4\uac00 \ud30c\ub77c\ubbf8\ud130\ub85c \ub118\uaca8\uc8fc\uc5b4\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">XACK taskq consumers &lt;message_id><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Bash script<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc704\uc758 \uacfc\uc815\ub4e4\uc744 bash script\ub85c \uc791\uc131\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><script src=\"https:\/\/gist.github.com\/8160fd7ce25549f89bdfd39069a37e9a.js\"><\/script><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud604\uc7ac \ucc98\ub9ac \uc0c1\ud0dc \ud45c\uc2dc<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">PEL(Pending Entries List) &#8211; XPENDING<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\uc544\uc9c1 <code>XACK<\/code>\ub97c \ubc1b\uc9c0 \uc54a\ub294 \uc544\uc774\ud15c\ub3c4 \uc77c\ub2e8 \uc5b4\ub290 \ud55c consumer\uac00 \ucc98\ub9ac\ud558\ub824\uace0 queue\uc5d0\uc11c \uac00\uc838\uac00\uba74 \ub2e4\ub978 consumer\ub4e4\uc758 \uc694\uccad\uc5d0 \uc758\ud574 \uc911\ubcf5 \ubc18\ud658\ub418\uc9c0 \uc54a\ub294 \uac83\uc774 \ubcf4\uc7a5\ub418\ub294\ub370, \uc774 \ub355\ubd84\uc5d0 \ub3d9\uc77c\ud55c \uc544\uc774\ud15c\uc774 \uc911\ubcf5\ud574\uc11c \ucc98\ub9ac\ub418\ub294 \uac83\uc744 \ub9c9\uc744 \uc218 \uc788\ub2e4. \uc544\uc9c1 \ucc98\ub9ac\uac00 \uc644\ub8cc\ub418\uc9c0 \uc54a\ub294 \ubaa9\ub85d\ub4e4\uc740 Redis\uac00 PEL(Pending Entreis List)\ub85c \ub530\ub85c \uad00\ub9ac\ud558\uba70 <code>XPENDING<\/code> \uba85\ub839\uc5b4\ub85c \uadf8 \uc0c1\ud0dc\ub97c \ud655\uc778\ud574 \ubcfc \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">redis-cli XPENDING taskq consumers - + 10\n1) 1) \"1782541916776-0\"\n   2) \"c1\"\n   3) (integer) 3541627\n   4) (integer) 1<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">XINFO<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><code>XINFO<\/code>\ub97c \uc774\uc6a9\ud558\uba74 \ud2b9\uc815 stream\uc758 \ud604\uc7ac\uc0c1\ud0dc\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \uc608\ub97c \ub4e4\uc5b4 10\uac1c\uc758 task\ub97c \uc0dd\uc131\ud574\uc11c 3\uac1c\ub9cc \ucc98\ub9ac\ud55c \ud6c4 <code>XINFO<\/code> \uba85\ub839\uc5b4\ub85c <code>taskq<\/code>\uc758 \uc0c1\ud0dc\ub97c \ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \ubcf4\uc5ec\uc900\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">redis-cli XINFO GROUPS taskq\n1)  1) \"name\"\n    2) \"consumers\"\n    3) \"consumers\"\n    4) (integer) 3\n    5) \"pending\"\n    6) (integer) 0\n    7) \"last-delivered-id\"\n    8) \"1782439931183-0\"\n    9) \"entries-read\"\n   10) (integer) 3\n   11) \"lag\"\n   12) (integer) 7<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucd9c\ub825\uc774 \uc880 \ubcf4\uae30\uc5d0 \ubd88\ud3b8\ud55c\ub370, \uc815\ub9ac\ud574 \ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Group\uc758 \uc774\ub984\uc740 'consumers'\uc784\nname                consumers\n\n# 3\uac1c\uc758 'customers'\uac00 \uc9c0\uae08\uae4c\uc9c0 \uba54\uc138\uc9c0\ub97c \uc77d\uc5b4 \uac14\uc74c.\nconsumers           3\n\n# ACK\ub97c \ubabb\ubc1b\uace0 pending \uc911\uc778 \uc544\uc774\ud15c\uc740 \uc5c6\uc74c.\npending             0\n\n# \ub9c8\uc9c0\ub9c9\uc73c\ub85c \uc77d\ud600\uc9c4 \uba54\uc138\uc9c0\uc758 \uc544\uc774\ub514\ub2941782439931183-0.\nlast-delivered-id   1782439931183-0\n\n# 3\uac1c\uc758 \uba54\uc138\uc9c0\uac00 \uc77d\ud600\uc84c\uc74c. \nentries-read        3\n\n# Stream\uc548\uc5d0\ub294 \uc544\uc9c1 7\uac1c\uc758 \uba54\uc138\uc9c0\uac00 \ub0a8\uc544 \uc788\uc74c.\nlag.                7<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Redis stream\uc740 \ub370\uc774\ud130\uac00 \uacc4\uc18d \ucd94\uac00\ub418\ub294 logging\uac19\uc740 \uc0ac\uc6a9 \ucf00\uc774\uc2a4\ub97c \uc5fc\ub450\ud574 \ub450\uace0 \ub3c4\uc785\uc5c8\ub2e4\uace0 \ud55c\ub2e4. \ud558\uc9c0\ub9cc stream \ub0b4\uc5d0 \uc313\uc5ec \uc788\ub294 \uc544\uc774\ud15c \ub4e4 \uc911 ACK\ub97c \ubc1b\uc9c0 \ubabb\ud55c \uc544\uc774\ud15c\ub4e4\uc744 PEL(Pending Entries List)\ub85c \uad00\ub9ac \ud560 \uc218 \uc788\ub2e4 \ubcf4\ub2c8 \ucc98\ub9ac \ub0b4\uc5ed\uc744 \ud30c\uc545\ud558\uac70\ub098 \uc911\ubcf5\ub41c \ucc98\ub9ac\ub97c \ub9c9\ub294\ub370\uc5d0\ub3c4 \uc720\uc6a9\ud558\uac8c \uc0ac\uc6a9\ub420 \uc218 \uc788\ub2e4. Redis\ub294 \ub2e4\uc591\ud55c \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4 API\ub97c \uc9c0\uc6d0\ud558\uc9c0\ub9cc \uc774 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 \uac01 \uba85\ub839\uc5b4\ub4e4\uc758 \ud65c\uc6a9\uc5d0 \uc911\uc810\uc744 \ub450\uc5b4 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[5],"tags":[20,416,456,455],"class_list":["post-4558","post","type-post","status-publish","format-standard","hentry","category-programming","tag-bash","tag-redis","tag-stream","tag-task"],"jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":3967,"url":"https:\/\/litcoder.com\/?p=3967","url_meta":{"origin":4558,"position":0},"title":"Shell drop\uc774 \ub418\uc9c0 \uc54a\uc744 \ub54c \uc6d0\uaca9\uc11c\ubc84 \uc7ac\uc2dc\ub3d9","author":"litcoder","date":"2025\ub144 12\uc6d4 10\uc77c","format":false,"excerpt":"\uc6d0\uaca9 \uc11c\ubc84\uc758 \uc2dc\uc2a4\ud15c \ub178\ub4dc\uac00 \ub9dd\uac00\uc84c\uac70\ub098 \uacfc\ub3c4\ud55c task \uc2e4\ud589\uc73c\ub85c ssh\ub85c \uc811\uadfc\ud560 \ub54c \uc81c\ub300\ub85c shell\uc744 drop\ud558\uc9c0 \ubabb\ud558\ub294 \uacbd\uc6b0\uac00 \uc885\uc885 \uc0dd\uae34\ub2e4. ssh\ub294 \uc6d0\uaca9 \uc11c\ubc84\uc5d0\uc11c \uc2e4\ud589\ud560 \uba85\ub839\uc5b4\ub97c \uc778\uc790\ub85c \ubc1b\uc744 \uc218 \uc788\uc9c0\ub9cc ls\uac19\uc740 \ub2e8\uc21c\ud55c \uba85\ub839\uc5b4\uc640\ub294 \ub2ec\ub9ac reboot \uba85\ub839\uc5b4\ub97c \uc218\ud589\ud558\ub824\uba74 sudo \uad8c\ud55c\uc744 \uc811\uadfc\ud558\uae30 \uc704\ud55c \ube44\ubc00\ubc88\ud638 \uc785\ub825\uc744 \ud544\uc694\ub85c \ud55c\ub2e4. \ube44\ub85d ssh\uac00 \"Secure SHell\"\uc774\ub77c\uace0\ub294 \ud574\ub3c4 \uc77c\ubc18\uc801\uc778 shell\ucc98\ub7fc \uc0c1\ud638\uc791\uc6a9\uc744\u2026","rel":"","context":"&quot;Tools &amp; Tips&quot;\uc5d0\uc11c","block_context":{"text":"Tools &amp; Tips","link":"https:\/\/litcoder.com\/?cat=6"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2025\/12\/sc_ssh_sudo_err.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2025\/12\/sc_ssh_sudo_err.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2025\/12\/sc_ssh_sudo_err.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2025\/12\/sc_ssh_sudo_err.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2025\/12\/sc_ssh_sudo_err.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":908,"url":"https:\/\/litcoder.com\/?p=908","url_meta":{"origin":4558,"position":1},"title":"Repo\uc640 OpenGrok update\ub97c \uc704\ud55c cron\uc6a9 script","author":"litcoder","date":"2013\ub144 11\uc6d4 19\uc77c","format":false,"excerpt":"OpenGrok\uc740 \uc5ec\ub7ec\uba74\uc5d0\uc11c \uc88b\uc740 \uc810\uc774 \ub9ce\uc740 \ub3c4\uad6c\uc774\uc9c0\ub9cc source code\uac00 \ubcc0\uacbd\ub420 \ub54c\ub9c8\ub2e4 \uc624\ub79c\uc2dc\uac04\uc774 \uac78\ub9ac\ub294 indexing\uc744 \ud574\uc57c \ud55c\ub2e4\ub294 \uc810\uc740 \ubd88\ud3b8 \ud55c \uc810 \uc911 \ud558\ub098\uc774\ub2e4. \uc5ec\uae30\uc11c\ub294 cron\uc73c\ub85c \ub3cc\ub9b4 \uc218 \uc788\ub294 \uac04\ub2e8\ud55c shell script\ub97c \uc0ac\uc6a9\ud574\uc11c \ud55c\uac00\ud55c \uc2dc\uac04\uc5d0 source\uac00 \ucd5c\uc2e0\uc73c\ub85c \uc720\uc9c0\ub420 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 \ubc29\ubc95\uc744 \uc124\uba85\ud55c\ub2e4. Cron runnable update script Cron\uc73c\ub85c \ub3d9\uc791\uc2dc\ud0a4\ub294 script\ub97c \uc791\uc131\ud560 \ub54c \uac00\uc7a5\u2026","rel":"","context":"&quot;Programming&quot;\uc5d0\uc11c","block_context":{"text":"Programming","link":"https:\/\/litcoder.com\/?cat=5"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":4324,"url":"https:\/\/litcoder.com\/?p=4324","url_meta":{"origin":4558,"position":2},"title":"OpenProject\uc640 GitHub \uc5f0\ub3d9\ud558\ub294 \ubcf4\ub2e4 \uac04\ub2e8\ud55c \ubc29\ubc95","author":"litcoder","date":"2026\ub144 4\uc6d4 22\uc77c","format":false,"excerpt":"OpenProject\uc640 GitHub\uc758 \uc5f0\ub3d9\uc744 \uc704\ud574 \uc774\uc804\uc758 \ud3ec\uc2a4\ud305\uc5d0\uc11c \ub2e4\ub8ec \ubc29\ubc95\uc740 OpenProject\uc758 task ticket\uc5d0\uc788\ub294 Git snippets\uc758 \ub0b4\uc6a9\uc744 \ubcf5\uc0ac\ud574\uc11c \ud130\ubbf8\ub110\uc5d0 \ubd99\uc5ec\ub123\ub294 \uac83\uc774\uc5c8\ub294\ub370, \uc774 \ub54c \ub9cc\ub4e4\uc5b4\uc9c0\ub294 branch\uc758 \uc774\ub984\uc740 OpenProject ticket\uc758 \uc81c\ubaa9\uc5d0 \uae30\ubc18\ud55c \uac83\uc774\uc5b4\uc11c \uc790\uce6b\ud558\uba74 branch\uc758 \uc774\ub984\uc774 \uc9c0\ub098\uce58\uac8c \uae38\uc5b4\uc9c0\ub294 \ub370\ub2e4\uac00, \uc0ac\uc804\uc5d0 \uc815\ud574\ub454 \ud300\ub0b4\uc758 branch naming rule\uacfc \ucda9\ub3cc\ud558\uae30 \uc27d\ub2e4. \ub2e4\ud589\ud788\ub3c4 OpenProject\uc758 GitHub \uc790\ub3d9 \uc5f0\ub3d9\uae30\ub2a5\uc740 branch naming\uba85\uc774 \uc544\ub2cc\u2026","rel":"","context":"&quot;Tools &amp; Tips&quot;\uc5d0\uc11c","block_context":{"text":"Tools &amp; Tips","link":"https:\/\/litcoder.com\/?cat=6"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/04\/op_commit_example.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/04\/op_commit_example.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/04\/op_commit_example.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":3229,"url":"https:\/\/litcoder.com\/?p=3229","url_meta":{"origin":4558,"position":3},"title":"Multi-container app\uc758 Bad Gateway(502) \ubb38\uc81c \ub514\ubc84\uae45","author":"litcoder","date":"2023\ub144 6\uc6d4 4\uc77c","format":false,"excerpt":"Intel Training and Learning Suite(TLS)\ub294 \ucc98\uc74c\uc73c\ub85c \uacbd\ud5d8\ud574\ubcf4\ub294 multi-container application\uc774\ub2e4. \uc911\uac04\uc5d0 native\uac1c\ubc1c\uc744 \uc704\ud55c \ud658\uacbd \uc124\uc815\uc744 \ub07c\uc6cc \ub123\uc5b4 \ubcf4\ub824\uace0 \uc774\uac83 \uc800\uac83 \uc2dc\ub3c4\ud558\ub294 \uc911\uc5d0 web interface\ub97c \ub2f4\ub2f9\ud558\ub294 tls_proxy\ub77c\ub294 docker\uac00 Bad Gateway\ub97c \ub744\uc6b0\uba74\uc11c \ubb38\uc81c\uac00 \uc0dd\uacbc\ub2e4. \ub514\ubc84\uae45 \ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uc0ac\uc6a9\ud574 \ubcf8 docker-compose\uba85\ub839\uc5b4 \ub4e4\uc758 \uc4f0\uc784\uc0c8\uac00 \uc720\uc6a9\ud560 \uac83 \uac19\uc544\uc11c \uae30\ub85d\uc73c\ub85c \ub0a8\uaca8 \ub454\ub2e4. Port number\uc640 docker\ucc3e\uae30: docker-compose ps\u2026","rel":"","context":"&quot;Linux&quot;\uc5d0\uc11c","block_context":{"text":"Linux","link":"https:\/\/litcoder.com\/?cat=4"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3939,"url":"https:\/\/litcoder.com\/?p=3939","url_meta":{"origin":4558,"position":4},"title":"gRPC Streaming\uc73c\ub85c \uc0c1\ud0dc \uc804\uc1a1 \ubc1b\uae30 \uc608\uc81c","author":"litcoder","date":"2026\ub144 7\uc6d4 29\uc77c","format":false,"excerpt":"gRPC\uc5d0\uc11c Observer pattern\uc744 \uad6c\ud604\ud558\ub294 \uc608\uc81c\ub97c \uace0\ubbfc\ud588\ub358 \uc801\uc774 \uc788\uc5c8\ub294\ub370(gRPC\ub97c \uc774\uc6a9\ud55c Observer Pattern) \uc54c\uace0\ubcf4\ub2c8 gRPC\uc5d0\uc11c\ub294 ReadReactor \/ WriteReactor \ubcf4\ub2e4 \uac04\ub2e8\ud558\uac8c object\uc758 \uc0c1\ud0dc \ubcc0\uacbd\uc744 \uac10\uc9c0\ud560 \uc218 \uc788\ub294 \uba54\ucee4\ub2c8\uc998\uc744 \uc81c\uacf5\ud558\uace0 \uc788\uc5c8\ub2e4. gRPC\ub97c \uc774\uc6a9\ud55c Observer pattern \uad6c\ud604 \uc608\uc81c\ub97c \ucc3e\uae30 \uc5b4\ub824\uc6e0\ub358 \uc774\uc720\uac00 \uc5b4\uca4c\uba74 \uadf8\ub7f0 \ubcf5\uc7a1\ud55c \ud328\ud134 \uc5c6\uc774\ub3c4 \uad6c\ud604\uc774 \uac00\ub2a5\ud558\uae30 \ub54c\ubb38\uc774\uc5c8\ub294\uc9c0\ub3c4 \ubaa8\ub974\uaca0\ub2e4. \uc774 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 Stream\uc744 \ud1b5\ud574 \ubcc0\uacbd\ub418\ub294\u2026","rel":"","context":"&quot;Programming&quot;\uc5d0\uc11c","block_context":{"text":"Programming","link":"https:\/\/litcoder.com\/?cat=5"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/07\/Screenshot-2026-07-10-at-6.34.33-PM.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/07\/Screenshot-2026-07-10-at-6.34.33-PM.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/07\/Screenshot-2026-07-10-at-6.34.33-PM.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/07\/Screenshot-2026-07-10-at-6.34.33-PM.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":4189,"url":"https:\/\/litcoder.com\/?p=4189","url_meta":{"origin":4558,"position":5},"title":"Lightsail \uc11c\ubc84\uac00 \uc790\uafb8 \uc8fd\uc5b4\uc694","author":"litcoder","date":"2026\ub144 3\uc6d4 18\uc77c","format":false,"excerpt":"Jetpack\uc774 \uc694\uc998\ucc98\ub7fc \ub9ce\uc774 \ub9d0\uc744 \uac74 \uc801\uc774 \uc788\uc5c8\ub358\uac00? \ucd5c\uadfc\uc5d0 Bitnami\uc5d0\uc11c Amazon Linux 2023\uc73c\ub85c \uc774\uc0ac\ud558\uba74\uc11c Lightsail instance\ub97c \ud55c \ub2e8\uacc4 \ube44\uc2fc \uac83\uc73c\ub85c \uc62c\ub9ac\uace0 \ub098\uc11c\ubd80\ud130 \uc6f9\uc0ac\uc774\ud2b8\uac00 \ub2e4\uc6b4\ub418\uc5c8\ub2e4\ub294 Jetpack\uc758 \ub178\ud2f0\uac00 \uacc4\uc18d \ub72c\ub2e4. \ub354 \ube44\uc2f8\uba74 \ub354 \uc798\ub3cc\uc544\uc57c \ub418\ub294 \uac83 \uc544\ub2cc\uac00? \uc774\ub7f0 \ub178\ud2f0\ub97c \ubc1b\uace0\ub098\uc11c \ud655\uc778\ud574 \ubcf4\uba74 \ube14\ub85c\uadf8\uac00 \uc811\uc18d\ub418\uc9c0 \uc54a\uc744 \ubfd0\ub9cc \uc544\ub2c8\ub77c SSH \uc870\ucc28\ub3c4 \ub728\uc9c0 \uc54a\ub294 \uc0c1\ud0dc\uac00 \ub418\uc5b4\u2026","rel":"","context":"&quot;Linux&quot;\uc5d0\uc11c","block_context":{"text":"Linux","link":"https:\/\/litcoder.com\/?cat=4"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/02\/xmlrpc_attac_log.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/02\/xmlrpc_attac_log.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/02\/xmlrpc_attac_log.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/02\/xmlrpc_attac_log.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/4558","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4558"}],"version-history":[{"count":24,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/4558\/revisions"}],"predecessor-version":[{"id":4588,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/4558\/revisions\/4588"}],"wp:attachment":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4558"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4558"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4558"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}