<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aman Saxena</title>
    <description>The latest articles on DEV Community by Aman Saxena (@saxenaaman628).</description>
    <link>https://dev.to/saxenaaman628</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F642410%2Fcb72516c-77b6-4097-bc72-6c9f74e30be8.jpeg</url>
      <title>DEV Community: Aman Saxena</title>
      <link>https://dev.to/saxenaaman628</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/saxenaaman628"/>
    <language>en</language>
    <item>
      <title>The Unique Insight Behind the Binary Tree Maximum Path Sum (LeetCode 124)</title>
      <dc:creator>Aman Saxena</dc:creator>
      <pubDate>Fri, 12 Dec 2025 05:05:37 +0000</pubDate>
      <link>https://dev.to/saxenaaman628/the-unique-insight-behind-the-binary-tree-maximum-path-sum-leetcode-124-6od</link>
      <guid>https://dev.to/saxenaaman628/the-unique-insight-behind-the-binary-tree-maximum-path-sum-leetcode-124-6od</guid>
      <description>&lt;p&gt;Some coding interview problems feel routine… and then there are the ones that make you pause, sketch ideas, rethink your assumptions, and finally smile when the solution clicks.&lt;/p&gt;

&lt;p&gt;For me, Binary Tree Maximum Path Sum was exactly that kind of problem.&lt;/p&gt;

&lt;p&gt;It’s elegant.&lt;br&gt;
It’s tricky at first glance.&lt;br&gt;
And it teaches a powerful pattern used in many advanced tree problems.&lt;/p&gt;

&lt;p&gt;If you're preparing for interviews or simply enjoy algorithmic puzzles, this one is worth mastering — and here’s why.&lt;/p&gt;
&lt;h1&gt;
  
  
  Problem Link
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://leetcode.com/problems/binary-tree-maximum-path-sum/description/" rel="noopener noreferrer"&gt;LeetCode 124 — Binary Tree Maximum Path Sum&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Why This Problem Stood Out to Me
&lt;/h1&gt;

&lt;p&gt;Most tree problems ask you to compute something simple like height, depth, or sum. But this one forces you to think differently:&lt;/p&gt;

&lt;p&gt;A valid path doesn’t have to start at the root&lt;/p&gt;

&lt;p&gt;A path can end anywhere&lt;/p&gt;

&lt;p&gt;A path can go left → root → right, but cannot split upward&lt;/p&gt;

&lt;p&gt;Sometimes the best path doesn’t even include the root&lt;/p&gt;

&lt;p&gt;This combination makes the problem feel like a puzzle with multiple layers.&lt;/p&gt;

&lt;p&gt;The “Aha!” moment is when you realize:&lt;/p&gt;

&lt;p&gt;Each node must return the best one-sided path upward… but we must also track the best two-sided path that might pass through it.&lt;/p&gt;

&lt;p&gt;Once this idea settles in, the recursion becomes surprisingly clean.&lt;/p&gt;
&lt;h1&gt;
  
  
  Putting It All Together With Examples
&lt;/h1&gt;

&lt;p&gt;Once you understand the idea of one-sided paths and two-sided paths, the problem becomes much more intuitive. Here are a few examples that illustrate exactly how the recursion behaves and why the algorithm works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 1 — The Classic “V” Shape Path&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      1
     / \
    2   3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At node 1:&lt;br&gt;
  Best path going upward:&lt;br&gt;
  max(2, 3) + 1 = 4&lt;/p&gt;

&lt;p&gt;Best through this node:&lt;br&gt;
  2 + 1 + 3 = 6&lt;/p&gt;

&lt;p&gt;Maximum Path Sum = 6&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 2 — When Negatives Force Interesting Choices&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       -10
       /  \
      9   20
         /  \
        15   7

15 → 20 → 7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At node 20:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one-sided upward path: 20 + max(15, 7) = 35&lt;/li&gt;
&lt;li&gt;two-sided local path: 15 + 20 + 7 = 42 ← candidate answer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The global maximum becomes 42, even though the root is negative.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 3 — Best Path Doesn’t Always Linear&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        5
       / \
     4    8
    /    / \
   11   13  4
  /  \       \
 7    2       1

7 → 11 → 4 → 5 → 8 → 13
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sum = 48&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All Negative Values&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;     -8
     / \
   -3  -6
       / \
     -9  -2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sum = -2&lt;/p&gt;

&lt;h1&gt;
  
  
  The Core Idea Behind the Solution
&lt;/h1&gt;

&lt;p&gt;Once you look at enough examples, the entire problem boils down to just two questions at every node:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is the best path I can send upward?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This must be one-sided (left → node or node → right).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;one_sided = node.val + max(left_gain, right_gain)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But if a side is negative, we drop it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;left_gain = max(dfs(left), 0)
right_gain = max(dfs(right), 0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;What is the best path that passes through this node?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is where both sides can be used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;two_sided = left_gain + node.val + right_gain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This value updates the global maximum — but we never return it upward.&lt;/p&gt;

&lt;p&gt;That’s the whole trick.&lt;/p&gt;

&lt;h1&gt;
  
  
  Final Solution
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
 * right(right) {}
 * };
 */
class Solution {
public:
    int helper(TreeNode* root, int&amp;amp; maxVal) {
        if (!root) {
            return 0;
        }
        int leftPath = helper(root-&amp;gt;left, maxVal);
        int rightPath = helper(root-&amp;gt;right, maxVal);

        int pathVal = root-&amp;gt;val + max(0, leftPath) + max(0, rightPath);
        maxVal = max(pathVal, maxVal);

        return root-&amp;gt;val + max(max(0, leftPath), max(0, rightPath));
    }
    int maxPathSum(TreeNode* root) {
        if (root == NULL) {
            return 0;
        }
        int maxVal = INT_MIN;
        helper(root, maxVal);
        return maxVal;
    }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>algorithms</category>
      <category>leetcode</category>
      <category>programming</category>
      <category>software</category>
    </item>
    <item>
      <title>The Sliding Window Problem That Taught Me How to Think</title>
      <dc:creator>Aman Saxena</dc:creator>
      <pubDate>Fri, 05 Dec 2025 16:15:53 +0000</pubDate>
      <link>https://dev.to/saxenaaman628/the-sliding-window-problem-that-taught-me-how-to-think-44lm</link>
      <guid>https://dev.to/saxenaaman628/the-sliding-window-problem-that-taught-me-how-to-think-44lm</guid>
      <description>&lt;p&gt;It’s been &lt;strong&gt;five years&lt;/strong&gt; since I last touched competitive programming.&lt;br&gt;
Five years since staying up late solving problems just because they were beautiful —&lt;br&gt;
since feeling that unique mix of frustration and excitement only algorithms can give.&lt;/p&gt;

&lt;p&gt;Life got busy. Work changed. I moved on.&lt;/p&gt;

&lt;p&gt;But recently, I decided to return.&lt;br&gt;
Not as a student grinding contests, but as a developer trying to reconnect with the simple joy of thinking deeply again.&lt;/p&gt;

&lt;p&gt;And the very first problem that reminded me why I loved competitive programming was:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://leetcode.com/problems/minimum-window-substring/description/" rel="noopener noreferrer"&gt;&lt;strong&gt;Minimum Window Substring&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A simple-looking question that gave me more than a challenge— it gave me clarity, humility, and honestly… a spark I had missed.&lt;/p&gt;


&lt;h2&gt;
  
  
  Returning After Years: The Strange Mix of Rust and Curiosity
&lt;/h2&gt;

&lt;p&gt;Coming back to CP after years felt weird.&lt;/p&gt;

&lt;p&gt;My fingers knew how to type fast, but my brain didn’t fire the way it used to.&lt;/p&gt;

&lt;p&gt;Problems I would have solved in minutes now took me an hour.&lt;br&gt;&lt;br&gt;
I found myself overthinking simple cases, hesitating with patterns I once memorized.&lt;/p&gt;

&lt;p&gt;But in that discomfort, something awakened:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I wasn’t here to be fast anymore.&lt;br&gt;
I was here to enjoy thinking again.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that mindset made this problem—of all problems—hit differently.&lt;/p&gt;


&lt;h2&gt;
  
  
  How Minimum Window Substring Helped Me Think Better Again
&lt;/h2&gt;

&lt;p&gt;At first glance, the problem seems mechanical:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Given strings &lt;code&gt;s&lt;/code&gt; and &lt;code&gt;t&lt;/code&gt;, find the smallest substring of &lt;code&gt;s&lt;/code&gt; containing all chars of &lt;code&gt;t&lt;/code&gt;.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But solving it required something I had lost over the years:&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;the ability to break a problem down slowly, clearly, and logically.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I tried brute force.&lt;br&gt;
I tried hashing.&lt;br&gt;
I tried clever tricks that were, honestly, not clever at all.&lt;/p&gt;

&lt;p&gt;Nothing worked.&lt;/p&gt;

&lt;p&gt;Until one moment, when a simple idea clicked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This isn’t a substring problem.&lt;br&gt;
It’s a &lt;strong&gt;debt repayment&lt;/strong&gt; problem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And suddenly the entire algorithm unfolded in front of me.&lt;/p&gt;

&lt;p&gt;That feeling—the sudden clarity after hours of confusion— is exactly why returning to CP was worth it.&lt;/p&gt;


&lt;h2&gt;
  
  
  Understanding the Debt Analogy (The Key Insight)
&lt;/h2&gt;

&lt;p&gt;For t = "ABC" we “owe”:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A:1 B:1 C:1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we slide a window across s from left to right.&lt;/p&gt;

&lt;p&gt;Every time we encounter a needed character,&lt;br&gt;
we pay off a part of our debt.&lt;/p&gt;

&lt;p&gt;When the debt becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A:0 B:0 C:0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;We have a valid window.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But valid is not enough—we want the minimum window.&lt;br&gt;
So we try shrinking from the left until the window breaks again.&lt;/p&gt;

&lt;p&gt;That balance—expanding greedily, shrinking optimally—&lt;br&gt;
is the core beauty of this problem.&lt;/p&gt;


&lt;h2&gt;
  
  
  A Simple Diagram That Helped Everything Click
&lt;/h2&gt;

&lt;p&gt;What finally made this problem “click” for me was watching the sliding window evolve across the string — not just a single moment.&lt;br&gt;
The window goes through a complete cycle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expand until valid -&amp;gt; Shrink to find local minimum -&amp;gt; Expand again -&amp;gt; Shrink again -&amp;gt; Repeat until the end&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Take the smallest valid window ever seen&lt;/p&gt;

&lt;p&gt;Here’s the full walkthrough for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;s = A D O B E C O D E B A N C
t = A B C

Step 1:
[A]                   Debt: A0 B1 C1

Step 2:
[A D O B]             Debt: A0 B0 C1

Step 3:
[A D O B E C]         Debt: A0 B0 C0   ✓ First valid window

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We finally satisfied all characters in t.&lt;br&gt;
Now time to shrink&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Window: [A D O B E C]
         ^
remove A → Debt: A1 B0 C0  → invalid

ADOBEC   (length 6)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Store it and keep moving.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[D O B E C O]
[D O B E C O D]
[D O B E C O D E]
[D O B E C O D E B]

[D O B E C O D E B A]   Debt: A0 B0 C0 → valid again

#shrink
[D O B E C O D E B A]
 ^
remove D → still valid
[O B E C O D E B A]
 ^
remove O → still valid
[B E C O D E B A]
 ^
remove B → Debt: B1 → invalid
BECODEBA  (length 8)

#continue
[E C O D E B A N C]
[B A N C] → valid (Debt satisfied)
[B A N C]
^
remove B → Debt: B1 → invalid
BANC   (length 4)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the global minimum across the whole string.&lt;/p&gt;

&lt;p&gt;When you watch the window "breathe"—expanding and shrinking—&lt;br&gt;
you start to feel the algorithm working.&lt;br&gt;
And that feeling is something CP had trained me to pay attention to years ago.&lt;/p&gt;




&lt;h2&gt;
  
  
  C++ Solution (Sliding Window + Frequency Count)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Solution {
public:
    string minWindow(string s, string t) {
        int m = s.length(), n = t.length();
        if (m &amp;lt; n)
            return "";

        unordered_map&amp;lt;char, int&amp;gt; need;
        for (char c : t)
            need[c]++;
        int required = need.size(); // these are required
        // this to create window
        unordered_map&amp;lt;char, int&amp;gt; window;
        int formed = 0;

        int left = 0, right = 0;
        int minLen = INT_MAX, start = 0;
        while (right &amp;lt; m) {
            char c = s[right];
            window[c]++;

            // check count in need map
            if (need.count(c) &amp;amp;&amp;amp; window[c] == need[c]) {
                formed++;
            }
            // once made a window we reduce it
            while (left &amp;lt;= right &amp;amp;&amp;amp; formed == required) {
                if ((right - left + 1) &amp;lt; minLen) {
                    minLen = right - left + 1;
                    start = left;
                }
                char d = s[left];
                window[d]--;
                if (need.count(d) &amp;amp;&amp;amp; window[d] &amp;lt; need[d])
                    formed--;

                left++;
            }
            right++;
        }
        return minLen == INT_MAX ? "" : s.substr(start, minLen);
    }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>algorithms</category>
      <category>cpp</category>
      <category>leetcode</category>
      <category>programming</category>
    </item>
    <item>
      <title>From Contributor to Connector: What Hacktoberfest 2025 Taught Me</title>
      <dc:creator>Aman Saxena</dc:creator>
      <pubDate>Thu, 16 Oct 2025 08:12:11 +0000</pubDate>
      <link>https://dev.to/saxenaaman628/from-contributor-to-connector-what-hacktoberfest-2025-taught-me-5ec0</link>
      <guid>https://dev.to/saxenaaman628/from-contributor-to-connector-what-hacktoberfest-2025-taught-me-5ec0</guid>
      <description>&lt;p&gt;For the last few years, Hacktoberfest has been my excuse to dive into code — fixing bugs, improving docs, and contributing to projects like &lt;a href="https://github.com/open-policy-agent/opa" rel="noopener noreferrer"&gt;&lt;strong&gt;Open Policy Agent&lt;/strong&gt;&lt;/a&gt;, &lt;strong&gt;Ortelius&lt;/strong&gt;, and &lt;strong&gt;Real Dev Squad&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;But this year, I decided to take a step back.&lt;br&gt;&lt;br&gt;
No code, no pull requests — just conversations.  &lt;/p&gt;

&lt;p&gt;I spent Hacktoberfest 2025 talking to people about open source.&lt;br&gt;&lt;br&gt;
How they could start, where to look, and most importantly, &lt;em&gt;why&lt;/em&gt; it matters.  &lt;/p&gt;

&lt;p&gt;And honestly, it changed how I look at contribution.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3vcykwcsd05ufdy486qp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3vcykwcsd05ufdy486qp.jpg" alt="Its truley for everyone" width="768" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open source isn’t only powered by code — it’s powered by people. The ones who write, test, review, design, or simply encourage someone else to try. Watching someone make their first contribution after a quick chat felt just as good as merging my own PR. &lt;/p&gt;

&lt;p&gt;I realized that being part of open source isn’t just about what you build — it’s about who you bring along.  &lt;/p&gt;

&lt;p&gt;So if you’re joining next year, start wherever you can.&lt;br&gt;&lt;br&gt;
Write, review, share, guide, or even just ask questions.&lt;br&gt;&lt;br&gt;
Because open source grows when more people feel they belong — and sometimes, the best way to contribute is to help someone else begin.  &lt;/p&gt;




&lt;p&gt;&lt;em&gt;This Hacktoberfest reminded me that contribution isn’t always code — sometimes, it’s connection.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
    <item>
      <title>A Real-Time, High-Performance Voting Platform</title>
      <dc:creator>Aman Saxena</dc:creator>
      <pubDate>Sat, 02 Aug 2025 15:31:09 +0000</pubDate>
      <link>https://dev.to/saxenaaman628/a-real-time-high-performance-voting-platform-4lm9</link>
      <guid>https://dev.to/saxenaaman628/a-real-time-high-performance-voting-platform-4lm9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/redis-2025-07-23"&gt;Redis AI Challenge&lt;/a&gt;: Beyond the Cache&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built a real-time voting system using Go (Gin) and Redis 8, designed to handle live user interactions during high-traffic events like sports matches, elections, or social debates.&lt;br&gt;
Create &amp;amp; manage polls with multiple options and expiry time.&lt;br&gt;
&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JWT-based authentication for users with role-based access (admin vs. regular users).&lt;/li&gt;
&lt;li&gt;Vote tracking per user to prevent multiple submissions.&lt;/li&gt;
&lt;li&gt;Real-time vote count updates using Redis Pub/Sub.&lt;/li&gt;
&lt;li&gt;Admin-only controls to close or delete polls.&lt;/li&gt;
&lt;li&gt;Fetch all polls with vote stats via a dedicated API.&lt;/li&gt;
&lt;li&gt;Designed to scale horizontally with Redis Sets, Hashes, and Streams (planned).&lt;/li&gt;
&lt;li&gt;Integration with genAI for real-time questions for polls, according to the events.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Design
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8o5jfj6lwkh9fzklseba.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8o5jfj6lwkh9fzklseba.png" alt=" " width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Repo
&lt;/h2&gt;

&lt;p&gt;link :- &lt;a href="https://github.com/saxenaaman628/redis-voting-system" rel="noopener noreferrer"&gt;https://github.com/saxenaaman628/redis-voting-system&lt;/a&gt; (in progress)&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Redis 8
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Redis Hashes for Poll Metadata &amp;amp; Vote Counts&lt;/li&gt;
&lt;li&gt;Redis Sets for Preventing Duplicate Votes&lt;/li&gt;
&lt;li&gt;Redis Pub/Sub for Real-time Vote Updates&lt;/li&gt;
&lt;li&gt;TTL on Poll Hashes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Contributors
&lt;/h2&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/paaart"&gt;@paaart&lt;/a&gt; &lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/jigyasa_saxena_9cca661789"&gt;@jigyasa_saxena_9cca661789&lt;/a&gt; &lt;/p&gt;

</description>
      <category>redischallenge</category>
      <category>devchallenge</category>
      <category>database</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
