{"id":26477,"date":"2020-09-16T00:00:00","date_gmt":"2020-09-15T22:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=26477"},"modified":"2021-05-21T20:12:16","modified_gmt":"2021-05-21T18:12:16","slug":"riedisegnamo-il-publish-subscribe-con-redis","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/","title":{"rendered":"\u201cR(i)edisegnamo\u201d il Publish\/Subscribe con Redis"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"26445\" data-permalink=\"https:\/\/blexin.com\/it\/01-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/01.png?fit=1024%2C608&amp;ssl=1\" data-orig-size=\"1024,608\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"01\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/01.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/01.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-26445\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/01.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/01-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/01-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Recentemente ho avuto l\u2019opportunit\u00e0 di lavorare per un nostro cliente con un\u2019applicazione che faceva uso di&nbsp;<a href=\"https:\/\/redis.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Redis<\/a>. Confrontandomi con i colleghi e studiandone la documentazione ho scoperto che anche questo strumento poteva essere utilizzato per disaccoppiare la comunicazione in un sistema software. Cos\u00ec, spinto dalla curiosit\u00e0, ho cercato di capire meglio cosa fosse e come potevo utilizzarlo come&nbsp;<em>messaging system<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Redis prende il nome da&nbsp;<strong>Re<\/strong>mote&nbsp;<strong>Di<\/strong>ctionary&nbsp;<strong>S<\/strong>erver ed \u00e8 definito come un data store in memoria. Di base, \u00e8 un database del tipo key-value store, per cui la memorizzazione dei dati prevede una chiave tramite la quale si identifica un valore all\u2019interno del database. Sono supportati diversi tipi per i valori associati alle chiavi, infatti possiamo avere, oltre le solite stringhe, anche tipi di dati strutturati come liste e insiemi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per sperimentare con Redis senza installarlo sulla nostra macchina, possiamo utilizzare un container&nbsp;<em>Docker<\/em>&nbsp;con il comando seguente:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\ndocker run \u2013name redis-pubsub -p 6379:6379 -d redis\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"682\" height=\"278\" data-attachment-id=\"26447\" data-permalink=\"https:\/\/blexin.com\/it\/image0\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image0.png?fit=682%2C278&amp;ssl=1\" data-orig-size=\"682,278\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image0\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image0.png?fit=682%2C278&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image0.png?resize=682%2C278&#038;ssl=1\" alt=\"\" class=\"wp-image-26447\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image0.png 682w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image0-480x196.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 682px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Per scaldarci, vediamo come possiamo salvare informazioni di tipo chiave\/valore utilizzando la<a rel=\"noreferrer noopener\" href=\"https:\/\/redis.io\/topics\/rediscli\" target=\"_blank\">&nbsp;redis-cli<\/a>, uno strumento molto potente fornito a corredo. Vediamo, in particolare, i comandi&nbsp;<strong>SET&nbsp;<\/strong>e&nbsp;<strong>GET&nbsp;<\/strong>per salvare e ottenere il valore salvato tramite la chiave:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"558\" height=\"112\" data-attachment-id=\"26449\" data-permalink=\"https:\/\/blexin.com\/it\/image1\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image1.png?fit=558%2C112&amp;ssl=1\" data-orig-size=\"558,112\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image1.png?fit=558%2C112&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image1.png?resize=558%2C112&#038;ssl=1\" alt=\"\" class=\"wp-image-26449\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image1.png 558w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image1-480x96.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 558px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019uso pi\u00f9 diffuso di Redis \u00e8 quello come database o come cache, in particolare quando c\u2019\u00e8 necessit\u00e0 di accedere rapidamente a dati semplici sfruttando cos\u00ec la velocit\u00e0 della memoria centrale (\u00e8 prevista comunque la possibilit\u00e0 di persistere i dati).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dalla versione 2.0 per\u00f2, sono stati introdotti nuovi comandi per la redis-cli che consentono di realizzare il pattern publish\/subscribe. Di questo pattern ho parlato ampiamente negli articoli precedenti (ad esempio in&nbsp;<a href=\"https:\/\/www.blexin.com\/it-IT\/Article\/Blog\/Disaccoppiare-la-comunicazione-con-RabbitMQ-40\" target=\"_blank\" rel=\"noreferrer noopener\">questo<\/a>) e quindi ci concentreremo su come possa essere realizzato usando Redis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Semplicemente, \u00e8 previsto che un&nbsp;<em>Subscriber&nbsp;<\/em>interessato ad un determinato&nbsp;<em>topic<\/em>&nbsp;possa sottoscriversi al relativo&nbsp;<em>Channel&nbsp;<\/em>in attesa che un&nbsp;<em>Publisher<\/em>&nbsp;ci pubblichi informazioni. I client, siano essi publisher o subscriber, si connettono a Redis tramite una connessione TCP e comunicano con il Redis Server mediante il protocollo&nbsp;<a href=\"https:\/\/redis.io\/topics\/protocol#array-reply\" target=\"_blank\" rel=\"noreferrer noopener\">RESP<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Redis utilizza una&nbsp;<em>hash table<\/em>&nbsp;allocata in memoria per tenere traccia dei nomi dei canali e dei relativi subscriber. Quando un nuovo subscriber si vuole sottoscrivere al canale viene fatto l\u2019hash di quest\u2019ultimo per individuare la lista dei suoi subscriber e il nuovo viene aggiunto a questa. Allo stesso modo, in caso di publish, viene recuperata la lista dei subscriber di un canale e per ognuno di essi sar\u00e0 recapitato il messaggio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per mostrare un esempio di utilizzo di questa funzionalit\u00e0, ho creato un semplice progetto in cui abbiamo un client (<strong>FeedRssClient<\/strong>) tramite il quale un utente pu\u00f2 richiedere la sottoscrizione ad un feed&nbsp;<em>Rss<\/em>&nbsp;ed un&nbsp;<strong>FeedRssPublisher<\/strong>&nbsp;che riceve dal client l\u2019<em>URL<\/em>&nbsp;del feed, lo elabora e ne pubblica i contenuti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per fare questo ho utilizzato due&nbsp;<em>application console<\/em>&nbsp;in&nbsp;<em>.NET Core<\/em>.&nbsp;Come client Redis ho utilizzato la libreria&nbsp;<a href=\"https:\/\/stackexchange.github.io\/StackExchange.Redis\/\" target=\"_blank\" rel=\"noreferrer noopener\">StackExchange.Redis<\/a>&nbsp;disponibile come pacchetto&nbsp;<em>Nuget<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Partiamo da&nbsp;<strong>FeedRssClient:<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nusing StackExchange.Redis;\nusing System;\n \nnamespace FeedRssClient\n{\n    class Program\n    {\n        private const string RedisConnectionString = &quot;localhost&quot;;\n        private static ConnectionMultiplexer connection = ConnectionMultiplexer.Connect(RedisConnectionString);\n        private const string publishChannel = &quot;client-channel&quot;;\n        private const string subscriberChannel = &quot;rss-channel&quot;;\n        private static string feedUrl = string.Empty;\n \n        static void Main()\n        {\n            Console.WriteLine(&quot;FeedRssClient\\r\\n&quot;);\n            Console.WriteLine($&quot;Please enter the RSS feed that you want to follow: &quot;);\n            feedUrl = Console.ReadLine();\n \n            var pubSubConnection = connection.GetSubscriber();\n \n            pubSubConnection.Publish(publishChannel, $&quot;{feedUrl}&quot;);\n            var subscriberChannelMessageQueue = pubSubConnection.Subscribe(subscriberChannel);\n            Console.WriteLine($&quot;List of content: \\r\\n&quot;);\n            subscriberChannelMessageQueue.OnMessage(message =&gt;\n            {\n                Console.WriteLine(message);\n            });\n            Console.ReadLine();\n        }\n    }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Per prima cosa instauriamo una connessione verso il container Redis creato in precedenza tramite il metodo&nbsp;<em>Connect()&nbsp;<\/em>della ConnectionMultiplexer. Il connection multiplexer \u00e8 un elemento fondamentale fornito dalla libreria StackExchange che consente di accedere al database Redis oppure di sfruttare le funzionalit\u00e0 di publish\/subscribe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Definiamo due channel: il primo,&nbsp;<strong>client-channel<\/strong>, sar\u00e0 quello dove il FeedRssClient in questione andr\u00e0 a pubblicare l\u2019indirizzo del feed Rss a cui vuole sottoscriversi; il secondo,&nbsp;<strong>rss-channel<\/strong>, \u00e8 il canale a cui il FeedRssClient si sottoscriver\u00e0.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il metodo&nbsp;<em>OnMessage()<\/em>&nbsp;del canale di sottoscrizione fa in modo che vengano letti in maniera sequenziale i messaggi ricevuti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se non c\u2019\u00e8 necessit\u00e0 di ricevere i messaggi in ordine, \u00e8 possibile utilizzare anche la versione concorrente di questo metodo, molto pi\u00f9 performante nel caso i messaggi non abbiano correlazione tra loro.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vediamo adesso il&nbsp;<strong>FeedRssPublisher<\/strong>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nusing Microsoft.Toolkit.Parsers.Rss;\nusing StackExchange.Redis;\nusing System;\nusing System.Collections.Generic;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n \nnamespace FeedRssPublisher\n{\n    class Program\n    {\n        private const string RedisConnectionString = &quot;localhost&quot;;\n        private static ConnectionMultiplexer connection = ConnectionMultiplexer.Connect(RedisConnectionString);\n        private const string publishChannel = &quot;rss-channel&quot;;\n        private const string subscriberChannel = &quot;client-channel&quot;;\n \n        static void Main()\n        {\n            Console.WriteLine(&quot;FeedRssPublisher\\r\\n&quot;);\n            var feed = new Feed();\n            var pubSubConnection = connection.GetSubscriber();\n            var feedUrl = string.Empty;\n            var subscriberChannelMessageQueue = pubSubConnection.Subscribe(subscriberChannel);\n \n            subscriberChannelMessageQueue.OnMessage(async message =&gt;\n            {\n                feedUrl = message.ToString().Remove(0, subscriberChannel.Length + 1);\n                var rss = await feed.ParseRSSAsync(feedUrl);\n                Console.WriteLine($&quot;Feed Received: {feedUrl}\\r\\n&quot;);\n                if (rss != null)\n                {\n                    Console.WriteLine(&quot;Start publishing contents ...&quot;);\n                    foreach (var item in rss)\n                    {\n                        pubSubConnection.Publish(publishChannel, $&quot;{item.Title}&quot; + $&quot;\\r\\n{item.Summary}&quot; + $&quot;\\r\\n{item.FeedUrl}\\r\\n&quot;);\n                    }\n                }\n            });\n \n            Console.ReadLine();\n \n        }\n \n        class Feed\n        {\n            public async Task&lt;IEnumerable&lt;RssSchema&gt;&gt; ParseRSSAsync(string feed)\n            {\n                IEnumerable&lt;RssSchema&gt; rss = null;\n \n                using (var client = new HttpClient())\n                {\n                    try\n                    {\n                        feed = await client.GetStringAsync(feed);\n                    }\n                    catch (Exception)\n                    {\n                        throw;\n                    }\n                }\n \n                if (feed != null)\n                {\n                    var parser = new RssParser();\n                    rss = parser.Parse(feed);\n                }\n \n                return rss;\n            }\n        }\n    }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Anche in questo caso, creiamo una connessione verso il container Redis e definiamo i due channel che, in questo caso, avranno i ruoli invertiti rispetto al FeedRssClient.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Infatti, il FeedRssPublisher pubblicher\u00e0 i messaggi sul channel&nbsp;<strong>rss-channel<\/strong>&nbsp;mentre si sottoscriver\u00e0 al channel&nbsp;<strong>client-channel<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Subito dopo la sottoscrizione all\u2019interno del metodo&nbsp;<em>OnMessage()<\/em>&nbsp;vengono estratti i feed RSS mediante l\u2019utilizzo della classe&nbsp;<em>Feed&nbsp;<\/em>e successivamente per ogni feed andiamo a pubblicarne il&nbsp;<em>titolo<\/em>, il&nbsp;<em>summary<\/em>&nbsp;e l\u2019<em>URL<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Proviamo i due client con il feed RSS del nostro blog <a href=\"https:\/\/www.blexin.com\/rssfeed\/articles?lang=en-US\" rel=\"nofollow\">https:\/\/www.blexin.com\/rssfeed\/articles?lang=en-US<\/a>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"468\" height=\"148\" data-attachment-id=\"26452\" data-permalink=\"https:\/\/blexin.com\/it\/image2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image2.png?fit=468%2C148&amp;ssl=1\" data-orig-size=\"468,148\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image2.png?fit=468%2C148&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image2.png?resize=468%2C148&#038;ssl=1\" alt=\"\" class=\"wp-image-26452\" srcset=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image2.png?w=468&amp;ssl=1 468w, https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image2.png?resize=300%2C95&amp;ssl=1 300w\" sizes=\"auto, (max-width: 468px) 100vw, 468px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il publisher riceve l\u2019URL del feed RSS e inizia a pubblicarne i contenuti:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"548\" height=\"119\" data-attachment-id=\"26455\" data-permalink=\"https:\/\/blexin.com\/it\/image3\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image3.png?fit=548%2C119&amp;ssl=1\" data-orig-size=\"548,119\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image3\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image3.png?fit=548%2C119&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image3.png?resize=548%2C119&#038;ssl=1\" alt=\"\" class=\"wp-image-26455\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image3.png 548w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image3-480x104.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 548px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il client riceve la lista dei contenuti:&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1016\" height=\"812\" data-attachment-id=\"26457\" data-permalink=\"https:\/\/blexin.com\/it\/image4\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image4.png?fit=1016%2C812&amp;ssl=1\" data-orig-size=\"1016,812\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image4\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image4.png?fit=1016%2C812&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image4.png?resize=1016%2C812&#038;ssl=1\" alt=\"\" class=\"wp-image-26457\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image4.png 1016w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image4-980x783.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image4-480x384.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1016px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Possiamo naturalmente utilizzare anche la redis-cli per la sottoscrizione al channel&nbsp;<strong>rss-channel<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"888\" height=\"522\" data-attachment-id=\"26459\" data-permalink=\"https:\/\/blexin.com\/it\/image6\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image6.png?fit=888%2C522&amp;ssl=1\" data-orig-size=\"888,522\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image6\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image6.png?fit=888%2C522&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image6.png?resize=888%2C522&#038;ssl=1\" alt=\"\" class=\"wp-image-26459\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image6.png 888w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image6-480x282.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 888px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Come abbiamo visto dall\u2019esempio \u00e8 molto semplice realizzare il pattern publish\/subscribe con Redis ed ottenere un sistema software disaccoppiato.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019uso di Redis consente di ottenere un sistema di messaggistica snello e performante sia per la natura in-memory di Redis che per la scalabilit\u00e0 ovvero la possibilit\u00e0 di configurarlo in maniera distribuita.<br>Ad esempio, il meccanismo di Pub\/Sub \u00e8 molto utilizzato nell\u2019ambito delle applicazioni real-time. Si pensi, ad esempio, alle chat room o a quegli scenari applicativi in cui bisogna convogliare una grande mole di dati (<em>data ingestion<\/em>) e processare questi grossi volumi a grande velocit\u00e0 (<em>stream processing<\/em>). Un altro esempio interessante, che vedremo in un prossimo articolo, \u00e8 la possibilit\u00e0 di usare Redis per scalare applicazioni&nbsp;<a href=\"https:\/\/blazordev.it\/blazor\/intro\/2020\/02\/14\/blazorserver-vs-blazorwebassembly.html\" target=\"_blank\" rel=\"noreferrer noopener\">ASP.NET Core SignalR<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tuttavia, c\u2019\u00e8 da considerare che questo meccanismo appena visto \u00e8 di tipo&nbsp;<em>fire &amp; forget<\/em>&nbsp;e non prevede quindi nessuna persistenza per i messaggi con conseguente impossibilit\u00e0 di recuperarli in caso di disconnessione di un client.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Spero che questa funzionalit\u00e0 di Redis vi possa essere utile.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vi lascio il link del&nbsp;<a href=\"https:\/\/github.com\/intersect88\/RedisPubSub\" target=\"_blank\" rel=\"noreferrer noopener\">repository GitHub<\/a>&nbsp;dove potete trovare il codice utilizzato per l\u2019esempio e i riferimenti utilizzati:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/redis.io\/topics\/pubsub\">https:\/\/redis.io\/topics\/pubsub<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/making.pusher.com\/redis-pubsub-under-the-hood\">https:\/\/making.pusher.com\/redis-pubsub-under-the-hood<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al prossimo articolo!<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Redis non \u00e8 solo un key-value store ottimo per il caching ma pu\u00f2 essere utilizzato anche come broker di messaggi: vediamo come!<\/p>\n","protected":false},"author":196716251,"featured_media":26445,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_crdt_document":"","inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[688637374],"tags":[688637541,688637545],"class_list":["post-26477","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-dotnetcore","tag-docker"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u201cR(i)edisegnamo\u201d il Publish\/Subscribe con Redis - Blexin<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u201cR(i)edisegnamo\u201d il Publish\/Subscribe con Redis - Blexin\" \/>\n<meta property=\"og:description\" content=\"Redis non \u00e8 solo un key-value store ottimo per il caching ma pu\u00f2 essere utilizzato anche come broker di messaggi: vediamo come!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2020-09-15T22:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-05-21T18:12:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/01.png?fit=1024%2C608&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"608\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Genny Paudice\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Genny Paudice\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/riedisegnamo-il-publish-subscribe-con-redis\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/riedisegnamo-il-publish-subscribe-con-redis\\\/\"},\"author\":{\"name\":\"Genny Paudice\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/ae0e97a3ebb79d2f73e4411c1eb28973\"},\"headline\":\"\u201cR(i)edisegnamo\u201d il Publish\\\/Subscribe con Redis\",\"datePublished\":\"2020-09-15T22:00:00+00:00\",\"dateModified\":\"2021-05-21T18:12:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/riedisegnamo-il-publish-subscribe-con-redis\\\/\"},\"wordCount\":1002,\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/riedisegnamo-il-publish-subscribe-con-redis\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/01.png?fit=1024%2C608&ssl=1\",\"keywords\":[\".NetCore\",\"Docker\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/riedisegnamo-il-publish-subscribe-con-redis\\\/\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/riedisegnamo-il-publish-subscribe-con-redis\\\/\",\"name\":\"\u201cR(i)edisegnamo\u201d il Publish\\\/Subscribe con Redis - Blexin\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/riedisegnamo-il-publish-subscribe-con-redis\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/riedisegnamo-il-publish-subscribe-con-redis\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/01.png?fit=1024%2C608&ssl=1\",\"datePublished\":\"2020-09-15T22:00:00+00:00\",\"dateModified\":\"2021-05-21T18:12:16+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/ae0e97a3ebb79d2f73e4411c1eb28973\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/riedisegnamo-il-publish-subscribe-con-redis\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/riedisegnamo-il-publish-subscribe-con-redis\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/riedisegnamo-il-publish-subscribe-con-redis\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/01.png?fit=1024%2C608&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/01.png?fit=1024%2C608&ssl=1\",\"width\":1024,\"height\":608},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/riedisegnamo-il-publish-subscribe-con-redis\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blexin.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u201cR(i)edisegnamo\u201d il Publish\\\/Subscribe con Redis\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blexin.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/ae0e97a3ebb79d2f73e4411c1eb28973\",\"name\":\"Genny Paudice\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g\",\"caption\":\"Genny Paudice\"},\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/author\\\/genny-paudiceblexin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u201cR(i)edisegnamo\u201d il Publish\/Subscribe con Redis - Blexin","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/","og_locale":"it_IT","og_type":"article","og_title":"\u201cR(i)edisegnamo\u201d il Publish\/Subscribe con Redis - Blexin","og_description":"Redis non \u00e8 solo un key-value store ottimo per il caching ma pu\u00f2 essere utilizzato anche come broker di messaggi: vediamo come!","og_url":"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/","og_site_name":"Blexin","article_published_time":"2020-09-15T22:00:00+00:00","article_modified_time":"2021-05-21T18:12:16+00:00","og_image":[{"width":1024,"height":608,"url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/01.png?fit=1024%2C608&ssl=1","type":"image\/png"}],"author":"Genny Paudice","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Genny Paudice","Tempo di lettura stimato":"6 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/"},"author":{"name":"Genny Paudice","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/ae0e97a3ebb79d2f73e4411c1eb28973"},"headline":"\u201cR(i)edisegnamo\u201d il Publish\/Subscribe con Redis","datePublished":"2020-09-15T22:00:00+00:00","dateModified":"2021-05-21T18:12:16+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/"},"wordCount":1002,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/01.png?fit=1024%2C608&ssl=1","keywords":[".NetCore","Docker"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/","url":"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/","name":"\u201cR(i)edisegnamo\u201d il Publish\/Subscribe con Redis - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/01.png?fit=1024%2C608&ssl=1","datePublished":"2020-09-15T22:00:00+00:00","dateModified":"2021-05-21T18:12:16+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/ae0e97a3ebb79d2f73e4411c1eb28973"},"breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/01.png?fit=1024%2C608&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/01.png?fit=1024%2C608&ssl=1","width":1024,"height":608},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"\u201cR(i)edisegnamo\u201d il Publish\/Subscribe con Redis"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/it\/#website","url":"https:\/\/blexin.com\/it\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/ae0e97a3ebb79d2f73e4411c1eb28973","name":"Genny Paudice","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g","caption":"Genny Paudice"},"url":"https:\/\/blexin.com\/it\/author\/genny-paudiceblexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/01.png?fit=1024%2C608&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-6T3","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/26477","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/users\/196716251"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=26477"}],"version-history":[{"count":10,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/26477\/revisions"}],"predecessor-version":[{"id":31503,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/26477\/revisions\/31503"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/26445"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=26477"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=26477"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=26477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}