[{"data":1,"prerenderedAt":2050},["ShallowReactive",2],{"node-red-\u002Fnode-red\u002Fdatabase\u002Fredis":3},{"id":4,"title":5,"body":6,"description":2043,"extension":2044,"meta":2045,"navigation":780,"path":2046,"seo":2047,"stem":2048,"__hash__":2049},"nodeRed\u002Fnode-red\u002Fdatabase\u002Fredis.md","Using Redis with Node-RED (2026 Updated)",{"type":7,"value":8,"toc":2016},"minimark",[9,17,21,24,29,34,37,63,67,70,127,132,196,200,206,238,242,245,249,326,329,333,336,381,384,388,391,395,424,472,516,520,573,576,592,596,599,603,606,655,659,662,713,716,720,723,727,730,742,823,845,907,913,920,1104,1117,1131,1135,1138,1142,1182,1185,1189,1192,1203,1629,1643,1646,1650,1653,1663,1981,1993,1996,2004,2007,2012],[10,11,13],"h1",{"id":12},"",[14,15],"binding",{"value":16},"meta.title",[18,19,20],"p",{},"Redis is a powerful in-memory data structure store that can be used as a database, cache, message broker, and streaming engine. When combined with Node-RED, Redis provides a fast and efficient way to store and retrieve data, manage session states, implement pub\u002Fsub messaging patterns, and share data across multiple Node-RED instances.",[18,22,23],{},"This documentation will walk you through integrating Redis with Node-RED, from basic setup to advanced use cases.",[25,26,28],"h2",{"id":27},"getting-started","Getting Started",[30,31,33],"h3",{"id":32},"prerequisites","Prerequisites",[18,35,36],{},"Before you begin, make sure you have the following:",[38,39,40,52,60],"ul",{},[41,42,43,44,51],"li",{},"Ensure you have a running Node-RED instance. The quickest and easiest way to have a manageable and scalable Node-RED instance is by ",[45,46,50],"a",{"href":47,"rel":48},"https:\u002F\u002Fapp.flowfuse.com\u002F",[49],"nofollow","signing up on FlowFuse"," and creating an instance.",[41,53,54,55,59],{},"Install the ",[56,57,58],"code",{},"node-red-contrib-redis"," package using the Palette Manager.",[41,61,62],{},"Make sure you have your Redis server details ready.",[30,64,66],{"id":65},"configuring-the-redis-connection","Configuring the Redis Connection",[18,68,69],{},"Before using Redis nodes, you need to configure the connection:",[71,72,73,81,84,87,114,121],"ol",{},[41,74,75,76,80],{},"Drag any ",[77,78,79],"strong",{},"redis"," node onto your canvas",[41,82,83],{},"Double-click the node to open its configuration",[41,85,86],{},"Click the pencil icon next to \"Server\" to add a new Redis server configuration",[41,88,89,90],{},"Fill in your Redis server details:\n",[38,91,92,98,108],{},[41,93,94,97],{},[77,95,96],{},"Name",": A friendly name for this connection",[41,99,100,103,104,107],{},[77,101,102],{},"Connection Options",": Can be a connection string (e.g., ",[56,105,106],{},"redis:\u002F\u002Flocalhost:6379",") or a JSON object with IORedis options",[41,109,110,113],{},[77,111,112],{},"Cluster",": Enable if using Redis Cluster",[41,115,116,117,120],{},"Click ",[77,118,119],{},"Add"," to save the configuration",[41,122,116,123,126],{},[77,124,125],{},"Done"," to close the node configuration",[18,128,129],{},[77,130,131],{},"Example Connection Options (JSON format):",[133,134,138],"pre",{"className":135,"code":136,"language":137,"meta":12,"style":12},"language-json shiki shiki-themes github-light github-dark","{\n  \"host\": \"localhost\",\n  \"port\": 6379,\n  \"db\": 0\n}\n","json",[56,139,140,149,166,179,190],{"__ignoreMap":12},[141,142,145],"span",{"class":143,"line":144},"line",1,[141,146,148],{"class":147},"sVt8B","{\n",[141,150,152,156,159,163],{"class":143,"line":151},2,[141,153,155],{"class":154},"sj4cs","  \"host\"",[141,157,158],{"class":147},": ",[141,160,162],{"class":161},"sZZnC","\"localhost\"",[141,164,165],{"class":147},",\n",[141,167,169,172,174,177],{"class":143,"line":168},3,[141,170,171],{"class":154},"  \"port\"",[141,173,158],{"class":147},[141,175,176],{"class":154},"6379",[141,178,165],{"class":147},[141,180,182,185,187],{"class":143,"line":181},4,[141,183,184],{"class":154},"  \"db\"",[141,186,158],{"class":147},[141,188,189],{"class":154},"0\n",[141,191,193],{"class":143,"line":192},5,[141,194,195],{"class":147},"}\n",[30,197,199],{"id":198},"understanding-the-nodes-in-the-package","Understanding the Nodes in the Package",[18,201,202,203,205],{},"The ",[56,204,58],{}," package provides five specialized nodes:",[38,207,208,214,220,226,232],{},[41,209,210,213],{},[77,211,212],{},"redis-command",": Executes any Redis command like SET, GET, or hash operations",[41,215,216,219],{},[77,217,218],{},"redis-in",": Subscribes to pub\u002Fsub channels or blocks on list operations for building queue consumers",[41,221,222,225],{},[77,223,224],{},"redis-out",": Publishes messages or pushes to lists",[41,227,228,231],{},[77,229,230],{},"redis-lua-script",": Runs Lua scripts on the server for atomic operations",[41,233,234,237],{},[77,235,236],{},"redis-instance",": Injects a Redis client into your context for direct API access in function nodes",[25,239,241],{"id":240},"your-first-redis-flow","Your First Redis Flow",[18,243,244],{},"Let's create a simple flow that stores and retrieves data from Redis.",[30,246,248],{"id":247},"storing-data","Storing Data",[71,250,251,266,272,308,315,318,323],{},[41,252,253,254,257,258,261,262,265],{},"Drag an ",[77,255,256],{},"inject"," node onto the canvas and clear the Inject node so it has no ",[56,259,260],{},"msg.payload"," or ",[56,263,264],{},"msg.topic"," set.",[41,267,268,269,271],{},"Drag a ",[77,270,212],{}," node next to it",[41,273,274,275],{},"Double-click the redis-command node and configure:\n",[38,276,277,285,291,299],{},[41,278,279,158,282],{},[77,280,281],{},"Command",[56,283,284],{},"set",[41,286,287,290],{},[77,288,289],{},"Server",": Your Redis configuration",[41,292,293,158,296],{},[77,294,295],{},"Topic\u002FKey",[56,297,298],{},"mykey",[41,300,301,158,304,307],{},[77,302,303],{},"Params",[56,305,306],{},"[\"Hello from Node-RED\"]"," (as a JSON array)",[41,309,310,311,314],{},"Add a ",[77,312,313],{},"debug"," node and connect it to the output of the redis-command node",[41,316,317],{},"Connect the inject node to the redis-command node, then connect the redis-command node to the debug node",[41,319,116,320],{},[77,321,322],{},"Deploy",[41,324,325],{},"Click the inject button",[18,327,328],{},"You should see \"OK\" in the debug panel, which means your data has been successfully stored in Redis!",[30,330,332],{"id":331},"retrieving-data","Retrieving Data",[18,334,335],{},"Now let's retrieve the data we just stored:",[71,337,338,344,368,373,375,379],{},[41,339,340,341,343],{},"Add another cleared ",[77,342,256],{}," node to the canvas",[41,345,310,346,348,349],{},[77,347,212],{}," node and configure:\n",[38,350,351,358,362],{},[41,352,353,158,355],{},[77,354,281],{},[56,356,357],{},"get",[41,359,360,290],{},[77,361,289],{},[41,363,364,158,366],{},[77,365,295],{},[56,367,298],{},[41,369,310,370,372],{},[77,371,313],{}," node",[41,374,317],{},[41,376,116,377],{},[77,378,322],{},[41,380,325],{},[18,382,383],{},"You should now see \"Hello from Node-RED\" in the debug panel - the value you stored earlier!",[25,385,387],{"id":386},"working-with-json-data","Working with JSON Data",[18,389,390],{},"Redis stores values as strings, so you need to convert JSON objects before storing them. You’ll also learn how to send the topic and value dynamically.",[30,392,394],{"id":393},"storing-json","Storing JSON",[71,396,397,402],{},[41,398,253,399,401],{},[77,400,256],{}," node onto the canvas.",[41,403,268,404,407,408],{},[77,405,406],{},"change"," node onto the canvas and configure it to:",[38,409,410,419],{},[41,411,412,413,415,416],{},"Set ",[56,414,264],{}," to ",[56,417,418],{},"sensor:data",[41,420,412,421,423],{},[56,422,260],{}," to the following JSONata expression:",[133,425,427],{"className":135,"code":426,"language":137,"meta":12,"style":12},"{\n\"temperature\": 22.5,\n\"humidity\": 65,\n\"timestamp\": $now()\n}\n",[56,428,429,433,445,457,468],{"__ignoreMap":12},[141,430,431],{"class":143,"line":144},[141,432,148],{"class":147},[141,434,435,438,440,443],{"class":143,"line":151},[141,436,437],{"class":154},"\"temperature\"",[141,439,158],{"class":147},[141,441,442],{"class":154},"22.5",[141,444,165],{"class":147},[141,446,447,450,452,455],{"class":143,"line":168},[141,448,449],{"class":154},"\"humidity\"",[141,451,158],{"class":147},[141,453,454],{"class":154},"65",[141,456,165],{"class":147},[141,458,459,462,464],{"class":143,"line":181},[141,460,461],{"class":154},"\"timestamp\"",[141,463,158],{"class":147},[141,465,467],{"class":466},"s7hpK","$now()\n",[141,469,470],{"class":143,"line":192},[141,471,195],{"class":147},[71,473,474,484,492,511],{"start":168},[41,475,268,476,479,480,483],{},[77,477,478],{},"JSON"," node, This will ",[77,481,482],{},"stringify"," the JSON object so it can be stored in Redis.",[41,485,268,486,488,489,491],{},[77,487,212],{}," node and set the command to ",[56,490,284],{},".",[41,493,494,495,497,498,500,501,497,503,505,506,497,508,510],{},"Connect the ",[77,496,256],{}," node to the ",[77,499,406],{}," node, then the ",[77,502,406],{},[77,504,478],{}," node, and finally the ",[77,507,478],{},[77,509,212],{}," node.",[41,512,116,513,515],{},[77,514,322],{},", then click the inject button to store the JSON in Redis.",[30,517,519],{"id":518},"reading-json-back","Reading JSON Back",[71,521,522,527,549,556,561,565,568],{},[41,523,253,524,526],{},[77,525,256],{}," node onto the canvas",[41,528,268,529,531,532],{},[77,530,406],{}," node and configure it to:\n",[38,533,534,541],{},[41,535,412,536,538,539],{},[56,537,264],{}," to string ",[56,540,418],{},[41,542,412,543,545,546],{},[56,544,260],{}," to JSON ",[56,547,548],{},"[]",[41,550,268,551,553,554],{},[77,552,212],{}," node and set command to ",[56,555,357],{},[41,557,268,558,560],{},[77,559,137],{}," node (this converts between JSON string and object)",[41,562,268,563,372],{},[77,564,313],{},[41,566,567],{},"Connect the inject node to the change node, then connect the change node to the redis-command node, then connect the redis-command node to the json node, and finally connect the json node to the debug node",[41,569,116,570,572],{},[77,571,322],{}," and then click the inject button",[18,574,575],{},"Check the debug panel. You should see your JSON object with temperature, humidity, and timestamp.",[18,577,578,579,582,583,586,587,491],{},"If you want to explore more Redis commands beyond ",[56,580,581],{},"SET"," and ",[56,584,585],{},"GET",", check the official ",[45,588,591],{"href":589,"rel":590},"https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fcommands\u002F",[49],"Redis command reference",[25,593,595],{"id":594},"pubsub-messaging","Pub\u002FSub Messaging",[18,597,598],{},"Redis pub\u002Fsub allows different Node-RED flows or instances to communicate in real-time. One flow publishes a message, and any subscribed flows receive it instantly.",[30,600,602],{"id":601},"publishing-temperature-alerts","Publishing Temperature Alerts",[18,604,605],{},"Let's create a flow that publishes alerts when temperature exceeds a threshold:",[71,607,608,612,622,648,651],{},[41,609,253,610,526],{},[77,611,256],{},[41,613,268,614,616,617,538,619],{},[77,615,406],{}," node and set ",[56,618,260],{},[56,620,621],{},"\"ALERT: Temperature critical in Zone A: 85°C - Equipment shutdown initiated\"",[41,623,268,624,348,626],{},[77,625,224],{},[38,627,628,636,644],{},[41,629,630,158,633],{},[77,631,632],{},"Method",[56,634,635],{},"PUBLISH",[41,637,638,158,641],{},[77,639,640],{},"Topic",[56,642,643],{},"alerts:temperature",[41,645,646,290],{},[77,647,289],{},[41,649,650],{},"Connect the inject node to the change node, then connect the change node to the redis-out node",[41,652,116,653],{},[77,654,322],{},[30,656,658],{"id":657},"subscribing-to-alert-messages","Subscribing to Alert Messages",[18,660,661],{},"Now create another flow that listens for these alerts (this could be on the same or a different Node-RED instance monitoring the facility):",[71,663,664,699,703,709],{},[41,665,268,666,668,669],{},[77,667,218],{}," node onto the canvas and configure it:",[38,670,671,678,684,694],{},[41,672,673,158,675],{},[77,674,632],{},[56,676,677],{},"SUBSCRIBE",[41,679,680,158,682],{},[77,681,640],{},[56,683,643],{},[41,685,686,158,689,693],{},[77,687,688],{},"Timeout",[690,691,692],"em",{},"(optional)"," How long the node should listen for messages before automatically stopping.",[41,695,696,698],{},[77,697,289],{},": Your Redis connection",[41,700,268,701,372],{},[77,702,313],{},[41,704,494,705,497,707,372],{},[77,706,218],{},[77,708,313],{},[41,710,116,711],{},[77,712,322],{},[18,714,715],{},"When you click the Inject button in your publisher flow, the alert message will appear in the Debug panel. The subscriber will automatically receive all alerts published to the channel until the timeout (if configured) expires.",[25,717,719],{"id":718},"using-lua-scripts-for-atomic-operations","Using Lua Scripts for Atomic Operations",[18,721,722],{},"Redis Lua scripts allow you to execute multiple Redis operations atomically on the server side. This ensures data consistency and reduces network overhead by bundling multiple commands into a single server-side operation.",[30,724,726],{"id":725},"atomic-counter-with-rollback","Atomic Counter with Rollback",[18,728,729],{},"Let's create an inventory system that atomically checks stock and decrements it only if available:",[71,731,732,736],{},[41,733,253,734,526],{},[77,735,256],{},[41,737,268,738,741],{},[77,739,740],{},"function"," node to prepare the script arguments:",[133,743,747],{"className":744,"code":745,"language":746,"meta":12,"style":12},"language-javascript shiki shiki-themes github-light github-dark","msg.productId = \"inventory:product:SKU-12345\";\nmsg.quantityRequested = 3;\n\nmsg.payload = [\n    msg.productId,  \n    msg.quantityRequested\n];\n\nreturn msg;\n","javascript",[56,748,749,764,776,782,792,797,803,809,814],{"__ignoreMap":12},[141,750,751,754,758,761],{"class":143,"line":144},[141,752,753],{"class":147},"msg.productId ",[141,755,757],{"class":756},"szBVR","=",[141,759,760],{"class":161}," \"inventory:product:SKU-12345\"",[141,762,763],{"class":147},";\n",[141,765,766,769,771,774],{"class":143,"line":151},[141,767,768],{"class":147},"msg.quantityRequested ",[141,770,757],{"class":756},[141,772,773],{"class":154}," 3",[141,775,763],{"class":147},[141,777,778],{"class":143,"line":168},[141,779,781],{"emptyLinePlaceholder":780},true,"\n",[141,783,784,787,789],{"class":143,"line":181},[141,785,786],{"class":147},"msg.payload ",[141,788,757],{"class":756},[141,790,791],{"class":147}," [\n",[141,793,794],{"class":143,"line":192},[141,795,796],{"class":147},"    msg.productId,  \n",[141,798,800],{"class":143,"line":799},6,[141,801,802],{"class":147},"    msg.quantityRequested\n",[141,804,806],{"class":143,"line":805},7,[141,807,808],{"class":147},"];\n",[141,810,812],{"class":143,"line":811},8,[141,813,781],{"emptyLinePlaceholder":780},[141,815,817,820],{"class":143,"line":816},9,[141,818,819],{"class":756},"return",[141,821,822],{"class":147}," msg;\n",[71,824,825],{"start":168},[41,826,268,827,348,829],{},[77,828,230],{},[38,830,831,839],{},[41,832,833,158,836],{},[77,834,835],{},"Keys",[56,837,838],{},"1",[41,840,841,844],{},[77,842,843],{},"Script",":",[133,846,850],{"className":847,"code":848,"language":849,"meta":12,"style":12},"language-lua shiki shiki-themes github-light github-dark","local key = KEYS[1]\nlocal requested = tonumber(ARGV[1])\n\nlocal current = tonumber(redis.call('GET', key) or \"0\")\n\nif current >= requested then\n    redis.call('DECRBY', key, requested)\n    return {1, current - requested}\nelse\n    return {0, current}\nend\n","lua",[56,851,852,857,862,866,871,875,880,885,890,895,901],{"__ignoreMap":12},[141,853,854],{"class":143,"line":144},[141,855,856],{},"local key = KEYS[1]\n",[141,858,859],{"class":143,"line":151},[141,860,861],{},"local requested = tonumber(ARGV[1])\n",[141,863,864],{"class":143,"line":168},[141,865,781],{"emptyLinePlaceholder":780},[141,867,868],{"class":143,"line":181},[141,869,870],{},"local current = tonumber(redis.call('GET', key) or \"0\")\n",[141,872,873],{"class":143,"line":192},[141,874,781],{"emptyLinePlaceholder":780},[141,876,877],{"class":143,"line":799},[141,878,879],{},"if current >= requested then\n",[141,881,882],{"class":143,"line":805},[141,883,884],{},"    redis.call('DECRBY', key, requested)\n",[141,886,887],{"class":143,"line":811},[141,888,889],{},"    return {1, current - requested}\n",[141,891,892],{"class":143,"line":816},[141,893,894],{},"else\n",[141,896,898],{"class":143,"line":897},10,[141,899,900],{},"    return {0, current}\n",[141,902,904],{"class":143,"line":903},11,[141,905,906],{},"end\n",[38,908,909],{},[41,910,911,290],{},[77,912,289],{},[71,914,915],{"start":181},[41,916,268,917,919],{},[77,918,740],{}," node to process the result:",[133,921,923],{"className":744,"code":922,"language":746,"meta":12,"style":12},"const result = msg.payload;\nconst success = result[0];\nconst remaining = result[1];\n\nif (success === 1) {\n    msg.payload = {\n        status: \"success\",\n        message: `Order processed. Remaining stock: ${remaining}`,\n        remaining: remaining\n    };\n} else {\n    msg.payload = {\n        status: \"failed\",\n        message: `Insufficient stock. Available: ${remaining}`,\n        available: remaining\n    };\n}\nreturn msg;\n",[56,924,925,939,956,971,975,992,1002,1012,1028,1033,1038,1048,1057,1067,1081,1087,1092,1097],{"__ignoreMap":12},[141,926,927,930,933,936],{"class":143,"line":144},[141,928,929],{"class":756},"const",[141,931,932],{"class":154}," result",[141,934,935],{"class":756}," =",[141,937,938],{"class":147}," msg.payload;\n",[141,940,941,943,946,948,951,954],{"class":143,"line":151},[141,942,929],{"class":756},[141,944,945],{"class":154}," success",[141,947,935],{"class":756},[141,949,950],{"class":147}," result[",[141,952,953],{"class":154},"0",[141,955,808],{"class":147},[141,957,958,960,963,965,967,969],{"class":143,"line":168},[141,959,929],{"class":756},[141,961,962],{"class":154}," remaining",[141,964,935],{"class":756},[141,966,950],{"class":147},[141,968,838],{"class":154},[141,970,808],{"class":147},[141,972,973],{"class":143,"line":181},[141,974,781],{"emptyLinePlaceholder":780},[141,976,977,980,983,986,989],{"class":143,"line":192},[141,978,979],{"class":756},"if",[141,981,982],{"class":147}," (success ",[141,984,985],{"class":756},"===",[141,987,988],{"class":154}," 1",[141,990,991],{"class":147},") {\n",[141,993,994,997,999],{"class":143,"line":799},[141,995,996],{"class":147},"    msg.payload ",[141,998,757],{"class":756},[141,1000,1001],{"class":147}," {\n",[141,1003,1004,1007,1010],{"class":143,"line":805},[141,1005,1006],{"class":147},"        status: ",[141,1008,1009],{"class":161},"\"success\"",[141,1011,165],{"class":147},[141,1013,1014,1017,1020,1023,1026],{"class":143,"line":811},[141,1015,1016],{"class":147},"        message: ",[141,1018,1019],{"class":161},"`Order processed. Remaining stock: ${",[141,1021,1022],{"class":147},"remaining",[141,1024,1025],{"class":161},"}`",[141,1027,165],{"class":147},[141,1029,1030],{"class":143,"line":816},[141,1031,1032],{"class":147},"        remaining: remaining\n",[141,1034,1035],{"class":143,"line":897},[141,1036,1037],{"class":147},"    };\n",[141,1039,1040,1043,1046],{"class":143,"line":903},[141,1041,1042],{"class":147},"} ",[141,1044,1045],{"class":756},"else",[141,1047,1001],{"class":147},[141,1049,1051,1053,1055],{"class":143,"line":1050},12,[141,1052,996],{"class":147},[141,1054,757],{"class":756},[141,1056,1001],{"class":147},[141,1058,1060,1062,1065],{"class":143,"line":1059},13,[141,1061,1006],{"class":147},[141,1063,1064],{"class":161},"\"failed\"",[141,1066,165],{"class":147},[141,1068,1070,1072,1075,1077,1079],{"class":143,"line":1069},14,[141,1071,1016],{"class":147},[141,1073,1074],{"class":161},"`Insufficient stock. Available: ${",[141,1076,1022],{"class":147},[141,1078,1025],{"class":161},[141,1080,165],{"class":147},[141,1082,1084],{"class":143,"line":1083},15,[141,1085,1086],{"class":147},"        available: remaining\n",[141,1088,1090],{"class":143,"line":1089},16,[141,1091,1037],{"class":147},[141,1093,1095],{"class":143,"line":1094},17,[141,1096,195],{"class":147},[141,1098,1100,1102],{"class":143,"line":1099},18,[141,1101,819],{"class":756},[141,1103,822],{"class":147},[71,1105,1106,1110,1113],{"start":192},[41,1107,268,1108,372],{},[77,1109,313],{},[41,1111,1112],{},"Connect the inject node to the first function node, then to the redis-lua-script node, then to the second function node, and finally to the debug node",[41,1114,116,1115],{},[77,1116,322],{},[18,1118,1119,1120,1122,1123,1126,1127,1130],{},"Before testing, set the initial inventory using a redis-command node: Command = ",[56,1121,581],{},", Topic\u002FKey = ",[56,1124,1125],{},"inventory:product:SKU-12345",", Params = ",[56,1128,1129],{},"10",". Then trigger the Inject node to initialize the value and process orders atomically.",[25,1132,1134],{"id":1133},"direct-redis-client-access-with-redis-instance","Direct Redis Client Access with redis-instance",[18,1136,1137],{},"The redis-instance node provides direct access to the IORedis client API in function nodes. This is useful for advanced operations, custom commands, or when you need programmatic control over Redis operations.",[30,1139,1141],{"id":1140},"setting-up-redis-instance-in-context","Setting Up Redis Instance in Context",[71,1143,1144,1178],{},[41,1145,268,1146,1148,1149],{},[77,1147,236],{}," node onto the canvas and configure:\n",[38,1150,1151,1157,1161,1169],{},[41,1152,1153,158,1155],{},[77,1154,96],{},[56,1156,79],{},[41,1158,1159,290],{},[77,1160,289],{},[41,1162,1163,1165,1166,1168],{},[77,1164,640],{},": Enter a topic name to identify the Redis instance in the chosen context (e.g., ",[56,1167,79],{},"). This is the name you will use in function nodes to access the client.",[41,1170,1171,158,1174,1177],{},[77,1172,1173],{},"Context",[56,1175,1176],{},"flow"," (makes it available to all nodes in the flow)",[41,1179,116,1180],{},[77,1181,322],{},[18,1183,1184],{},"The Redis client is now available in the flow context for use in function nodes.",[30,1186,1188],{"id":1187},"advanced-pipeline-operations","Advanced Pipeline Operations",[18,1190,1191],{},"Pipelines allow you to send multiple commands to Redis in a single network round trip, significantly improving performance for batch operations:",[71,1193,1194,1198],{},[41,1195,253,1196,526],{},[77,1197,256],{},[41,1199,268,1200,1202],{},[77,1201,740],{}," node with this code:",[133,1204,1206],{"className":744,"code":1205,"language":746,"meta":12,"style":12},"const redis = flow.get('redis'); \u002F\u002F Replace 'redis' with your topic if different\n\n\u002F\u002F Create a pipeline\nconst pipeline = redis.pipeline();\n\n\u002F\u002F Add multiple sensor readings in one batch\nconst sensors = [\n    { id: 'temp-01', value: 23.5, unit: 'C' },\n    { id: 'temp-02', value: 24.1, unit: 'C' },\n    { id: 'humidity-01', value: 65, unit: '%' },\n    { id: 'pressure-01', value: 1013, unit: 'hPa' }\n];\n\nsensors.forEach(sensor => {\n    const key = `sensor:${sensor.id}:latest`;\n    const data = JSON.stringify({\n        value: sensor.value,\n        unit: sensor.unit,\n        timestamp: Date.now()\n    });\n    pipeline.set(key, data, 'EX', 3600); \u002F\u002F Expire in 1 hour\n});\n\n\u002F\u002F Execute all commands at once\npipeline.exec((err, results) => {\n    if (err) {\n        node.error(err, msg);\n        return;\n    }\n    \n    msg.payload = {\n        message: `Stored ${results.length} sensor readings`,\n        results: results\n    };\n    node.send(msg);\n});\n",[56,1207,1208,1236,1240,1245,1263,1267,1272,1283,1306,1324,1342,1362,1366,1370,1389,1414,1433,1438,1443,1455,1461,1486,1492,1497,1503,1531,1540,1552,1560,1566,1572,1581,1601,1607,1612,1624],{"__ignoreMap":12},[141,1209,1210,1212,1215,1217,1220,1223,1226,1229,1232],{"class":143,"line":144},[141,1211,929],{"class":756},[141,1213,1214],{"class":154}," redis",[141,1216,935],{"class":756},[141,1218,1219],{"class":147}," flow.",[141,1221,357],{"class":1222},"sScJk",[141,1224,1225],{"class":147},"(",[141,1227,1228],{"class":161},"'redis'",[141,1230,1231],{"class":147},"); ",[141,1233,1235],{"class":1234},"sJ8bj","\u002F\u002F Replace 'redis' with your topic if different\n",[141,1237,1238],{"class":143,"line":151},[141,1239,781],{"emptyLinePlaceholder":780},[141,1241,1242],{"class":143,"line":168},[141,1243,1244],{"class":1234},"\u002F\u002F Create a pipeline\n",[141,1246,1247,1249,1252,1254,1257,1260],{"class":143,"line":181},[141,1248,929],{"class":756},[141,1250,1251],{"class":154}," pipeline",[141,1253,935],{"class":756},[141,1255,1256],{"class":147}," redis.",[141,1258,1259],{"class":1222},"pipeline",[141,1261,1262],{"class":147},"();\n",[141,1264,1265],{"class":143,"line":192},[141,1266,781],{"emptyLinePlaceholder":780},[141,1268,1269],{"class":143,"line":799},[141,1270,1271],{"class":1234},"\u002F\u002F Add multiple sensor readings in one batch\n",[141,1273,1274,1276,1279,1281],{"class":143,"line":805},[141,1275,929],{"class":756},[141,1277,1278],{"class":154}," sensors",[141,1280,935],{"class":756},[141,1282,791],{"class":147},[141,1284,1285,1288,1291,1294,1297,1300,1303],{"class":143,"line":811},[141,1286,1287],{"class":147},"    { id: ",[141,1289,1290],{"class":161},"'temp-01'",[141,1292,1293],{"class":147},", value: ",[141,1295,1296],{"class":154},"23.5",[141,1298,1299],{"class":147},", unit: ",[141,1301,1302],{"class":161},"'C'",[141,1304,1305],{"class":147}," },\n",[141,1307,1308,1310,1313,1315,1318,1320,1322],{"class":143,"line":816},[141,1309,1287],{"class":147},[141,1311,1312],{"class":161},"'temp-02'",[141,1314,1293],{"class":147},[141,1316,1317],{"class":154},"24.1",[141,1319,1299],{"class":147},[141,1321,1302],{"class":161},[141,1323,1305],{"class":147},[141,1325,1326,1328,1331,1333,1335,1337,1340],{"class":143,"line":897},[141,1327,1287],{"class":147},[141,1329,1330],{"class":161},"'humidity-01'",[141,1332,1293],{"class":147},[141,1334,454],{"class":154},[141,1336,1299],{"class":147},[141,1338,1339],{"class":161},"'%'",[141,1341,1305],{"class":147},[141,1343,1344,1346,1349,1351,1354,1356,1359],{"class":143,"line":903},[141,1345,1287],{"class":147},[141,1347,1348],{"class":161},"'pressure-01'",[141,1350,1293],{"class":147},[141,1352,1353],{"class":154},"1013",[141,1355,1299],{"class":147},[141,1357,1358],{"class":161},"'hPa'",[141,1360,1361],{"class":147}," }\n",[141,1363,1364],{"class":143,"line":1050},[141,1365,808],{"class":147},[141,1367,1368],{"class":143,"line":1059},[141,1369,781],{"emptyLinePlaceholder":780},[141,1371,1372,1375,1378,1380,1384,1387],{"class":143,"line":1069},[141,1373,1374],{"class":147},"sensors.",[141,1376,1377],{"class":1222},"forEach",[141,1379,1225],{"class":147},[141,1381,1383],{"class":1382},"s4XuR","sensor",[141,1385,1386],{"class":756}," =>",[141,1388,1001],{"class":147},[141,1390,1391,1394,1397,1399,1402,1404,1406,1409,1412],{"class":143,"line":1083},[141,1392,1393],{"class":756},"    const",[141,1395,1396],{"class":154}," key",[141,1398,935],{"class":756},[141,1400,1401],{"class":161}," `sensor:${",[141,1403,1383],{"class":147},[141,1405,491],{"class":161},[141,1407,1408],{"class":147},"id",[141,1410,1411],{"class":161},"}:latest`",[141,1413,763],{"class":147},[141,1415,1416,1418,1421,1423,1426,1428,1430],{"class":143,"line":1089},[141,1417,1393],{"class":756},[141,1419,1420],{"class":154}," data",[141,1422,935],{"class":756},[141,1424,1425],{"class":154}," JSON",[141,1427,491],{"class":147},[141,1429,482],{"class":1222},[141,1431,1432],{"class":147},"({\n",[141,1434,1435],{"class":143,"line":1094},[141,1436,1437],{"class":147},"        value: sensor.value,\n",[141,1439,1440],{"class":143,"line":1099},[141,1441,1442],{"class":147},"        unit: sensor.unit,\n",[141,1444,1446,1449,1452],{"class":143,"line":1445},19,[141,1447,1448],{"class":147},"        timestamp: Date.",[141,1450,1451],{"class":1222},"now",[141,1453,1454],{"class":147},"()\n",[141,1456,1458],{"class":143,"line":1457},20,[141,1459,1460],{"class":147},"    });\n",[141,1462,1464,1467,1469,1472,1475,1478,1481,1483],{"class":143,"line":1463},21,[141,1465,1466],{"class":147},"    pipeline.",[141,1468,284],{"class":1222},[141,1470,1471],{"class":147},"(key, data, ",[141,1473,1474],{"class":161},"'EX'",[141,1476,1477],{"class":147},", ",[141,1479,1480],{"class":154},"3600",[141,1482,1231],{"class":147},[141,1484,1485],{"class":1234},"\u002F\u002F Expire in 1 hour\n",[141,1487,1489],{"class":143,"line":1488},22,[141,1490,1491],{"class":147},"});\n",[141,1493,1495],{"class":143,"line":1494},23,[141,1496,781],{"emptyLinePlaceholder":780},[141,1498,1500],{"class":143,"line":1499},24,[141,1501,1502],{"class":1234},"\u002F\u002F Execute all commands at once\n",[141,1504,1506,1509,1512,1515,1518,1520,1523,1526,1529],{"class":143,"line":1505},25,[141,1507,1508],{"class":147},"pipeline.",[141,1510,1511],{"class":1222},"exec",[141,1513,1514],{"class":147},"((",[141,1516,1517],{"class":1382},"err",[141,1519,1477],{"class":147},[141,1521,1522],{"class":1382},"results",[141,1524,1525],{"class":147},") ",[141,1527,1528],{"class":756},"=>",[141,1530,1001],{"class":147},[141,1532,1534,1537],{"class":143,"line":1533},26,[141,1535,1536],{"class":756},"    if",[141,1538,1539],{"class":147}," (err) {\n",[141,1541,1543,1546,1549],{"class":143,"line":1542},27,[141,1544,1545],{"class":147},"        node.",[141,1547,1548],{"class":1222},"error",[141,1550,1551],{"class":147},"(err, msg);\n",[141,1553,1555,1558],{"class":143,"line":1554},28,[141,1556,1557],{"class":756},"        return",[141,1559,763],{"class":147},[141,1561,1563],{"class":143,"line":1562},29,[141,1564,1565],{"class":147},"    }\n",[141,1567,1569],{"class":143,"line":1568},30,[141,1570,1571],{"class":147},"    \n",[141,1573,1575,1577,1579],{"class":143,"line":1574},31,[141,1576,996],{"class":147},[141,1578,757],{"class":756},[141,1580,1001],{"class":147},[141,1582,1584,1586,1589,1591,1593,1596,1599],{"class":143,"line":1583},32,[141,1585,1016],{"class":147},[141,1587,1588],{"class":161},"`Stored ${",[141,1590,1522],{"class":147},[141,1592,491],{"class":161},[141,1594,1595],{"class":154},"length",[141,1597,1598],{"class":161},"} sensor readings`",[141,1600,165],{"class":147},[141,1602,1604],{"class":143,"line":1603},33,[141,1605,1606],{"class":147},"        results: results\n",[141,1608,1610],{"class":143,"line":1609},34,[141,1611,1037],{"class":147},[141,1613,1615,1618,1621],{"class":143,"line":1614},35,[141,1616,1617],{"class":147},"    node.",[141,1619,1620],{"class":1222},"send",[141,1622,1623],{"class":147},"(msg);\n",[141,1625,1627],{"class":143,"line":1626},36,[141,1628,1491],{"class":147},[71,1630,1631,1635,1638],{"start":168},[41,1632,268,1633,372],{},[77,1634,313],{},[41,1636,1637],{},"Connect the inject node to the function node, then connect the function node to the debug node",[41,1639,116,1640,1642],{},[77,1641,322],{}," and click the inject button",[18,1644,1645],{},"All sensor readings are stored in a single efficient batch operation.",[30,1647,1649],{"id":1648},"scanning-keys-with-cursor","Scanning Keys with Cursor",[18,1651,1652],{},"When you need to find keys matching a pattern without blocking Redis (important for production systems), use the SCAN command:",[71,1654,1655,1659],{},[41,1656,253,1657,526],{},[77,1658,256],{},[41,1660,268,1661,1202],{},[77,1662,740],{},[133,1664,1666],{"className":744,"code":1665,"language":746,"meta":12,"style":12},"const redis = flow.get('redis'); \u002F\u002F Replace 'redis' with your topic if different\n\nasync function scanKeys() {\n    const matchPattern = 'sensor:*:latest';\n    const allKeys = [];\n    let cursor = '0';\n    \n    try {\n        do {\n            \u002F\u002F Scan with pattern matching\n            const result = await redis.scan(\n                cursor,\n                'MATCH', matchPattern,\n                'COUNT', 100\n            );\n            \n            cursor = result[0];\n            const keys = result[1];\n            allKeys.push(...keys);\n            \n        } while (cursor !== '0');\n        \n        msg.payload = {\n            pattern: matchPattern,\n            count: allKeys.length,\n            keys: allKeys\n        };\n        \n        node.send(msg);\n        \n    } catch (err) {\n        node.error(err, msg);\n    }\n}\n\nscanKeys();\n",[56,1667,1668,1688,1692,1706,1720,1732,1747,1751,1758,1765,1770,1790,1795,1803,1813,1818,1823,1836,1851,1867,1871,1890,1895,1904,1909,1918,1923,1928,1932,1940,1944,1954,1962,1966,1970,1974],{"__ignoreMap":12},[141,1669,1670,1672,1674,1676,1678,1680,1682,1684,1686],{"class":143,"line":144},[141,1671,929],{"class":756},[141,1673,1214],{"class":154},[141,1675,935],{"class":756},[141,1677,1219],{"class":147},[141,1679,357],{"class":1222},[141,1681,1225],{"class":147},[141,1683,1228],{"class":161},[141,1685,1231],{"class":147},[141,1687,1235],{"class":1234},[141,1689,1690],{"class":143,"line":151},[141,1691,781],{"emptyLinePlaceholder":780},[141,1693,1694,1697,1700,1703],{"class":143,"line":168},[141,1695,1696],{"class":756},"async",[141,1698,1699],{"class":756}," function",[141,1701,1702],{"class":1222}," scanKeys",[141,1704,1705],{"class":147},"() {\n",[141,1707,1708,1710,1713,1715,1718],{"class":143,"line":181},[141,1709,1393],{"class":756},[141,1711,1712],{"class":154}," matchPattern",[141,1714,935],{"class":756},[141,1716,1717],{"class":161}," 'sensor:*:latest'",[141,1719,763],{"class":147},[141,1721,1722,1724,1727,1729],{"class":143,"line":192},[141,1723,1393],{"class":756},[141,1725,1726],{"class":154}," allKeys",[141,1728,935],{"class":756},[141,1730,1731],{"class":147}," [];\n",[141,1733,1734,1737,1740,1742,1745],{"class":143,"line":799},[141,1735,1736],{"class":756},"    let",[141,1738,1739],{"class":147}," cursor ",[141,1741,757],{"class":756},[141,1743,1744],{"class":161}," '0'",[141,1746,763],{"class":147},[141,1748,1749],{"class":143,"line":805},[141,1750,1571],{"class":147},[141,1752,1753,1756],{"class":143,"line":811},[141,1754,1755],{"class":756},"    try",[141,1757,1001],{"class":147},[141,1759,1760,1763],{"class":143,"line":816},[141,1761,1762],{"class":756},"        do",[141,1764,1001],{"class":147},[141,1766,1767],{"class":143,"line":897},[141,1768,1769],{"class":1234},"            \u002F\u002F Scan with pattern matching\n",[141,1771,1772,1775,1777,1779,1782,1784,1787],{"class":143,"line":903},[141,1773,1774],{"class":756},"            const",[141,1776,932],{"class":154},[141,1778,935],{"class":756},[141,1780,1781],{"class":756}," await",[141,1783,1256],{"class":147},[141,1785,1786],{"class":1222},"scan",[141,1788,1789],{"class":147},"(\n",[141,1791,1792],{"class":143,"line":1050},[141,1793,1794],{"class":147},"                cursor,\n",[141,1796,1797,1800],{"class":143,"line":1059},[141,1798,1799],{"class":161},"                'MATCH'",[141,1801,1802],{"class":147},", matchPattern,\n",[141,1804,1805,1808,1810],{"class":143,"line":1069},[141,1806,1807],{"class":161},"                'COUNT'",[141,1809,1477],{"class":147},[141,1811,1812],{"class":154},"100\n",[141,1814,1815],{"class":143,"line":1083},[141,1816,1817],{"class":147},"            );\n",[141,1819,1820],{"class":143,"line":1089},[141,1821,1822],{"class":147},"            \n",[141,1824,1825,1828,1830,1832,1834],{"class":143,"line":1094},[141,1826,1827],{"class":147},"            cursor ",[141,1829,757],{"class":756},[141,1831,950],{"class":147},[141,1833,953],{"class":154},[141,1835,808],{"class":147},[141,1837,1838,1840,1843,1845,1847,1849],{"class":143,"line":1099},[141,1839,1774],{"class":756},[141,1841,1842],{"class":154}," keys",[141,1844,935],{"class":756},[141,1846,950],{"class":147},[141,1848,838],{"class":154},[141,1850,808],{"class":147},[141,1852,1853,1856,1859,1861,1864],{"class":143,"line":1445},[141,1854,1855],{"class":147},"            allKeys.",[141,1857,1858],{"class":1222},"push",[141,1860,1225],{"class":147},[141,1862,1863],{"class":756},"...",[141,1865,1866],{"class":147},"keys);\n",[141,1868,1869],{"class":143,"line":1457},[141,1870,1822],{"class":147},[141,1872,1873,1876,1879,1882,1885,1887],{"class":143,"line":1463},[141,1874,1875],{"class":147},"        } ",[141,1877,1878],{"class":756},"while",[141,1880,1881],{"class":147}," (cursor ",[141,1883,1884],{"class":756},"!==",[141,1886,1744],{"class":161},[141,1888,1889],{"class":147},");\n",[141,1891,1892],{"class":143,"line":1488},[141,1893,1894],{"class":147},"        \n",[141,1896,1897,1900,1902],{"class":143,"line":1494},[141,1898,1899],{"class":147},"        msg.payload ",[141,1901,757],{"class":756},[141,1903,1001],{"class":147},[141,1905,1906],{"class":143,"line":1499},[141,1907,1908],{"class":147},"            pattern: matchPattern,\n",[141,1910,1911,1914,1916],{"class":143,"line":1505},[141,1912,1913],{"class":147},"            count: allKeys.",[141,1915,1595],{"class":154},[141,1917,165],{"class":147},[141,1919,1920],{"class":143,"line":1533},[141,1921,1922],{"class":147},"            keys: allKeys\n",[141,1924,1925],{"class":143,"line":1542},[141,1926,1927],{"class":147},"        };\n",[141,1929,1930],{"class":143,"line":1554},[141,1931,1894],{"class":147},[141,1933,1934,1936,1938],{"class":143,"line":1562},[141,1935,1545],{"class":147},[141,1937,1620],{"class":1222},[141,1939,1623],{"class":147},[141,1941,1942],{"class":143,"line":1568},[141,1943,1894],{"class":147},[141,1945,1946,1949,1952],{"class":143,"line":1574},[141,1947,1948],{"class":147},"    } ",[141,1950,1951],{"class":756},"catch",[141,1953,1539],{"class":147},[141,1955,1956,1958,1960],{"class":143,"line":1583},[141,1957,1545],{"class":147},[141,1959,1548],{"class":1222},[141,1961,1551],{"class":147},[141,1963,1964],{"class":143,"line":1603},[141,1965,1565],{"class":147},[141,1967,1968],{"class":143,"line":1609},[141,1969,195],{"class":147},[141,1971,1972],{"class":143,"line":1614},[141,1973,781],{"emptyLinePlaceholder":780},[141,1975,1976,1979],{"class":143,"line":1626},[141,1977,1978],{"class":1222},"scanKeys",[141,1980,1262],{"class":147},[71,1982,1983,1987,1989],{"start":168},[41,1984,268,1985,372],{},[77,1986,313],{},[41,1988,1637],{},[41,1990,116,1991,1642],{},[77,1992,322],{},[18,1994,1995],{},"This safely scans all sensor keys without blocking Redis operations, making it suitable for production environments with large datasets.",[18,1997,1998,1999,491],{},"For more Redis commands, patterns, and advanced capabilities, refer to the ",[45,2000,2003],{"href":2001,"rel":2002},"https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002F",[49],"official Redis documentation",[18,2005,2006],{},"Below is the complete example that we covered in this document.",[2008,2009],"render-flow",{":height":2010,"flow":2011},"200","W3siaWQiOiIyYzMzZWJlYjczMDYyYWIzIiwidHlwZSI6Imdyb3VwIiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJuYW1lIjoiWW91ciBGaXJzdCBSZWRpcyBGbG93Iiwic3R5bGUiOnsibGFiZWwiOnRydWV9LCJub2RlcyI6WyJlNWYzMzI2ZWY3MzZjZWY2IiwiODQ4NmU4OGQ4NjIzYjQyYSIsImQxZWJkZTIyZDBlMjI0YTgiLCIyMmRiMjVjNjBhZjE2YWIyIiwiZmUyYmU1MzJjNTM0MDJiMyIsImViYzFlOGZjMGYxYmEyZDYiLCJhZGI5NWM2M2QyMDZjNjMzIl0sIngiOjUxNCwieSI6MzU5LCJ3Ijo3MTIsImgiOjE2Mn0seyJpZCI6ImU1ZjMzMjZlZjczNmNlZjYiLCJ0eXBlIjoicmVkaXMtY29tbWFuZCIsInoiOiJkNGY2MGM3OWVmZjUyMTFkIiwiZyI6IjJjMzNlYmViNzMwNjJhYjMiLCJzZXJ2ZXIiOiJlMzcwZGM5MmIzOWE3YmE0IiwiY29tbWFuZCI6IlNFVCIsIm5hbWUiOiIiLCJ0b3BpYyI6Im15a2V5IiwicGFyYW1zIjoiW1wiSGVsbG8gZnJvbSBOb2RlLVJFRFwiXSIsInBhcmFtc1R5cGUiOiJqc29uIiwicGF5bG9hZFR5cGUiOiJqc29uIiwiYmxvY2siOmZhbHNlLCJ4Ijo4MTAsInkiOjQwMCwid2lyZXMiOltbIjg0ODZlODhkODYyM2I0MmEiXV19LHsiaWQiOiI4NDg2ZTg4ZDg2MjNiNDJhIiwidHlwZSI6ImRlYnVnIiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJnIjoiMmMzM2ViZWI3MzA2MmFiMyIsIm5hbWUiOiJSZXN1bHQiLCJhY3RpdmUiOnRydWUsInRvc2lkZWJhciI6dHJ1ZSwiY29uc29sZSI6ZmFsc2UsInRvc3RhdHVzIjpmYWxzZSwiY29tcGxldGUiOiJwYXlsb2FkIiwidGFyZ2V0VHlwZSI6Im1zZyIsInN0YXR1c1ZhbCI6IiIsInN0YXR1c1R5cGUiOiJhdXRvIiwieCI6OTcwLCJ5Ijo0MDAsIndpcmVzIjpbXX0seyJpZCI6ImQxZWJkZTIyZDBlMjI0YTgiLCJ0eXBlIjoicmVkaXMtY29tbWFuZCIsInoiOiJkNGY2MGM3OWVmZjUyMTFkIiwiZyI6IjJjMzNlYmViNzMwNjJhYjMiLCJzZXJ2ZXIiOiJlMzcwZGM5MmIzOWE3YmE0IiwiY29tbWFuZCI6IkdFVCIsIm5hbWUiOiIiLCJ0b3BpYyI6IiIsInBhcmFtcyI6IltdIiwicGFyYW1zVHlwZSI6Impzb24iLCJwYXlsb2FkVHlwZSI6Impzb24iLCJibG9jayI6ZmFsc2UsIngiOjEwMDAsInkiOjQ4MCwid2lyZXMiOltbIjIyZGIyNWM2MGFmMTZhYjIiXV19LHsiaWQiOiIyMmRiMjVjNjBhZjE2YWIyIiwidHlwZSI6ImRlYnVnIiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJnIjoiMmMzM2ViZWI3MzA2MmFiMyIsIm5hbWUiOiJSZXN1bHQiLCJhY3RpdmUiOnRydWUsInRvc2lkZWJhciI6dHJ1ZSwiY29uc29sZSI6ZmFsc2UsInRvc3RhdHVzIjpmYWxzZSwiY29tcGxldGUiOiJwYXlsb2FkIiwidGFyZ2V0VHlwZSI6Im1zZyIsInN0YXR1c1ZhbCI6IiIsInN0YXR1c1R5cGUiOiJhdXRvIiwieCI6MTEzMCwieSI6NDgwLCJ3aXJlcyI6W119LHsiaWQiOiJmZTJiZTUzMmM1MzQwMmIzIiwidHlwZSI6ImNoYW5nZSIsInoiOiJkNGY2MGM3OWVmZjUyMTFkIiwiZyI6IjJjMzNlYmViNzMwNjJhYjMiLCJuYW1lIjoiU2V0IEtleSBmb3IgR0VUIiwicnVsZXMiOlt7InQiOiJzZXQiLCJwIjoidG9waWMiLCJwdCI6Im1zZyIsInRvIjoibXlrZXkiLCJ0b3QiOiJzdHIifSx7InQiOiJzZXQiLCJwIjoicGF5bG9hZCIsInB0IjoibXNnIiwidG8iOiJbXSIsInRvdCI6Impzb24ifV0sImFjdGlvbiI6IiIsInByb3BlcnR5IjoiIiwiZnJvbSI6IiIsInRvIjoiIiwicmVnIjpmYWxzZSwieCI6ODAwLCJ5Ijo0ODAsIndpcmVzIjpbWyJkMWViZGUyMmQwZTIyNGE4Il1dfSx7ImlkIjoiZWJjMWU4ZmMwZjFiYTJkNiIsInR5cGUiOiJpbmplY3QiLCJ6IjoiZDRmNjBjNzllZmY1MjExZCIsImciOiIyYzMzZWJlYjczMDYyYWIzIiwibmFtZSI6IiIsInByb3BzIjpbXSwicmVwZWF0IjoiIiwiY3JvbnRhYiI6IiIsIm9uY2UiOmZhbHNlLCJvbmNlRGVsYXkiOjAuMSwidG9waWMiOiIiLCJ4Ijo2MTAsInkiOjQwMCwid2lyZXMiOltbImU1ZjMzMjZlZjczNmNlZjYiXV19LHsiaWQiOiJhZGI5NWM2M2QyMDZjNjMzIiwidHlwZSI6ImluamVjdCIsInoiOiJkNGY2MGM3OWVmZjUyMTFkIiwiZyI6IjJjMzNlYmViNzMwNjJhYjMiLCJuYW1lIjoiIiwicHJvcHMiOltdLCJyZXBlYXQiOiIiLCJjcm9udGFiIjoiIiwib25jZSI6ZmFsc2UsIm9uY2VEZWxheSI6MC4xLCJ0b3BpYyI6IiIsIngiOjYxMCwieSI6NDgwLCJ3aXJlcyI6W1siZmUyYmU1MzJjNTM0MDJiMyJdXX0seyJpZCI6ImUzNzBkYzkyYjM5YTdiYTQiLCJ0eXBlIjoicmVkaXMtY29uZmlnIiwibmFtZSI6IkxvY2FsIiwib3B0aW9ucyI6IntcImhvc3RcIjpcImxvY2FsaG9zdFwiLFwicG9ydFwiOjYzNzksXCJkYlwiOjB9IiwiY2x1c3RlciI6ZmFsc2UsIm9wdGlvbnNUeXBlIjoianNvbiJ9LHsiaWQiOiI1ZTI4NDJhNDczMDU4OWMwIiwidHlwZSI6Imdyb3VwIiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJuYW1lIjoiV29ya2luZyB3aXRoIEpTT04gRGF0YSIsInN0eWxlIjp7ImxhYmVsIjp0cnVlfSwibm9kZXMiOlsiNmFjYzA3YTM5M2U1ZWUyNiIsIjMyNTVlOGE5MTIyMjUzYjciLCJhM2IwYjRhNzQxMzM3NzhlIiwiNGZhYmE5MjlhODRmYjM1OCIsImU1YzM1OWI5MzQxNzRjOGUiLCJhYmYwMTFjMmU4MTk2MGM0IiwiMjJhMmI1NGNhYWU1ODY5ZCIsImI5NTk4ZjMxM2UyYTlmZDIiLCJkMDA1MWY2MzdmZDE2MjFhIiwiOWU1OWYyNzU0OTZkNzIyZCJdLCJ4Ijo1MTQsInkiOjUzOSwidyI6ODUyLCJoIjoxNjJ9LHsiaWQiOiI2YWNjMDdhMzkzZTVlZTI2IiwidHlwZSI6InJlZGlzLWNvbW1hbmQiLCJ6IjoiZDRmNjBjNzllZmY1MjExZCIsImciOiI1ZTI4NDJhNDczMDU4OWMwIiwic2VydmVyIjoiZTM3MGRjOTJiMzlhN2JhNCIsImNvbW1hbmQiOiJTRVQiLCJuYW1lIjoiIiwidG9waWMiOiIiLCJwYXJhbXMiOiJbXSIsInBhcmFtc1R5cGUiOiJqc29uIiwicGF5bG9hZFR5cGUiOiJqc29uIiwiYmxvY2siOmZhbHNlLCJ4IjoxMTQwLCJ5Ijo1ODAsIndpcmVzIjpbWyIzMjU1ZThhOTEyMjI1M2I3Il1dfSx7ImlkIjoiMzI1NWU4YTkxMjIyNTNiNyIsInR5cGUiOiJkZWJ1ZyIsInoiOiJkNGY2MGM3OWVmZjUyMTFkIiwiZyI6IjVlMjg0MmE0NzMwNTg5YzAiLCJuYW1lIjoiUmVzdWx0IiwiYWN0aXZlIjp0cnVlLCJ0b3NpZGViYXIiOnRydWUsImNvbnNvbGUiOmZhbHNlLCJ0b3N0YXR1cyI6ZmFsc2UsImNvbXBsZXRlIjoicGF5bG9hZCIsInRhcmdldFR5cGUiOiJtc2ciLCJzdGF0dXNWYWwiOiIiLCJzdGF0dXNUeXBlIjoiYXV0byIsIngiOjEyNzAsInkiOjU4MCwid2lyZXMiOltdfSx7ImlkIjoiYTNiMGI0YTc0MTMzNzc4ZSIsInR5cGUiOiJpbmplY3QiLCJ6IjoiZDRmNjBjNzllZmY1MjExZCIsImciOiI1ZTI4NDJhNDczMDU4OWMwIiwibmFtZSI6IiIsInByb3BzIjpbXSwicmVwZWF0IjoiIiwiY3JvbnRhYiI6IiIsIm9uY2UiOmZhbHNlLCJvbmNlRGVsYXkiOjAuMSwidG9waWMiOiIiLCJ4Ijo2MTAsInkiOjU4MCwid2lyZXMiOltbImQwMDUxZjYzN2ZkMTYyMWEiXV19LHsiaWQiOiI0ZmFiYTkyOWE4NGZiMzU4IiwidHlwZSI6InJlZGlzLWNvbW1hbmQiLCJ6IjoiZDRmNjBjNzllZmY1MjExZCIsImciOiI1ZTI4NDJhNDczMDU4OWMwIiwic2VydmVyIjoiZTM3MGRjOTJiMzlhN2JhNCIsImNvbW1hbmQiOiJHRVQiLCJuYW1lIjoiIiwidG9waWMiOiIiLCJwYXJhbXMiOiJbXSIsInBhcmFtc1R5cGUiOiJqc29uIiwicGF5bG9hZFR5cGUiOiJqc29uIiwiYmxvY2siOmZhbHNlLCJ4IjoxMDAwLCJ5Ijo2NjAsIndpcmVzIjpbWyJiOTU5OGYzMTNlMmE5ZmQyIl1dfSx7ImlkIjoiZTVjMzU5YjkzNDE3NGM4ZSIsInR5cGUiOiJkZWJ1ZyIsInoiOiJkNGY2MGM3OWVmZjUyMTFkIiwiZyI6IjVlMjg0MmE0NzMwNTg5YzAiLCJuYW1lIjoiUmVzdWx0IiwiYWN0aXZlIjp0cnVlLCJ0b3NpZGViYXIiOnRydWUsImNvbnNvbGUiOmZhbHNlLCJ0b3N0YXR1cyI6ZmFsc2UsImNvbXBsZXRlIjoicGF5bG9hZCIsInRhcmdldFR5cGUiOiJtc2ciLCJzdGF0dXNWYWwiOiIiLCJzdGF0dXNUeXBlIjoiYXV0byIsIngiOjEyNzAsInkiOjY2MCwid2lyZXMiOltdfSx7ImlkIjoiYWJmMDExYzJlODE5NjBjNCIsInR5cGUiOiJjaGFuZ2UiLCJ6IjoiZDRmNjBjNzllZmY1MjExZCIsImciOiI1ZTI4NDJhNDczMDU4OWMwIiwibmFtZSI6IlNldCBLZXkgZm9yIEdFVCIsInJ1bGVzIjpbeyJ0Ijoic2V0IiwicCI6InRvcGljIiwicHQiOiJtc2ciLCJ0byI6InNlbnNvcjpkYXRhIiwidG90Ijoic3RyIn0seyJ0Ijoic2V0IiwicCI6InBheWxvYWQiLCJwdCI6Im1zZyIsInRvIjoiW10iLCJ0b3QiOiJqc29uIn1dLCJhY3Rpb24iOiIiLCJwcm9wZXJ0eSI6IiIsImZyb20iOiIiLCJ0byI6IiIsInJlZyI6ZmFsc2UsIngiOjgwMCwieSI6NjYwLCJ3aXJlcyI6W1siNGZhYmE5MjlhODRmYjM1OCJdXX0seyJpZCI6IjIyYTJiNTRjYWFlNTg2OWQiLCJ0eXBlIjoiaW5qZWN0IiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJnIjoiNWUyODQyYTQ3MzA1ODljMCIsIm5hbWUiOiIiLCJwcm9wcyI6W10sInJlcGVhdCI6IiIsImNyb250YWIiOiIiLCJvbmNlIjpmYWxzZSwib25jZURlbGF5IjowLjEsInRvcGljIjoiIiwieCI6NjEwLCJ5Ijo2NjAsIndpcmVzIjpbWyJhYmYwMTFjMmU4MTk2MGM0Il1dfSx7ImlkIjoiYjk1OThmMzEzZTJhOWZkMiIsInR5cGUiOiJqc29uIiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJnIjoiNWUyODQyYTQ3MzA1ODljMCIsIm5hbWUiOiIiLCJwcm9wZXJ0eSI6InBheWxvYWQiLCJhY3Rpb24iOiIiLCJwcmV0dHkiOmZhbHNlLCJ4IjoxMTMwLCJ5Ijo2NjAsIndpcmVzIjpbWyJlNWMzNTliOTM0MTc0YzhlIl1dfSx7ImlkIjoiZDAwNTFmNjM3ZmQxNjIxYSIsInR5cGUiOiJjaGFuZ2UiLCJ6IjoiZDRmNjBjNzllZmY1MjExZCIsImciOiI1ZTI4NDJhNDczMDU4OWMwIiwibmFtZSI6IlNldCBLZXkiLCJydWxlcyI6W3sidCI6InNldCIsInAiOiJ0b3BpYyIsInB0IjoibXNnIiwidG8iOiJzZW5zb3I6ZGF0YSIsInRvdCI6InN0ciJ9LHsidCI6InNldCIsInAiOiJwYXlsb2FkIiwicHQiOiJtc2ciLCJ0byI6IntcdCAgIFwidGVtcGVyYXR1cmVcIjogMjIuNSxcdCAgIFwiaHVtaWRpdHlcIjogNjUsXHQgICBcInRpbWVzdGFtcFwiOiAkbm93KClcdH0iLCJ0b3QiOiJqc29uYXRhIn1dLCJhY3Rpb24iOiIiLCJwcm9wZXJ0eSI6IiIsImZyb20iOiIiLCJ0byI6IiIsInJlZyI6ZmFsc2UsIngiOjc4MCwieSI6NTgwLCJ3aXJlcyI6W1siOWU1OWYyNzU0OTZkNzIyZCJdXX0seyJpZCI6IjllNTlmMjc1NDk2ZDcyMmQiLCJ0eXBlIjoianNvbiIsInoiOiJkNGY2MGM3OWVmZjUyMTFkIiwiZyI6IjVlMjg0MmE0NzMwNTg5YzAiLCJuYW1lIjoiIiwicHJvcGVydHkiOiJwYXlsb2FkIiwiYWN0aW9uIjoiIiwicHJldHR5IjpmYWxzZSwieCI6OTkwLCJ5Ijo1ODAsIndpcmVzIjpbWyI2YWNjMDdhMzkzZTVlZTI2Il1dfSx7ImlkIjoiMzlkZTVkYTk1NTg1MjI3ZiIsInR5cGUiOiJncm91cCIsInoiOiJkNGY2MGM3OWVmZjUyMTFkIiwibmFtZSI6IlB1Yi9TdWIgTWVzc2FnaW5nIiwic3R5bGUiOnsibGFiZWwiOnRydWV9LCJub2RlcyI6WyI3NzU2NTU4ZmQ1NDJkNjU3IiwiYmYyZGMyNjEwN2VmZjk2NyIsIjk4NTZkZGI4ZTdiYzI4ZTgiLCJiY2Q5YjIyZmQ2N2VjZjdjIiwiMjJmMDUyNmZhYjNiNTg5YiJdLCJ4Ijo1MTQsInkiOjcxOSwidyI6NjMyLCJoIjoxNjJ9LHsiaWQiOiI3NzU2NTU4ZmQ1NDJkNjU3IiwidHlwZSI6ImluamVjdCIsInoiOiJkNGY2MGM3OWVmZjUyMTFkIiwiZyI6IjM5ZGU1ZGE5NTU4NTIyN2YiLCJuYW1lIjoiIiwicHJvcHMiOltdLCJyZXBlYXQiOiIiLCJjcm9udGFiIjoiIiwib25jZSI6ZmFsc2UsIm9uY2VEZWxheSI6MC4xLCJ0b3BpYyI6IiIsIngiOjYxMCwieSI6NzYwLCJ3aXJlcyI6W1siOTg1NmRkYjhlN2JjMjhlOCJdXX0seyJpZCI6ImJmMmRjMjYxMDdlZmY5NjciLCJ0eXBlIjoicmVkaXMtb3V0IiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJnIjoiMzlkZTVkYTk1NTg1MjI3ZiIsInNlcnZlciI6ImUzNzBkYzkyYjM5YTdiYTQiLCJjb21tYW5kIjoicHVibGlzaCIsIm5hbWUiOiIiLCJ0b3BpYyI6ImFsZXJ0czp0ZW1wZXJhdHVyZSIsIm9iaiI6dHJ1ZSwieCI6MTAzMCwieSI6NzYwLCJ3aXJlcyI6W119LHsiaWQiOiI5ODU2ZGRiOGU3YmMyOGU4IiwidHlwZSI6ImNoYW5nZSIsInoiOiJkNGY2MGM3OWVmZjUyMTFkIiwiZyI6IjM5ZGU1ZGE5NTU4NTIyN2YiLCJuYW1lIjoiU2V0IEFsZXJ0IE1lc3NhZ2UiLCJydWxlcyI6W3sidCI6InNldCIsInAiOiJwYXlsb2FkIiwicHQiOiJtc2ciLCJ0byI6IkFMRVJUOiBUZW1wZXJhdHVyZSBjcml0aWNhbCBpbiBab25lIEE6IDg1wrBDIC0gRXF1aXBtZW50IHNodXRkb3duIGluaXRpYXRlZCIsInRvdCI6InN0ciJ9XSwiYWN0aW9uIjoiIiwicHJvcGVydHkiOiIiLCJmcm9tIjoiIiwidG8iOiIiLCJyZWciOmZhbHNlLCJ4Ijo4MTAsInkiOjc2MCwid2lyZXMiOltbImJmMmRjMjYxMDdlZmY5NjciXV19LHsiaWQiOiJiY2Q5YjIyZmQ2N2VjZjdjIiwidHlwZSI6InJlZGlzLWluIiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJnIjoiMzlkZTVkYTk1NTg1MjI3ZiIsInNlcnZlciI6ImUzNzBkYzkyYjM5YTdiYTQiLCJjb21tYW5kIjoic3Vic2NyaWJlIiwibmFtZSI6IiIsInRvcGljIjoiYWxlcnRzOnRlbXBlcmF0dXJlIiwib2JqIjp0cnVlLCJ0aW1lb3V0IjowLCJ4Ijo2MzAsInkiOjg0MCwid2lyZXMiOltbIjIyZjA1MjZmYWIzYjU4OWIiXV19LHsiaWQiOiIyMmYwNTI2ZmFiM2I1ODliIiwidHlwZSI6ImRlYnVnIiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJnIjoiMzlkZTVkYTk1NTg1MjI3ZiIsIm5hbWUiOiJSZXN1bHQiLCJhY3RpdmUiOnRydWUsInRvc2lkZWJhciI6dHJ1ZSwiY29uc29sZSI6ZmFsc2UsInRvc3RhdHVzIjpmYWxzZSwiY29tcGxldGUiOiJwYXlsb2FkIiwidGFyZ2V0VHlwZSI6Im1zZyIsInN0YXR1c1ZhbCI6IiIsInN0YXR1c1R5cGUiOiJhdXRvIiwieCI6OTkwLCJ5Ijo4NDAsIndpcmVzIjpbXX0seyJpZCI6ImFkYzRiMGRmNmIwZTg0ZTMiLCJ0eXBlIjoiZ3JvdXAiLCJ6IjoiZDRmNjBjNzllZmY1MjExZCIsIm5hbWUiOiJVc2luZyBMdWEgU2NyaXB0cyBmb3IgQXRvbWljIE9wZXJhdGlvbnMiLCJzdHlsZSI6eyJsYWJlbCI6dHJ1ZX0sIm5vZGVzIjpbImNhOGE1MjM3MTAxMzhhMTEiLCI4ODA0NzU1YmVmYTFmYmM4IiwiMDg5OGU4MGUyOGI3ZDI3NiIsIjBiMTY2OTBiM2MyYzEwZGYiLCI5YTAzZWJkZWE1MWVlZmRjIiwiYzY0MWQ4ZTU0NjIwYTczYSIsIjdjMTFhNWYxYzk3MTY1MjciLCJhMDdhMDI1ZGI5NjJiZTUwIl0sIngiOjUxNCwieSI6ODk5LCJ3IjoxMTEyLCJoIjoxNDJ9LHsiaWQiOiJjYThhNTIzNzEwMTM4YTExIiwidHlwZSI6ImluamVjdCIsInoiOiJkNGY2MGM3OWVmZjUyMTFkIiwiZyI6ImFkYzRiMGRmNmIwZTg0ZTMiLCJuYW1lIjoiIiwicHJvcHMiOltdLCJyZXBlYXQiOiIiLCJjcm9udGFiIjoiIiwib25jZSI6ZmFsc2UsIm9uY2VEZWxheSI6MC4xLCJ0b3BpYyI6IiIsIngiOjYxMCwieSI6MTAwMCwid2lyZXMiOltbIjg4MDQ3NTViZWZhMWZiYzgiXV19LHsiaWQiOiI4ODA0NzU1YmVmYTFmYmM4IiwidHlwZSI6ImZ1bmN0aW9uIiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJnIjoiYWRjNGIwZGY2YjBlODRlMyIsIm5hbWUiOiJQcmVwYXJlIEx1YSBTY3JpcHQgQXJndW1lbnRzIiwiZnVuYyI6Ii8vIG1zZy5wYXlsb2FkIGZvcm1hdDogW2tleXMuLi4sIGFyZ3MuLi5dXG4vLyBGaXJzdCBlbGVtZW50KHMpIGFyZSB0aGUga2V5cywgcmVtYWluaW5nIGVsZW1lbnRzIGFyZSBhcmd1bWVudHNcbm1zZy5wYXlsb2FkID0gW1xuICAgIFwiaW52ZW50b3J5OnByb2R1Y3Q6U0tVLTEyMzQ1XCIsICAvLyBLRVlTWzFdXG4gICAgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQVJHVlsxXSAtIHF1YW50aXR5IHJlcXVlc3RlZFxuXTtcbnJldHVybiBtc2c7Iiwib3V0cHV0cyI6MSwidGltZW91dCI6MCwibm9lcnIiOjAsImluaXRpYWxpemUiOiIiLCJmaW5hbGl6ZSI6IiIsImxpYnMiOltdLCJ4Ijo4NTAsInkiOjEwMDAsIndpcmVzIjpbWyIwODk4ZTgwZTI4YjdkMjc2Il1dfSx7ImlkIjoiMDg5OGU4MGUyOGI3ZDI3NiIsInR5cGUiOiJyZWRpcy1sdWEtc2NyaXB0IiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJnIjoiYWRjNGIwZGY2YjBlODRlMyIsInNlcnZlciI6ImUzNzBkYzkyYjM5YTdiYTQiLCJuYW1lIjoiIiwia2V5dmFsIjoiMSIsImZ1bmMiOiJsb2NhbCBrZXkgPSBLRVlTWzFdXG5sb2NhbCByZXF1ZXN0ZWQgPSB0b251bWJlcihBUkdWWzFdKVxuXG5sb2NhbCBjdXJyZW50ID0gdG9udW1iZXIocmVkaXMuY2FsbCgnR0VUJywga2V5KSBvciBcIjBcIilcblxuaWYgY3VycmVudCA+PSByZXF1ZXN0ZWQgdGhlblxuICAgIHJlZGlzLmNhbGwoJ0RFQ1JCWScsIGtleSwgcmVxdWVzdGVkKVxuICAgIHJldHVybiB7MSwgY3VycmVudCAtIHJlcXVlc3RlZH1cbmVsc2VcbiAgICByZXR1cm4gezAsIGN1cnJlbnR9XG5lbmQiLCJzdG9yZWQiOmZhbHNlLCJibG9jayI6ZmFsc2UsIngiOjExNDAsInkiOjEwMDAsIndpcmVzIjpbWyIwYjE2NjkwYjNjMmMxMGRmIl1dfSx7ImlkIjoiMGIxNjY5MGIzYzJjMTBkZiIsInR5cGUiOiJmdW5jdGlvbiIsInoiOiJkNGY2MGM3OWVmZjUyMTFkIiwiZyI6ImFkYzRiMGRmNmIwZTg0ZTMiLCJuYW1lIjoiRm9ybWF0IEx1YSBTY3JpcHQgUmVzcG9uc2UiLCJmdW5jIjoiY29uc3QgcmVzdWx0ID0gbXNnLnBheWxvYWQ7XG5jb25zdCBzdWNjZXNzID0gcmVzdWx0WzBdO1xuY29uc3QgcmVtYWluaW5nID0gcmVzdWx0WzFdO1xuXG5pZiAoc3VjY2VzcyA9PT0gMSkge1xuICAgIG1zZy5wYXlsb2FkID0ge1xuICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgICBtZXNzYWdlOiBgT3JkZXIgcHJvY2Vzc2VkLiBSZW1haW5pbmcgc3RvY2s6ICR7cmVtYWluaW5nfWAsXG4gICAgICAgIHJlbWFpbmluZzogcmVtYWluaW5nXG4gICAgfTtcbn0gZWxzZSB7XG4gICAgbXNnLnBheWxvYWQgPSB7XG4gICAgICAgIHN0YXR1czogXCJmYWlsZWRcIixcbiAgICAgICAgbWVzc2FnZTogYEluc3VmZmljaWVudCBzdG9jay4gQXZhaWxhYmxlOiAke3JlbWFpbmluZ31gLFxuICAgICAgICBhdmFpbGFibGU6IHJlbWFpbmluZ1xuICAgIH07XG59XG5yZXR1cm4gbXNnOyIsIm91dHB1dHMiOjEsInRpbWVvdXQiOjAsIm5vZXJyIjowLCJpbml0aWFsaXplIjoiIiwiZmluYWxpemUiOiIiLCJsaWJzIjpbXSwieCI6MTM0MCwieSI6MTAwMCwid2lyZXMiOltbIjlhMDNlYmRlYTUxZWVmZGMiXV19LHsiaWQiOiI5YTAzZWJkZWE1MWVlZmRjIiwidHlwZSI6ImRlYnVnIiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJnIjoiYWRjNGIwZGY2YjBlODRlMyIsIm5hbWUiOiJSZXN1bHQiLCJhY3RpdmUiOnRydWUsInRvc2lkZWJhciI6dHJ1ZSwiY29uc29sZSI6ZmFsc2UsInRvc3RhdHVzIjpmYWxzZSwiY29tcGxldGUiOiJwYXlsb2FkIiwidGFyZ2V0VHlwZSI6Im1zZyIsInN0YXR1c1ZhbCI6IiIsInN0YXR1c1R5cGUiOiJhdXRvIiwieCI6MTUzMCwieSI6MTAwMCwid2lyZXMiOltdfSx7ImlkIjoiYzY0MWQ4ZTU0NjIwYTczYSIsInR5cGUiOiJyZWRpcy1jb21tYW5kIiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJnIjoiYWRjNGIwZGY2YjBlODRlMyIsInNlcnZlciI6ImUzNzBkYzkyYjM5YTdiYTQiLCJjb21tYW5kIjoiU0VUIiwibmFtZSI6IiIsInRvcGljIjoiaW52ZW50b3J5OnByb2R1Y3Q6U0tVLTEyMzQ1IiwicGFyYW1zIjoiWzEwXSIsInBhcmFtc1R5cGUiOiJqc29uIiwicGF5bG9hZFR5cGUiOiJqc29uIiwiYmxvY2siOmZhbHNlLCJ4Ijo4ODAsInkiOjk0MCwid2lyZXMiOltbIjdjMTFhNWYxYzk3MTY1MjciXV19LHsiaWQiOiI3YzExYTVmMWM5NzE2NTI3IiwidHlwZSI6ImRlYnVnIiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJnIjoiYWRjNGIwZGY2YjBlODRlMyIsIm5hbWUiOiJSZXN1bHQiLCJhY3RpdmUiOnRydWUsInRvc2lkZWJhciI6dHJ1ZSwiY29uc29sZSI6ZmFsc2UsInRvc3RhdHVzIjpmYWxzZSwiY29tcGxldGUiOiJwYXlsb2FkIiwidGFyZ2V0VHlwZSI6Im1zZyIsInN0YXR1c1ZhbCI6IiIsInN0YXR1c1R5cGUiOiJhdXRvIiwieCI6MTEzMCwieSI6OTQwLCJ3aXJlcyI6W119LHsiaWQiOiJhMDdhMDI1ZGI5NjJiZTUwIiwidHlwZSI6ImluamVjdCIsInoiOiJkNGY2MGM3OWVmZjUyMTFkIiwiZyI6ImFkYzRiMGRmNmIwZTg0ZTMiLCJuYW1lIjoiIiwicHJvcHMiOltdLCJyZXBlYXQiOiIiLCJjcm9udGFiIjoiIiwib25jZSI6ZmFsc2UsIm9uY2VEZWxheSI6MC4xLCJ0b3BpYyI6IiIsIngiOjYxMCwieSI6OTQwLCJ3aXJlcyI6W1siYzY0MWQ4ZTU0NjIwYTczYSJdXX0seyJpZCI6IjAxYTk2ZmIyMDQ0ZDcyM2YiLCJ0eXBlIjoiZ3JvdXAiLCJ6IjoiZDRmNjBjNzllZmY1MjExZCIsIm5hbWUiOiJEaXJlY3QgUmVkaXMgQ2xpZW50IEFjY2VzcyB3aXRoIHJlZGlzLWluc3RhbmNlIiwic3R5bGUiOnsibGFiZWwiOnRydWV9LCJub2RlcyI6WyI3NDVmNDFmMzUyZmEyMjEyIiwiYTllYzlhOGE1YTY2ZGFhMyIsImUzYTU2MzRlZjBlYmNiNzgiLCI1MTkyMDgxMzA5ZTA4ZGI5IiwiNGYxNjkwNTNiYmQ3YWRkOSIsIjE1ZjBiMDQ2MmY3OTU4MjgiLCI0YTM5NDcwMGM2OTE0OTYxIl0sIngiOjUxNCwieSI6MTA1OSwidyI6NzMyLCJoIjoyMjJ9LHsiaWQiOiI3NDVmNDFmMzUyZmEyMjEyIiwidHlwZSI6InJlZGlzLWluc3RhbmNlIiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJnIjoiMDFhOTZmYjIwNDRkNzIzZiIsInNlcnZlciI6ImUzNzBkYzkyYjM5YTdiYTQiLCJuYW1lIjoiIiwidG9waWMiOiJyZWRpcyIsImxvY2F0aW9uIjoiZmxvdyIsIngiOjU5MCwieSI6MTEwMCwid2lyZXMiOltdfSx7ImlkIjoiYTllYzlhOGE1YTY2ZGFhMyIsInR5cGUiOiJpbmplY3QiLCJ6IjoiZDRmNjBjNzllZmY1MjExZCIsImciOiIwMWE5NmZiMjA0NGQ3MjNmIiwibmFtZSI6IiIsInByb3BzIjpbeyJwIjoicGF5bG9hZCJ9LHsicCI6InRvcGljIiwidnQiOiJzdHIifV0sInJlcGVhdCI6IiIsImNyb250YWIiOiIiLCJvbmNlIjpmYWxzZSwib25jZURlbGF5IjowLjEsInRvcGljIjoiIiwicGF5bG9hZCI6IiIsInBheWxvYWRUeXBlIjoiZGF0ZSIsIngiOjYyMCwieSI6MTE4MCwid2lyZXMiOltbImUzYTU2MzRlZjBlYmNiNzgiXV19LHsiaWQiOiJlM2E1NjM0ZWYwZWJjYjc4IiwidHlwZSI6ImZ1bmN0aW9uIiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJnIjoiMDFhOTZmYjIwNDRkNzIzZiIsIm5hbWUiOiJCYXRjaCBTdG9yZSBTZW5zb3IgUmVhZGluZ3MgKFBpcGVsaW5lKSIsImZ1bmMiOiJjb25zdCByZWRpcyA9IGZsb3cuZ2V0KCdyZWRpcycpO1xuXG4vLyBDcmVhdGUgYSBwaXBlbGluZVxuY29uc3QgcGlwZWxpbmUgPSByZWRpcy5waXBlbGluZSgpO1xuXG4vLyBBZGQgbXVsdGlwbGUgc2Vuc29yIHJlYWRpbmdzIGluIG9uZSBiYXRjaFxuY29uc3Qgc2Vuc29ycyA9IFtcbiAgICB7IGlkOiAndGVtcC0wMScsIHZhbHVlOiAyMy41LCB1bml0OiAnQycgfSxcbiAgICB7IGlkOiAndGVtcC0wMicsIHZhbHVlOiAyNC4xLCB1bml0OiAnQycgfSxcbiAgICB7IGlkOiAnaHVtaWRpdHktMDEnLCB2YWx1ZTogNjUsIHVuaXQ6ICclJyB9LFxuICAgIHsgaWQ6ICdwcmVzc3VyZS0wMScsIHZhbHVlOiAxMDEzLCB1bml0OiAnaFBhJyB9XG5dO1xuXG5zZW5zb3JzLmZvckVhY2goc2Vuc29yID0+IHtcbiAgICBjb25zdCBrZXkgPSBgc2Vuc29yOiR7c2Vuc29yLmlkfTpsYXRlc3RgO1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHZhbHVlOiBzZW5zb3IudmFsdWUsXG4gICAgICAgIHVuaXQ6IHNlbnNvci51bml0LFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KClcbiAgICB9KTtcbiAgICBwaXBlbGluZS5zZXQoa2V5LCBkYXRhLCAnRVgnLCAzNjAwKTsgLy8gRXhwaXJlIGluIDEgaG91clxufSk7XG5cbi8vIEV4ZWN1dGUgYWxsIGNvbW1hbmRzIGF0IG9uY2VcbnBpcGVsaW5lLmV4ZWMoKGVyciwgcmVzdWx0cykgPT4ge1xuICAgIGlmIChlcnIpIHtcbiAgICAgICAgbm9kZS5lcnJvcihlcnIsIG1zZyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBtc2cucGF5bG9hZCA9IHtcbiAgICAgICAgbWVzc2FnZTogYFN0b3JlZCAke3Jlc3VsdHMubGVuZ3RofSBzZW5zb3IgcmVhZGluZ3NgLFxuICAgICAgICByZXN1bHRzOiByZXN1bHRzXG4gICAgfTtcbiAgICBub2RlLnNlbmQobXNnKTtcbn0pOyIsIm91dHB1dHMiOjEsInRpbWVvdXQiOjAsIm5vZXJyIjowLCJpbml0aWFsaXplIjoiIiwiZmluYWxpemUiOiIiLCJsaWJzIjpbXSwieCI6ODgwLCJ5IjoxMTgwLCJ3aXJlcyI6W1siNTE5MjA4MTMwOWUwOGRiOSJdXX0seyJpZCI6IjUxOTIwODEzMDllMDhkYjkiLCJ0eXBlIjoiZGVidWciLCJ6IjoiZDRmNjBjNzllZmY1MjExZCIsImciOiIwMWE5NmZiMjA0NGQ3MjNmIiwibmFtZSI6ImRlYnVnIDgiLCJhY3RpdmUiOnRydWUsInRvc2lkZWJhciI6dHJ1ZSwiY29uc29sZSI6ZmFsc2UsInRvc3RhdHVzIjpmYWxzZSwiY29tcGxldGUiOiJmYWxzZSIsInN0YXR1c1ZhbCI6IiIsInN0YXR1c1R5cGUiOiJhdXRvIiwieCI6MTE0MCwieSI6MTE4MCwid2lyZXMiOltdfSx7ImlkIjoiNGYxNjkwNTNiYmQ3YWRkOSIsInR5cGUiOiJpbmplY3QiLCJ6IjoiZDRmNjBjNzllZmY1MjExZCIsImciOiIwMWE5NmZiMjA0NGQ3MjNmIiwibmFtZSI6IiIsInByb3BzIjpbeyJwIjoicGF5bG9hZCJ9LHsicCI6InRvcGljIiwidnQiOiJzdHIifV0sInJlcGVhdCI6IiIsImNyb250YWIiOiIiLCJvbmNlIjpmYWxzZSwib25jZURlbGF5IjowLjEsInRvcGljIjoiIiwicGF5bG9hZCI6IiIsInBheWxvYWRUeXBlIjoiZGF0ZSIsIngiOjYyMCwieSI6MTI0MCwid2lyZXMiOltbIjE1ZjBiMDQ2MmY3OTU4MjgiXV19LHsiaWQiOiIxNWYwYjA0NjJmNzk1ODI4IiwidHlwZSI6ImZ1bmN0aW9uIiwieiI6ImQ0ZjYwYzc5ZWZmNTIxMWQiLCJnIjoiMDFhOTZmYjIwNDRkNzIzZiIsIm5hbWUiOiJTY2FuIGFuZCBMaXN0IExhdGVzdCBTZW5zb3IgS2V5cyIsImZ1bmMiOiJjb25zdCByZWRpcyA9IGZsb3cuZ2V0KCdyZWRpcycpO1xuXG5hc3luYyBmdW5jdGlvbiBzY2FuS2V5cygpIHtcbiAgICBjb25zdCBtYXRjaFBhdHRlcm4gPSAnc2Vuc29yOio6bGF0ZXN0JztcbiAgICBjb25zdCBhbGxLZXlzID0gW107XG4gICAgbGV0IGN1cnNvciA9ICcwJztcblxuICAgIHRyeSB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIFNjYW4gd2l0aCBwYXR0ZXJuIG1hdGNoaW5nXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5zY2FuKFxuICAgICAgICAgICAgICAgIGN1cnNvcixcbiAgICAgICAgICAgICAgICAnTUFUQ0gnLCBtYXRjaFBhdHRlcm4sXG4gICAgICAgICAgICAgICAgJ0NPVU5UJywgMTAwXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjdXJzb3IgPSByZXN1bHRbMF07XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gcmVzdWx0WzFdO1xuICAgICAgICAgICAgYWxsS2V5cy5wdXNoKC4uLmtleXMpO1xuXG4gICAgICAgIH0gd2hpbGUgKGN1cnNvciAhPT0gJzAnKTtcblxuICAgICAgICBtc2cucGF5bG9hZCA9IHtcbiAgICAgICAgICAgIHBhdHRlcm46IG1hdGNoUGF0dGVybixcbiAgICAgICAgICAgIGNvdW50OiBhbGxLZXlzLmxlbmd0aCxcbiAgICAgICAgICAgIGtleXM6IGFsbEtleXNcbiAgICAgICAgfTtcblxuICAgICAgICBub2RlLnNlbmQobXNnKTtcblxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBub2RlLmVycm9yKGVyciwgbXNnKTtcbiAgICB9XG59XG5cbnNjYW5LZXlzKCk7Iiwib3V0cHV0cyI6MSwidGltZW91dCI6MCwibm9lcnIiOjAsImluaXRpYWxpemUiOiIiLCJmaW5hbGl6ZSI6IiIsImxpYnMiOltdLCJ4Ijo4NjAsInkiOjEyNDAsIndpcmVzIjpbWyI0YTM5NDcwMGM2OTE0OTYxIl1dfSx7ImlkIjoiNGEzOTQ3MDBjNjkxNDk2MSIsInR5cGUiOiJkZWJ1ZyIsInoiOiJkNGY2MGM3OWVmZjUyMTFkIiwiZyI6IjAxYTk2ZmIyMDQ0ZDcyM2YiLCJuYW1lIjoiZGVidWcgOSIsImFjdGl2ZSI6dHJ1ZSwidG9zaWRlYmFyIjp0cnVlLCJjb25zb2xlIjpmYWxzZSwidG9zdGF0dXMiOmZhbHNlLCJjb21wbGV0ZSI6ImZhbHNlIiwic3RhdHVzVmFsIjoiIiwic3RhdHVzVHlwZSI6ImF1dG8iLCJ4IjoxMTQwLCJ5IjoxMjQwLCJ3aXJlcyI6W119LHsiaWQiOiJkN2M1MzkwN2Y1YjkwY2E1IiwidHlwZSI6Imdsb2JhbC1jb25maWciLCJlbnYiOltdLCJtb2R1bGVzIjp7Im5vZGUtcmVkLWNvbnRyaWItcmVkaXMiOiIxLjQuMCJ9fV0=",[2013,2014,2015],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7hpK, html code.shiki .s7hpK{--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":12,"searchDepth":151,"depth":151,"links":2017},[2018,2023,2027,2031,2035,2038],{"id":27,"depth":151,"text":28,"children":2019},[2020,2021,2022],{"id":32,"depth":168,"text":33},{"id":65,"depth":168,"text":66},{"id":198,"depth":168,"text":199},{"id":240,"depth":151,"text":241,"children":2024},[2025,2026],{"id":247,"depth":168,"text":248},{"id":331,"depth":168,"text":332},{"id":386,"depth":151,"text":387,"children":2028},[2029,2030],{"id":393,"depth":168,"text":394},{"id":518,"depth":168,"text":519},{"id":594,"depth":151,"text":595,"children":2032},[2033,2034],{"id":601,"depth":168,"text":602},{"id":657,"depth":168,"text":658},{"id":718,"depth":151,"text":719,"children":2036},[2037],{"id":725,"depth":168,"text":726},{"id":1133,"depth":151,"text":1134,"children":2039},[2040,2041,2042],{"id":1140,"depth":168,"text":1141},{"id":1187,"depth":168,"text":1188},{"id":1648,"depth":168,"text":1649},"Learn how to integrate Redis with Node-RED for fast data storage, pub\u002Fsub messaging, JSON handling, Lua scripting, and advanced Redis operations in Node-RED flows.","md",{},"\u002Fnode-red\u002Fdatabase\u002Fredis",{"title":5,"description":2043},"node-red\u002Fdatabase\u002Fredis","HLxMy-V2AZy41MUJp_lFRB1tLnQfqXHL1s1ln2Ek0R8",1780070556594]