<?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: Ahmed Raza Idrisi</title>
    <description>The latest articles on DEV Community by Ahmed Raza Idrisi (@ahmedraza_fyntune).</description>
    <link>https://dev.to/ahmedraza_fyntune</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%2F2533524%2F63d54c29-49fc-4cf7-8a18-18a098084828.png</url>
      <title>DEV Community: Ahmed Raza Idrisi</title>
      <link>https://dev.to/ahmedraza_fyntune</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ahmedraza_fyntune"/>
    <language>en</language>
    <item>
      <title>Using Redis for API Caching in Go (Speed Up Your Backend)</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Sat, 09 May 2026 13:15:34 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/using-redis-for-api-caching-in-go-speed-up-your-backend-3nfc</link>
      <guid>https://dev.to/ahmedraza_fyntune/using-redis-for-api-caching-in-go-speed-up-your-backend-3nfc</guid>
      <description>&lt;p&gt;After building APIs in Go, the next big question is:&lt;/p&gt;

&lt;p&gt;👉 How do you make them faster?&lt;/p&gt;

&lt;p&gt;This is where Redis comes in.&lt;/p&gt;

&lt;p&gt;In this post, we’ll:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connect Go with Redis&lt;/li&gt;
&lt;li&gt;Cache API responses&lt;/li&gt;
&lt;li&gt;Reduce database load&lt;/li&gt;
&lt;li&gt;Improve performance&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 What is Redis?
&lt;/h2&gt;

&lt;p&gt;Redis is an in-memory database used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caching&lt;/li&gt;
&lt;li&gt;Sessions&lt;/li&gt;
&lt;li&gt;Queues&lt;/li&gt;
&lt;li&gt;Real-time systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of Redis like:&lt;br&gt;
👉 “Super-fast temporary storage”&lt;/p&gt;

&lt;p&gt;Instead of hitting PostgreSQL every time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First request → DB&lt;/li&gt;
&lt;li&gt;Next requests → Redis cache ⚡&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  ⚙️ Install Redis Package
&lt;/h2&gt;



&lt;p&gt;```bash id="gq78f0"&lt;br&gt;
go get github.com/redis/go-redis/v9&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 📦 Connect Redis



```go id="lb7m2n"
package main

import (
    "context"
    "github.com/redis/go-redis/v9"
)

var ctx = context.Background()

var rdb = redis.NewClient(&amp;amp;redis.Options{
    Addr: "localhost:6379",
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🗄️ Example API Response
&lt;/h2&gt;

&lt;p&gt;Normally:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```go id="1h9v4t"&lt;br&gt;
func getUsersFromDB() string {&lt;br&gt;
    return "Users from PostgreSQL"&lt;br&gt;
}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


But hitting DB repeatedly is expensive.

---

## ⚡ Add Redis Caching



```go id="h4m92g"
func getUsers(w http.ResponseWriter, r *http.Request) {

    cachedData, err := rdb.Get(ctx, "users").Result()

    if err == nil {
        w.Write([]byte("Cache Hit 🚀\n" + cachedData))
        return
    }

    data := getUsersFromDB()

    rdb.Set(ctx, "users", data, time.Minute*5)

    w.Write([]byte("DB Hit 🐘\n" + data))
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔥 What’s Happening Here?
&lt;/h2&gt;
&lt;h3&gt;
  
  
  First Request
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Redis has no data&lt;/li&gt;
&lt;li&gt;Fetch from DB&lt;/li&gt;
&lt;li&gt;Store in Redis&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Next Requests
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Redis already has data&lt;/li&gt;
&lt;li&gt;Return instantly ⚡&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  📊 Why Caching Matters
&lt;/h2&gt;

&lt;p&gt;Without cache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client → API → Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With cache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client → API → Redis ⚡
             ↓
          Database (less often)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Benefits of Redis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Faster APIs&lt;/li&gt;
&lt;li&gt;Reduced DB load&lt;/li&gt;
&lt;li&gt;Better scalability&lt;/li&gt;
&lt;li&gt;Improved user experience&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚠️ Important Production Notes
&lt;/h2&gt;

&lt;p&gt;Don’t cache forever.&lt;/p&gt;

&lt;p&gt;Always:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set expiration time&lt;/li&gt;
&lt;li&gt;Clear cache after updates&lt;/li&gt;
&lt;li&gt;Avoid stale data&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧭 Real-World Usage
&lt;/h2&gt;

&lt;p&gt;Redis is used in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication systems&lt;/li&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;li&gt;API caching&lt;/li&gt;
&lt;li&gt;Queues&lt;/li&gt;
&lt;li&gt;Real-time apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Companies like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Netflix&lt;/li&gt;
&lt;li&gt;Instagram&lt;/li&gt;
&lt;li&gt;Twitter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;use Redis heavily.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Final Thought
&lt;/h2&gt;

&lt;p&gt;Caching is one of the easiest ways to improve backend performance.&lt;/p&gt;

&lt;p&gt;You don’t always need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bigger servers&lt;/li&gt;
&lt;li&gt;More CPUs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes…&lt;br&gt;
👉 You just need smarter architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Coming Next
&lt;/h2&gt;

&lt;p&gt;👉 Rate Limiting in Go API&lt;br&gt;
👉 Background Jobs with Redis&lt;br&gt;
👉 Redis Pub/Sub in Go&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>api</category>
      <category>programming</category>
      <category>go</category>
    </item>
    <item>
      <title>Structuring a Go API Like Laravel (Controller, Service, Repository)</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Mon, 04 May 2026 11:39:24 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/structuring-a-go-api-like-laravel-controller-service-repository-1675</link>
      <guid>https://dev.to/ahmedraza_fyntune/structuring-a-go-api-like-laravel-controller-service-repository-1675</guid>
      <description>&lt;p&gt;If you're coming from Laravel, one thing feels missing in Go:&lt;/p&gt;

&lt;p&gt;👉 Structure&lt;/p&gt;

&lt;p&gt;By default, Go gives you freedom—but no clear architecture.&lt;/p&gt;

&lt;p&gt;So in this post, we’ll structure a Go API like Laravel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Controller → Handle request&lt;/li&gt;
&lt;li&gt;Service → Business logic&lt;/li&gt;
&lt;li&gt;Repository → Database&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Why Structure Matters
&lt;/h2&gt;

&lt;p&gt;Without structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code becomes messy quickly&lt;/li&gt;
&lt;li&gt;Hard to scale&lt;/li&gt;
&lt;li&gt;Difficult to debug&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean separation of concerns&lt;/li&gt;
&lt;li&gt;Easier testing&lt;/li&gt;
&lt;li&gt;Production-ready codebase&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📁 Folder Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project/
 ├── main.go
 ├── controller/
 ├── service/
 ├── repository/
 ├── model/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧱 Model (model/user.go)
&lt;/h2&gt;



&lt;p&gt;```go id="6pn1u5"&lt;br&gt;
package model&lt;/p&gt;

&lt;p&gt;type User struct {&lt;br&gt;
    ID   int    &lt;code&gt;json:"id"&lt;/code&gt;&lt;br&gt;
    Name string &lt;code&gt;json:"name"&lt;/code&gt;&lt;br&gt;
}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 🗄️ Repository Layer

Handles database queries



```go id="aq1u8u"
package repository

import (
    "database/sql"
    "yourapp/model"
)

type UserRepository struct {
    DB *sql.DB
}

func (r *UserRepository) GetAll() ([]model.User, error) {
    rows, err := r.DB.Query("SELECT id, name FROM users")
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    var users []model.User

    for rows.Next() {
        var user model.User
        rows.Scan(&amp;amp;user.ID, &amp;amp;user.Name)
        users = append(users, user)
    }

    return users, nil
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚙️ Service Layer
&lt;/h2&gt;

&lt;p&gt;Handles business logic&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```go id="qf1kmz"&lt;br&gt;
package service&lt;/p&gt;

&lt;p&gt;import (&lt;br&gt;
    "yourapp/model"&lt;br&gt;
    "yourapp/repository"&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;type UserService struct {&lt;br&gt;
    Repo *repository.UserRepository&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;func (s *UserService) GetUsers() ([]model.User, error) {&lt;br&gt;
    return s.Repo.GetAll()&lt;br&gt;
}&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 🌐 Controller Layer

Handles HTTP requests



```go id="n8t1rn"
package controller

import (
    "encoding/json"
    "net/http"
    "yourapp/service"
)

type UserController struct {
    Service *service.UserService
}

func (c *UserController) GetUsers(w http.ResponseWriter, r *http.Request) {
    users, err := c.Service.GetUsers()
    if err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    json.NewEncoder(w).Encode(users)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 main.go (Wire Everything)
&lt;/h2&gt;



&lt;p&gt;```go id="b4r8f2"&lt;br&gt;
package main&lt;/p&gt;

&lt;p&gt;import (&lt;br&gt;
    "database/sql"&lt;br&gt;
    "log"&lt;br&gt;
    "net/http"&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_ "github.com/lib/pq"

"yourapp/controller"
"yourapp/repository"
"yourapp/service"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;)&lt;/p&gt;

&lt;p&gt;func main() {&lt;br&gt;
    db, _ := sql.Open("postgres", "your_connection_string")&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;repo := &amp;amp;repository.UserRepository{DB: db}
service := &amp;amp;service.UserService{Repo: repo}
controller := &amp;amp;controller.UserController{Service: service}

http.HandleFunc("/users", controller.GetUsers)

log.Println("Server running on :8080")
http.ListenAndServe(":8080", nil)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 🔥 What You Achieved

* Clean architecture like Laravel
* Separation of concerns
* Scalable Go backend structure

---

## 🧭 When to Use This

Use this structure when:

* Building real APIs
* Working in teams
* Scaling projects

---

## 💬 Final Thought

Go doesn’t force structure…

👉 But professionals create one.

If you combine Go performance with Laravel-style architecture, you get the best of both worlds.

---

## 🚀 Coming Next

👉 Add middleware (logging, auth)
👉 Add validation layer
👉 Dockerize Go + PostgreSQL

---

#golang #backend #architecture #programming #webdev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Structuring a Go API Like Laravel (Controller, Service, Repository)</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Thu, 30 Apr 2026 19:21:12 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/structuring-a-go-api-like-laravel-controller-service-repository-31n</link>
      <guid>https://dev.to/ahmedraza_fyntune/structuring-a-go-api-like-laravel-controller-service-repository-31n</guid>
      <description>&lt;p&gt;If you're coming from Laravel, one thing feels missing in Go:&lt;/p&gt;

&lt;p&gt;👉 Structure&lt;/p&gt;

&lt;p&gt;By default, Go gives you freedom—but no clear architecture.&lt;/p&gt;

&lt;p&gt;So in this post, we’ll structure a Go API like Laravel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Controller → Handle request&lt;/li&gt;
&lt;li&gt;Service → Business logic&lt;/li&gt;
&lt;li&gt;Repository → Database&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Why Structure Matters
&lt;/h2&gt;

&lt;p&gt;Without structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code becomes messy quickly&lt;/li&gt;
&lt;li&gt;Hard to scale&lt;/li&gt;
&lt;li&gt;Difficult to debug&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean separation of concerns&lt;/li&gt;
&lt;li&gt;Easier testing&lt;/li&gt;
&lt;li&gt;Production-ready codebase&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📁 Folder Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project/
 ├── main.go
 ├── controller/
 ├── service/
 ├── repository/
 ├── model/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧱 Model (model/user.go)
&lt;/h2&gt;



&lt;p&gt;```go id="6pn1u5"&lt;br&gt;
package model&lt;/p&gt;

&lt;p&gt;type User struct {&lt;br&gt;
    ID   int    &lt;code&gt;json:"id"&lt;/code&gt;&lt;br&gt;
    Name string &lt;code&gt;json:"name"&lt;/code&gt;&lt;br&gt;
}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 🗄️ Repository Layer

Handles database queries



```go id="aq1u8u"
package repository

import (
    "database/sql"
    "yourapp/model"
)

type UserRepository struct {
    DB *sql.DB
}

func (r *UserRepository) GetAll() ([]model.User, error) {
    rows, err := r.DB.Query("SELECT id, name FROM users")
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    var users []model.User

    for rows.Next() {
        var user model.User
        rows.Scan(&amp;amp;user.ID, &amp;amp;user.Name)
        users = append(users, user)
    }

    return users, nil
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚙️ Service Layer
&lt;/h2&gt;

&lt;p&gt;Handles business logic&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```go id="qf1kmz"&lt;br&gt;
package service&lt;/p&gt;

&lt;p&gt;import (&lt;br&gt;
    "yourapp/model"&lt;br&gt;
    "yourapp/repository"&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;type UserService struct {&lt;br&gt;
    Repo *repository.UserRepository&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;func (s *UserService) GetUsers() ([]model.User, error) {&lt;br&gt;
    return s.Repo.GetAll()&lt;br&gt;
}&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 🌐 Controller Layer

Handles HTTP requests



```go id="n8t1rn"
package controller

import (
    "encoding/json"
    "net/http"
    "yourapp/service"
)

type UserController struct {
    Service *service.UserService
}

func (c *UserController) GetUsers(w http.ResponseWriter, r *http.Request) {
    users, err := c.Service.GetUsers()
    if err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    json.NewEncoder(w).Encode(users)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 main.go (Wire Everything)
&lt;/h2&gt;



&lt;p&gt;```go id="b4r8f2"&lt;br&gt;
package main&lt;/p&gt;

&lt;p&gt;import (&lt;br&gt;
    "database/sql"&lt;br&gt;
    "log"&lt;br&gt;
    "net/http"&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_ "github.com/lib/pq"

"yourapp/controller"
"yourapp/repository"
"yourapp/service"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;)&lt;/p&gt;

&lt;p&gt;func main() {&lt;br&gt;
    db, _ := sql.Open("postgres", "your_connection_string")&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;repo := &amp;amp;repository.UserRepository{DB: db}
service := &amp;amp;service.UserService{Repo: repo}
controller := &amp;amp;controller.UserController{Service: service}

http.HandleFunc("/users", controller.GetUsers)

log.Println("Server running on :8080")
http.ListenAndServe(":8080", nil)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 🔥 What You Achieved

* Clean architecture like Laravel
* Separation of concerns
* Scalable Go backend structure

---

## 🧭 When to Use This

Use this structure when:

* Building real APIs
* Working in teams
* Scaling projects

---

## 💬 Final Thought

Go doesn’t force structure…

👉 But professionals create one.

If you combine Go performance with Laravel-style architecture, you get the best of both worlds.

---

## 🚀 Coming Next

👉 Add middleware (logging, auth)
👉 Add validation layer
👉 Dockerize Go + PostgreSQL

---

#golang #backend #architecture #programming #webdev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>go</category>
      <category>webdev</category>
      <category>programming</category>
      <category>backend</category>
    </item>
    <item>
      <title>🏗️ System Architecture Simplified: From Monolith to Microservices (With Real Insights)</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Mon, 27 Apr 2026 11:18:50 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/system-architecture-simplified-from-monolith-to-microservices-with-real-insights-2fc9</link>
      <guid>https://dev.to/ahmedraza_fyntune/system-architecture-simplified-from-monolith-to-microservices-with-real-insights-2fc9</guid>
      <description>&lt;p&gt;When you start building applications, everything feels simple — one codebase, one database, one deployment. But as your app grows, things start breaking in subtle ways: slow performance, deployment risks, tight coupling.&lt;/p&gt;

&lt;p&gt;That’s where &lt;strong&gt;System Architecture&lt;/strong&gt; becomes critical.&lt;/p&gt;

&lt;p&gt;Let’s break it down in a practical, developer-first way.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 What is System Architecture?
&lt;/h2&gt;

&lt;p&gt;System Architecture defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How components interact&lt;/li&gt;
&lt;li&gt;How data flows&lt;/li&gt;
&lt;li&gt;How scalable and maintainable your system is&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it as the &lt;strong&gt;blueprint of your application&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Monolithic Architecture (Where Most of Us Start)
&lt;/h2&gt;

&lt;p&gt;In a monolith:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everything is in one codebase&lt;/li&gt;
&lt;li&gt;One database&lt;/li&gt;
&lt;li&gt;Single deployment unit&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Simple to build and deploy&lt;/li&gt;
&lt;li&gt;Easy debugging (initially)&lt;/li&gt;
&lt;li&gt;Great for MVPs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Cons:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hard to scale specific parts&lt;/li&gt;
&lt;li&gt;Deployment becomes risky&lt;/li&gt;
&lt;li&gt;Tight coupling across modules&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example (Laravel App):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Auth + Payments + Orders + Notifications → all inside one project&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 When Monolith Starts Failing
&lt;/h2&gt;

&lt;p&gt;You’ll notice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Small changes break unrelated features&lt;/li&gt;
&lt;li&gt;Deployments take longer&lt;/li&gt;
&lt;li&gt;Scaling requires scaling everything&lt;/li&gt;
&lt;li&gt;Teams step on each other’s code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the point where you rethink architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Microservices Architecture
&lt;/h2&gt;

&lt;p&gt;Instead of one big app:&lt;br&gt;
👉 You split into independent services&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auth Service&lt;/li&gt;
&lt;li&gt;Payment Service&lt;/li&gt;
&lt;li&gt;Order Service&lt;/li&gt;
&lt;li&gt;Notification Service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each service:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Has its own codebase&lt;/li&gt;
&lt;li&gt;Can have its own database&lt;/li&gt;
&lt;li&gt;Is deployed independently&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🔹 Microservices Pros &amp;amp; Cons
&lt;/h2&gt;
&lt;h3&gt;
  
  
  ✅ Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Independent scaling&lt;/li&gt;
&lt;li&gt;Faster deployments&lt;/li&gt;
&lt;li&gt;Better fault isolation&lt;/li&gt;
&lt;li&gt;Tech flexibility (Go, Node, PHP, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ❌ Cons:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Network complexity&lt;/li&gt;
&lt;li&gt;Debugging becomes harder&lt;/li&gt;
&lt;li&gt;Requires DevOps maturity&lt;/li&gt;
&lt;li&gt;Distributed data challenges&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🔹 Real-World Architecture Pattern
&lt;/h2&gt;

&lt;p&gt;A common modern setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ Client (Vue/React) ]
          ↓
     API Gateway
          ↓
 ┌────────┼────────┐
 ↓        ↓        ↓
Auth   Orders   Payments
Svc     Svc       Svc
 ↓        ↓        ↓
 DB       DB       DB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 Key Concepts You Must Know
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. API Gateway
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Single entry point&lt;/li&gt;
&lt;li&gt;Handles auth, routing, rate limiting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Service Communication
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;REST (simple)&lt;/li&gt;
&lt;li&gt;gRPC (fast, efficient)&lt;/li&gt;
&lt;li&gt;Message Queues (async processing)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Database Strategy
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Shared DB ❌ (avoid)&lt;/li&gt;
&lt;li&gt;Database per service ✅&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Caching Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Redis for performance boost&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Queue System
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Background jobs (emails, reports)&lt;/li&gt;
&lt;li&gt;Tools: Redis queues, Kafka, RabbitMQ&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 Monolith vs Microservices (Quick Comparison)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Monolith&lt;/th&gt;
&lt;th&gt;Microservices&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Single&lt;/td&gt;
&lt;td&gt;Independent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scaling&lt;/td&gt;
&lt;td&gt;Full app&lt;/td&gt;
&lt;td&gt;Service-level&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complexity&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexibility&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔹 What Should YOU Choose?
&lt;/h2&gt;

&lt;p&gt;👉 If you're building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MVP / Startup → &lt;strong&gt;Monolith&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Growing SaaS → &lt;strong&gt;Modular Monolith&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Large-scale system → &lt;strong&gt;Microservices&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 Pro tip:&lt;br&gt;
&lt;strong&gt;Don’t jump to microservices too early. Scale your architecture only when needed.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;System architecture is not about trends — it’s about &lt;strong&gt;trade-offs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Start simple.&lt;br&gt;
Measure pain points.&lt;br&gt;
Evolve your architecture.&lt;/p&gt;

&lt;p&gt;That’s how real systems are built.&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>distributedsystems</category>
      <category>programming</category>
      <category>microservices</category>
    </item>
    <item>
      <title>🚀 Building a CRUD API in Go with PostgreSQL (Step-by-Step)</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Mon, 27 Apr 2026 11:09:38 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/building-a-crud-api-in-go-with-postgresql-step-by-step-2n34</link>
      <guid>https://dev.to/ahmedraza_fyntune/building-a-crud-api-in-go-with-postgresql-step-by-step-2n34</guid>
      <description>&lt;p&gt;In the previous post, we built a simple CRUD API in Go using in-memory storage.&lt;/p&gt;

&lt;p&gt;Now let’s make it &lt;strong&gt;real-world ready&lt;/strong&gt; by connecting it to a database:&lt;/p&gt;

&lt;p&gt;👉 PostgreSQL&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Step 1: Install PostgreSQL Driver
&lt;/h2&gt;

&lt;p&gt;We’ll use the official driver:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go get github.com/lib/pq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧱 Step 2: Setup Database Connection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"database/sql"&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;

    &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="s"&gt;"github.com/lib/pq"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DB&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;initDB&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;connStr&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"user=postgres password=postgres dbname=testdb sslmode=disable"&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"postgres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;connStr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ping&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DB not reachable:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Connected to PostgreSQL ✅"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🗄️ Step 3: Create Table
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧩 Step 4: Model
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ID&lt;/span&gt;   &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="s"&gt;`json:"id"`&lt;/span&gt;
    &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"name"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ➕ Create User (INSERT)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewDecoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QueryRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"INSERT INTO users(name) VALUES($1) RETURNING id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewEncoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📥 Get Users (SELECT)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;getUsers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SELECT id, name FROM users"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;
        &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewEncoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✏️ Update User
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;updateUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;idParam&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewDecoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"UPDATE users SET name=$1 WHERE id=$2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idParam&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewEncoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Updated"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ❌ Delete User
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;deleteUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;idParam&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DELETE FROM users WHERE id=$1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idParam&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewEncoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Deleted"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌐 Step 5: Main Function
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;initDB&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/users"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;getUsers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/create"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/update"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;updateUser&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/delete"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;deleteUser&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Server running on :8080"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":8080"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Test API
&lt;/h2&gt;

&lt;p&gt;Same as before, but now data is stored in PostgreSQL 🎉&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Improvements You Should Do Next
&lt;/h2&gt;

&lt;p&gt;This is still beginner-level. To make it production-ready:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use environment variables for DB config&lt;/li&gt;
&lt;li&gt;Add validation&lt;/li&gt;
&lt;li&gt;Use a router (Chi / Gorilla Mux)&lt;/li&gt;
&lt;li&gt;Structure code (controllers, services, repo)&lt;/li&gt;
&lt;li&gt;Add connection pooling tuning&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔥 What You Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Connecting Go to PostgreSQL&lt;/li&gt;
&lt;li&gt;Executing SQL queries (&lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;SELECT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Handling real database-backed APIs&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Coming Next
&lt;/h2&gt;

&lt;p&gt;👉 Proper API structure in Go (like Laravel mindset)&lt;br&gt;
👉 Using Docker with Go + PostgreSQL&lt;br&gt;
👉 Adding authentication (JWT)&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Final Thought
&lt;/h2&gt;

&lt;p&gt;Now you're no longer just learning Go…&lt;/p&gt;

&lt;p&gt;👉 You're building backend systems.&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>programming</category>
      <category>go</category>
      <category>ai</category>
    </item>
    <item>
      <title>🔥 Arrays vs Slices in Go (Explained in the Simplest Way)</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Wed, 22 Apr 2026 17:10:21 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/arrays-vs-slices-in-go-explained-in-the-simplest-way-48ca</link>
      <guid>https://dev.to/ahmedraza_fyntune/arrays-vs-slices-in-go-explained-in-the-simplest-way-48ca</guid>
      <description>&lt;p&gt;If you just started learning Go, one thing will confuse you quickly:&lt;/p&gt;

&lt;p&gt;👉 Arrays vs Slices&lt;/p&gt;

&lt;p&gt;They look similar… but behave very differently.&lt;/p&gt;

&lt;p&gt;Let’s break it down in the simplest way possible 👇&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 What is an Array?
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;array&lt;/strong&gt; is a fixed-size collection.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key points:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Size is &lt;strong&gt;fixed&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Cannot grow or shrink&lt;/li&gt;
&lt;li&gt;Rarely used in real-world Go apps&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔄 What is a Slice?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;slice&lt;/strong&gt; is a dynamic version of an array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key points:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Size is &lt;strong&gt;dynamic&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Can grow using &lt;code&gt;append&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Used &lt;strong&gt;almost everywhere in Go&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Adding Data (Only Works with Slice)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 Under the Hood (Important Concept)
&lt;/h2&gt;

&lt;p&gt;A slice is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pointer to an array&lt;/li&gt;
&lt;li&gt;Length&lt;/li&gt;
&lt;li&gt;Capacity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it like:&lt;br&gt;
👉 “A flexible view on top of an array”&lt;/p&gt;


&lt;h2&gt;
  
  
  🔍 Slice Example with Capacity
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c"&gt;// 2&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c"&gt;// 5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ❗ Common Mistake
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// ❌ ERROR&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Why?&lt;br&gt;
👉 Because arrays are fixed size&lt;/p&gt;


&lt;h2&gt;
  
  
  🔥 Real-World Use Case
&lt;/h2&gt;

&lt;p&gt;When building APIs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Ahmed"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dynamic data = slices ✅&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 When to Use What?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Array&lt;/th&gt;
&lt;th&gt;Slice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Size&lt;/td&gt;
&lt;td&gt;Fixed&lt;/td&gt;
&lt;td&gt;Dynamic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usage&lt;/td&gt;
&lt;td&gt;Rare&lt;/td&gt;
&lt;td&gt;Common&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexibility&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;👉 In 95% of cases → use &lt;strong&gt;slice&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Final Thought
&lt;/h2&gt;

&lt;p&gt;If you understand slices, you understand &lt;strong&gt;how Go manages data internally&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is a foundational concept—don’t skip it.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Coming Next
&lt;/h2&gt;

&lt;p&gt;Next post:&lt;br&gt;
👉 Structs in Go (this is where real backend modeling starts)&lt;/p&gt;




&lt;h1&gt;
  
  
  golang #backend #programming #webdev #devto
&lt;/h1&gt;

</description>
      <category>go</category>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>🚀 Getting Started with Go (Golang) for Backend Developers</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Wed, 22 Apr 2026 17:07:57 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/getting-started-with-go-golang-for-backend-developers-4lpp</link>
      <guid>https://dev.to/ahmedraza_fyntune/getting-started-with-go-golang-for-backend-developers-4lpp</guid>
      <description>&lt;p&gt;If you're coming from PHP, Node.js, or Laravel, learning Go can feel different—but in a good way.&lt;/p&gt;

&lt;p&gt;Go is designed for &lt;strong&gt;performance, simplicity, and concurrency&lt;/strong&gt;. Many modern systems use it for building fast APIs and scalable services.&lt;/p&gt;

&lt;p&gt;Let’s understand it in a simple way 👇&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 What is Go?
&lt;/h2&gt;

&lt;p&gt;Go (or Golang) is a &lt;strong&gt;compiled programming language&lt;/strong&gt; created at Google.&lt;/p&gt;

&lt;p&gt;Think of it like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ Faster than PHP/Node (compiled)&lt;/li&gt;
&lt;li&gt;🧼 Cleaner syntax than Java&lt;/li&gt;
&lt;li&gt;🔁 Built for concurrency (handling multiple tasks efficiently)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚙️ Your First Go Program
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What’s happening?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;package main&lt;/code&gt; → entry point&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;import "fmt"&lt;/code&gt; → used for printing&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;func main()&lt;/code&gt; → main function where execution starts&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔤 Variables in Go
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"Ahmed"&lt;/span&gt;
&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No need to write types explicitly (Go infers them).&lt;/p&gt;




&lt;h2&gt;
  
  
  🔁 Loops (Only ONE loop in Go)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple and clean.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Functions
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧵 Concurrency (This is where Go shines)
&lt;/h2&gt;

&lt;p&gt;Go uses &lt;strong&gt;goroutines&lt;/strong&gt; (lightweight threads):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Running in background"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why this matters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Handle multiple API requests easily&lt;/li&gt;
&lt;li&gt;Build high-performance systems&lt;/li&gt;
&lt;li&gt;Perfect for microservices&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌐 Simple API in Go
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"net/http"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hello from Go API"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":8080"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it and open:&lt;br&gt;
👉 &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 Why You Should Learn Go
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;High performance (close to C++)&lt;/li&gt;
&lt;li&gt;Simple syntax&lt;/li&gt;
&lt;li&gt;Great for backend + APIs&lt;/li&gt;
&lt;li&gt;Used by companies like Google, Uber, Netflix&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧭 Coming Next
&lt;/h2&gt;

&lt;p&gt;In upcoming posts, I’ll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building REST APIs in Go&lt;/li&gt;
&lt;li&gt;Connecting Go with PostgreSQL&lt;/li&gt;
&lt;li&gt;Using Go with Docker&lt;/li&gt;
&lt;li&gt;Concurrency deep dive (goroutines + channels)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💬 Final Thought
&lt;/h2&gt;

&lt;p&gt;If you already know backend development, Go will feel like a &lt;strong&gt;power upgrade&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Start small. Stay consistent. Share what you learn.&lt;/p&gt;




&lt;h1&gt;
  
  
  golang #backend #programming #webdev #devto
&lt;/h1&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>🚀 5 Modern PHP Features You Should Start Using Today</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Wed, 22 Apr 2026 17:03:48 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/5-modern-php-features-you-should-start-using-today-4i2j</link>
      <guid>https://dev.to/ahmedraza_fyntune/5-modern-php-features-you-should-start-using-today-4i2j</guid>
      <description>&lt;p&gt;If you’re still writing PHP like it's 2015, you're missing out on some powerful features that make your code cleaner, safer, and easier to maintain.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk you through &lt;strong&gt;5 modern PHP features&lt;/strong&gt; in a very simple way — with examples you can actually use in real projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. ✅ Typed Properties (Strict Data Handling)
&lt;/h2&gt;

&lt;p&gt;Before PHP 7.4, you couldn’t define types for class properties.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Old way:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ New way:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it matters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Prevents invalid data&lt;/li&gt;
&lt;li&gt;Makes your code predictable&lt;/li&gt;
&lt;li&gt;Helps avoid bugs early&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. ✅ Arrow Functions (Shorter Closures)
&lt;/h2&gt;

&lt;p&gt;Arrow functions make your code shorter and cleaner.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Old way:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nv"&gt;$squared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;array_map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nv"&gt;$numbers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ New way:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$squared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;array_map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it matters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Less boilerplate&lt;/li&gt;
&lt;li&gt;More readable functional code&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. ✅ Null Safe Operator (&lt;code&gt;?-&amp;gt;&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Avoid those annoying null checks.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Old way:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ New way:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;?-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;?-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it matters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cleaner code&lt;/li&gt;
&lt;li&gt;No more "trying to access property of null" errors&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. ✅ Match Expression (Better than switch)
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;match&lt;/code&gt; is more strict and cleaner than &lt;code&gt;switch&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ switch:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s1"&gt;'success'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nv"&gt;$msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Done'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s1"&gt;'error'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nv"&gt;$msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Failed'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ match:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'success'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Done'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'error'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Failed'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Unknown'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it matters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No &lt;code&gt;break&lt;/code&gt; needed&lt;/li&gt;
&lt;li&gt;Strict comparison (no type confusion)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. ✅ Constructor Property Promotion
&lt;/h2&gt;

&lt;p&gt;Less boilerplate when creating classes.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Old way:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ New way:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it matters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cleaner classes&lt;/li&gt;
&lt;li&gt;Less repetitive code&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔥 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Modern PHP is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster ⚡&lt;/li&gt;
&lt;li&gt;Cleaner ✨&lt;/li&gt;
&lt;li&gt;Safer 🔒&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're working with frameworks like Laravel, these features are already being used under the hood — so understanding them will level up your coding skills.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 What Next?
&lt;/h2&gt;

&lt;p&gt;If you found this useful, I can share:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-world Laravel examples using these features&lt;/li&gt;
&lt;li&gt;Performance tips for PHP apps&lt;/li&gt;
&lt;li&gt;Clean architecture patterns in PHP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me know in the comments 👇&lt;/p&gt;




&lt;h1&gt;
  
  
  PHP #Laravel #WebDevelopment #Backend #Programming
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>php</category>
      <category>laravel</category>
    </item>
    <item>
      <title>The Case of the Empty 500: How I Proved the API Failure Wasn't Our Fault</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Wed, 11 Feb 2026 17:40:56 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/the-case-of-the-empty-500-how-i-proved-the-api-failure-wasnt-our-fault-1h37</link>
      <guid>https://dev.to/ahmedraza_fyntune/the-case-of-the-empty-500-how-i-proved-the-api-failure-wasnt-our-fault-1h37</guid>
      <description>&lt;p&gt;We’ve all been there. You make an API call, it fails, and the finger-pointing begins. "It’s the frontend," says the backend team. "It’s your service," says the API provider.&lt;/p&gt;

&lt;p&gt;Recently, I faced a debugging challenge where our application was receiving an empty response from an external API. On the surface, it looked like our request was simply vanishing into the void. Here is how I tracked down the culprit: The WAF.&lt;/p&gt;

&lt;p&gt;The Problem&lt;br&gt;
Our application was calling an external endpoint. The symptoms were frustratingly vague:&lt;/p&gt;

&lt;p&gt;Response Body: Completely empty.&lt;/p&gt;

&lt;p&gt;Result: The application logic failed because there was no data to parse.&lt;/p&gt;

&lt;p&gt;Internal Consensus: Initial thoughts were that our request payload was malformed or our connection was dropping.&lt;/p&gt;

&lt;p&gt;Digging into the Headers&lt;br&gt;
While the response body was empty, the HTTP Status Code and Response Headers told a different story. I noticed two red flags:&lt;/p&gt;

&lt;p&gt;Status Code 500: A "500 Internal Server Error" usually implies the server tried to do something and failed. If it were our network, we’d likely see a 404 or a timeout.&lt;/p&gt;

&lt;p&gt;Infrastructure Headers: Looking at the network trace, I saw headers related to Cloudflare and specific WAF (Web Application Firewall) signatures.&lt;/p&gt;

&lt;p&gt;The "Aha!" Moment&lt;br&gt;
By analyzing the custom headers injected by their WAF, I realized the request wasn't even reaching their application code. Their security layer was intercepting our request and dropping the payload before the server could process it.&lt;/p&gt;

&lt;p&gt;Even though the body was empty, the presence of those specific infrastructure headers proved that the hand-off to their network was successful, but their security rules were blocking us.&lt;/p&gt;

&lt;p&gt;The Resolution&lt;br&gt;
I presented the logs and the specific WAF headers to the provider's network team. With this evidence, they were able to:&lt;/p&gt;

&lt;p&gt;Identify the specific firewall rule that was flagging our IP/payload.&lt;/p&gt;

&lt;p&gt;Whitelist our service.&lt;/p&gt;

&lt;p&gt;Restore the API functionality.&lt;/p&gt;

&lt;p&gt;Key Takeaways for Debugging APIs&lt;br&gt;
Never ignore the headers: The body might be empty, but headers are the "fingerprints" of the servers the request passed through.&lt;/p&gt;

&lt;p&gt;Status codes matter: A 500 error is a server-side confession.&lt;/p&gt;

&lt;p&gt;Check for Middleware: In modern web dev, you aren't just talking to a server; you're talking to Load Balancers, WAFs, and Proxies.&lt;/p&gt;

</description>
      <category>api</category>
      <category>webdev</category>
      <category>debugging</category>
      <category>security</category>
    </item>
    <item>
      <title>laravel request life cycle</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Fri, 26 Sep 2025 15:21:04 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/laravel-request-life-cycle-3l4</link>
      <guid>https://dev.to/ahmedraza_fyntune/laravel-request-life-cycle-3l4</guid>
      <description>&lt;h3&gt;
  
  
  Laravel Request Lifecycle
&lt;/h3&gt;

&lt;p&gt;The Laravel request lifecycle begins when a user sends an HTTP request to the web server (Apache, Nginx). The server forwards the request to the &lt;code&gt;public/index.php&lt;/code&gt; file, the application's single entry point. This file loads Composer’s autoloader, performs essential bootstrapping, and constructs a new instance of the Laravel application.&lt;/p&gt;

&lt;p&gt;The next step is the HTTP Kernel, which manages the request, response, and middleware stacks. The global middleware stack runs first, acting as filters for every HTTP request. Service providers register core services, and after bootstrapping, the router dispatches the request to a route or controller, executing any route-specific middleware.&lt;/p&gt;

&lt;p&gt;Controllers (or route closures) process the request and generate a response—HTML view, JSON, download, or redirect. Before the response is sent to the user's browser, it passes back out through the middleware stack for any post-processing. Finally, the Kernel’s &lt;code&gt;handle()&lt;/code&gt; method returns the response for &lt;code&gt;index.php&lt;/code&gt; to deliver to the browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  Middleware's Role in the Lifecycle
&lt;/h3&gt;

&lt;p&gt;Middleware in Laravel act as filters operating before or after the core route/controller logic. They check authentication, log requests, manipulate headers, etc. Middleware can be global (applied to all requests) or route-specific (applied only to selected routes). Middleware can halt, redirect, modify requests, or even process responses before they're sent back to the client.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating Custom Middleware
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Global Middleware
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Generate middleware:
&lt;code&gt;php artisan make:middleware CustomGlobalMiddleware&lt;/code&gt;.[8]&lt;/li&gt;
&lt;li&gt;Add logic in &lt;code&gt;app/Http/Middleware/CustomGlobalMiddleware.php&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Closure&lt;/span&gt; &lt;span class="nv"&gt;$next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Custom logic here&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Register in &lt;code&gt;app/Http/Kernel.php&lt;/code&gt; by adding to the &lt;code&gt;$middleware&lt;/code&gt; array:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;  &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$middleware&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="c1"&gt;// ... existing middleware,&lt;/span&gt;
      &lt;span class="nc"&gt;\App\Http\Middleware\CustomGlobalMiddleware&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Now the middleware runs for every HTTP request.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Route Middleware
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Generate middleware:
&lt;code&gt;php artisan make:middleware CustomRouteMiddleware&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add logic in &lt;code&gt;app/Http/Middleware/CustomRouteMiddleware.php&lt;/code&gt; as above.&lt;/li&gt;
&lt;li&gt;Register in &lt;code&gt;app/Http/Kernel.php&lt;/code&gt; within &lt;code&gt;$routeMiddleware&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;  &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$routeMiddleware&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="s1"&gt;'custom'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;\App\Http\Middleware\CustomRouteMiddleware&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Apply to route:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;  &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/example'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'Example Route'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'custom'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;For groups:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;  &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'custom'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/a'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/b'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passing Parameters to Middleware
&lt;/h3&gt;

&lt;p&gt;Parameters can be sent to route middleware by appending them after a colon in the route definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/post/{id}'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'PostController@show'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'verify.role:admin'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the middleware class, receive them as extra arguments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Closure&lt;/span&gt; &lt;span class="nv"&gt;$next&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$role&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Check for required role&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To access route parameters (like &lt;code&gt;{id}&lt;/code&gt;) inside middleware:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Gets route param 'id'&lt;/span&gt;
&lt;span class="nv"&gt;$params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// All parameters array&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lets you make your middleware context-aware and dynamic.&lt;/p&gt;




&lt;h3&gt;
  
  
  Quick Reference Table: Request Lifecycle Steps
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Web Server&lt;/td&gt;
&lt;td&gt;Receives &amp;amp; forwards HTTP request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;index.php&lt;/td&gt;
&lt;td&gt;Application entry, bootstraps Laravel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kernel&lt;/td&gt;
&lt;td&gt;Handles requests, global middleware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service Providers&lt;/td&gt;
&lt;td&gt;Register services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Router&lt;/td&gt;
&lt;td&gt;Routes requests, applies route middleware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Controller/View&lt;/td&gt;
&lt;td&gt;Core logic &amp;amp; generates response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Middleware&lt;/td&gt;
&lt;td&gt;Filters/Processes requests &amp;amp; responses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Response&lt;/td&gt;
&lt;td&gt;Sent back via Kernel &amp;amp; index.php&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;This sequence gives a robust, hands-on understanding of where middleware intercepts requests, how to build custom ones, and how parameters integrate with the lifecycle—all as essential for mastering Laravel’s request flow and middleware.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>laravel</category>
      <category>php</category>
      <category>programming</category>
    </item>
    <item>
      <title>Replication &amp; High Availability</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Sat, 20 Sep 2025 06:15:42 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/replication-high-availability-46fk</link>
      <guid>https://dev.to/ahmedraza_fyntune/replication-high-availability-46fk</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Replication &amp;amp; High Availability&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 What is Replication?
&lt;/h3&gt;

&lt;p&gt;Replication is the process of &lt;strong&gt;copying data from one database server (the primary) to one or more other servers (replicas/secondaries)&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;primary&lt;/strong&gt; (or master) handles writes (INSERT, UPDATE, DELETE).&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;replicas&lt;/strong&gt; (or slaves, followers, standbys) receive these changes and apply them.&lt;/li&gt;
&lt;li&gt;This ensures &lt;strong&gt;multiple copies of the same data&lt;/strong&gt; exist across servers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Think of it like keeping &lt;strong&gt;photocopies&lt;/strong&gt; of your important notebook in multiple places — if one is lost, you still have backups.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔹 Types of Replication
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Synchronous Replication&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Writes on the primary are &lt;strong&gt;confirmed only after replicas also confirm&lt;/strong&gt; they’ve written the change.&lt;/li&gt;
&lt;li&gt;Ensures &lt;strong&gt;no data loss&lt;/strong&gt; but can &lt;strong&gt;slow down performance&lt;/strong&gt; (since it waits).&lt;/li&gt;
&lt;li&gt;Example: PostgreSQL &lt;strong&gt;synchronous replication&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Asynchronous Replication&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Primary writes immediately return success, and replicas catch up &lt;strong&gt;later&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Faster, but &lt;strong&gt;risk of data loss&lt;/strong&gt; if primary crashes before replicas sync.&lt;/li&gt;
&lt;li&gt;Example: MySQL’s default replication.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Semi-synchronous Replication&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;A middle ground: primary waits for &lt;strong&gt;at least one replica&lt;/strong&gt; to confirm before success.&lt;/li&gt;
&lt;li&gt;Balance between &lt;strong&gt;safety &amp;amp; performance&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔹 Why Replication is Important?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read Scaling&lt;/strong&gt;: Distribute reads across replicas (read-heavy apps benefit).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High Availability&lt;/strong&gt;: If primary fails, replicas can be promoted as new primary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disaster Recovery&lt;/strong&gt;: Data is safe even if one server is lost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geographic Distribution&lt;/strong&gt;: Users in Asia can read from an Asia replica instead of a US server.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔹 High Availability (HA)
&lt;/h3&gt;

&lt;p&gt;HA is about keeping your &lt;strong&gt;database always online&lt;/strong&gt;, even during failures. Replication is a &lt;strong&gt;core building block&lt;/strong&gt; of HA, but HA adds &lt;strong&gt;automatic failover and monitoring&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If primary &lt;strong&gt;dies&lt;/strong&gt;, a &lt;strong&gt;replica automatically becomes the new primary&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Clients reconnect automatically without manual intervention.&lt;/li&gt;
&lt;li&gt;Requires a &lt;strong&gt;cluster manager / orchestrator&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔹 Replication &amp;amp; HA in Popular Databases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MySQL&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replication: Asynchronous by default (&lt;code&gt;binlog&lt;/code&gt;-based).&lt;/li&gt;
&lt;li&gt;HA: Tools like &lt;strong&gt;MySQL InnoDB Cluster&lt;/strong&gt;, &lt;strong&gt;Orchestrator&lt;/strong&gt;, or &lt;strong&gt;ProxySQL&lt;/strong&gt; handle failover.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built-in streaming replication.&lt;/li&gt;
&lt;li&gt;HA: Tools like &lt;strong&gt;Patroni&lt;/strong&gt;, &lt;strong&gt;PgBouncer&lt;/strong&gt;, &lt;strong&gt;repmgr&lt;/strong&gt;, or &lt;strong&gt;Stolon&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;MongoDB&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replica sets built-in: one &lt;strong&gt;primary&lt;/strong&gt;, multiple &lt;strong&gt;secondaries&lt;/strong&gt;, automatic failover.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Cassandra&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replication is &lt;strong&gt;peer-to-peer&lt;/strong&gt; (no master/replica distinction). Every node can handle writes.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔹 Example Scenario
&lt;/h3&gt;

&lt;p&gt;Imagine a &lt;strong&gt;banking app&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Primary DB (Mumbai) → handles all &lt;strong&gt;deposits/withdrawals&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replicas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delhi replica → handles &lt;strong&gt;read queries&lt;/strong&gt; for North India users.&lt;/li&gt;
&lt;li&gt;London replica → handles reads for European users.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;If the &lt;strong&gt;Mumbai primary crashes&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delhi replica is promoted to &lt;strong&gt;new primary&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;All writes now go to Delhi, ensuring &lt;strong&gt;zero downtime&lt;/strong&gt; for customers.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;✅ &lt;strong&gt;Summary&lt;/strong&gt;&lt;br&gt;
Replication = Copying data across servers.&lt;br&gt;
High Availability = Making sure the database &lt;strong&gt;stays alive automatically&lt;/strong&gt;, even if one server dies.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 How Automatic Failover Works
&lt;/h2&gt;

&lt;h2&gt;
  
  
  1. &lt;strong&gt;Health Monitoring&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tools like &lt;strong&gt;Patroni (PostgreSQL)&lt;/strong&gt;, &lt;strong&gt;Orchestrator (MySQL)&lt;/strong&gt;, or &lt;strong&gt;MongoDB built-in replica sets&lt;/strong&gt; constantly &lt;strong&gt;ping the primary DB&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;They check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the DB server &lt;strong&gt;alive&lt;/strong&gt; (via TCP/heartbeat)?&lt;/li&gt;
&lt;li&gt;Is replication &lt;strong&gt;up-to-date&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;Is there &lt;strong&gt;network partition&lt;/strong&gt; (primary is alive but unreachable)?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;👉 If the primary &lt;strong&gt;stops responding&lt;/strong&gt; within a certain timeout (say 10s), it’s marked as &lt;strong&gt;failed&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. &lt;strong&gt;Leader Election&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;In a cluster, you don’t want &lt;strong&gt;two primaries&lt;/strong&gt; (split-brain issue ⚠️).&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;consensus system&lt;/strong&gt; like &lt;strong&gt;Etcd, Consul, or Zookeeper&lt;/strong&gt; is used.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cluster members vote:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Primary is dead, we need a new one."&lt;/li&gt;
&lt;li&gt;They agree on &lt;strong&gt;which replica is most up-to-date&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;👉 The &lt;strong&gt;most recent replica&lt;/strong&gt; (with the least replication lag) becomes the new &lt;strong&gt;Primary&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. &lt;strong&gt;Failover / Promotion&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The chosen replica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Promotes itself to &lt;strong&gt;Primary&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Stops being read-only.&lt;/li&gt;
&lt;li&gt;Starts accepting &lt;strong&gt;writes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;👉 In Patroni (PostgreSQL), this is done with &lt;code&gt;pg_ctl promote&lt;/code&gt;.&lt;br&gt;
👉 In Orchestrator (MySQL), it issues &lt;code&gt;RESET SLAVE ALL&lt;/code&gt; + reconfigures replication.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. &lt;strong&gt;Reconfiguration&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Other replicas now start replicating from the &lt;strong&gt;new Primary&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The cluster updates routing so &lt;strong&gt;apps know where to send writes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tools like &lt;strong&gt;HAProxy, ProxySQL, or PgBouncer&lt;/strong&gt; help by pointing apps to the current Primary.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. &lt;strong&gt;Application Transparency&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Applications don’t have to know which DB is Primary.&lt;/li&gt;
&lt;li&gt;They just connect to a &lt;strong&gt;load balancer / proxy&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If failover happens, the proxy redirects traffic to the new Primary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This ensures &lt;strong&gt;no downtime&lt;/strong&gt; for the app.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Example with Tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PostgreSQL + Patroni&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Patroni uses &lt;strong&gt;Etcd/Consul&lt;/strong&gt; for cluster state.&lt;/li&gt;
&lt;li&gt;Monitors DB health.&lt;/li&gt;
&lt;li&gt;On failure → promotes replica → updates routing.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;MySQL + Orchestrator&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Continuously monitors replication topology.&lt;/li&gt;
&lt;li&gt;Detects primary failure.&lt;/li&gt;
&lt;li&gt;Promotes the best replica automatically.&lt;/li&gt;
&lt;li&gt;Updates HAProxy/ProxySQL.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;MongoDB Replica Set&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built-in heartbeat detection.&lt;/li&gt;
&lt;li&gt;Automatic election (no external tool needed).&lt;/li&gt;
&lt;li&gt;One secondary becomes new primary.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;✅ &lt;strong&gt;Summary in Simple Words&lt;/strong&gt;&lt;br&gt;
Failover tools are like a &lt;strong&gt;traffic cop&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check if the main road (primary DB) is open.&lt;/li&gt;
&lt;li&gt;If closed, find the &lt;strong&gt;best alternative road (replica)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Redirect all cars (applications) automatically.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>webdev</category>
      <category>database</category>
      <category>programming</category>
    </item>
    <item>
      <title>Advance Indexing in MYSql and Psql</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Fri, 19 Sep 2025 12:25:42 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/advance-indexing-in-mysql-and-psql-297k</link>
      <guid>https://dev.to/ahmedraza_fyntune/advance-indexing-in-mysql-and-psql-297k</guid>
      <description>&lt;p&gt;Perfect 👌 Let’s go &lt;strong&gt;deep into Indexing&lt;/strong&gt; since it’s the heart of database performance.&lt;br&gt;
I’ll keep it &lt;strong&gt;detailed but easy to follow&lt;/strong&gt; with MySQL &amp;amp; PostgreSQL examples.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔹 Advanced Indexing Explained
&lt;/h2&gt;

&lt;p&gt;Indexes are like the &lt;strong&gt;table of contents&lt;/strong&gt; in a book 📖.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Without index → You scan the whole book to find “Chapter 10”.&lt;/li&gt;
&lt;li&gt;With index → You jump directly to the page number listed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In databases, indexes speed up &lt;strong&gt;SELECT&lt;/strong&gt; queries by avoiding full table scans.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. &lt;strong&gt;B-Tree Index (Default in MySQL &amp;amp; PostgreSQL)&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Most common type.&lt;/li&gt;
&lt;li&gt;Great for equality (&lt;code&gt;=&lt;/code&gt;) and range queries (&lt;code&gt;&amp;lt;, &amp;gt;, BETWEEN&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Data stored in a balanced tree → lookup is &lt;strong&gt;O(log n)&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example (Postgres/MySQL):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_users_email&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query using it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'abc@gmail.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Index lets DB jump directly to matching rows instead of scanning all.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. &lt;strong&gt;Hash Index&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Only good for &lt;strong&gt;exact matches&lt;/strong&gt; (&lt;code&gt;=&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Not good for ranges (&lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;BETWEEN&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;MySQL has them in &lt;strong&gt;Memory engine&lt;/strong&gt;; PostgreSQL supports &lt;code&gt;HASH&lt;/code&gt; explicitly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example (Postgres):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_users_username_hash&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;HASH&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 &lt;code&gt;WHERE username = 'john_doe'&lt;/code&gt; becomes super fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. &lt;strong&gt;GIN Index (Generalized Inverted Index – PostgreSQL only)&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Used for &lt;strong&gt;full-text search&lt;/strong&gt; and JSONB queries.&lt;/li&gt;
&lt;li&gt;Stores a mapping from &lt;strong&gt;value → rows containing it&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example: Full-text search&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_post_content_gin&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;GIN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to_tsvector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'english'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;to_tsvector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'english'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;@@&lt;/span&gt; &lt;span class="n"&gt;to_tsquery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'database &amp;amp; scaling'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Useful for search features (like Google inside your DB).&lt;/p&gt;




&lt;h2&gt;
  
  
  4. &lt;strong&gt;GiST Index (Generalized Search Tree – PostgreSQL)&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;More flexible than B-Tree.&lt;/li&gt;
&lt;li&gt;Supports &lt;strong&gt;geospatial queries&lt;/strong&gt;, ranges, similarity search.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example (find locations near a point):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_locations_gist&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;locations&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;GiST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;geom&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;locations&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ST_DWithin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;geom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ST_MakePoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;77&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5946&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;9716&lt;/span&gt;&lt;span class="p"&gt;)::&lt;/span&gt;&lt;span class="n"&gt;geography&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Finds all locations within 5km of given coordinates (great for maps).&lt;/p&gt;




&lt;h2&gt;
  
  
  5. &lt;strong&gt;BRIN Index (Block Range Index – PostgreSQL)&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Very lightweight.&lt;/li&gt;
&lt;li&gt;Instead of indexing every row, it stores min/max per block of rows.&lt;/li&gt;
&lt;li&gt;Great for &lt;strong&gt;sequential / time-series data&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_logs_date_brin&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;logs&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;BRIN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log_date&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Efficient for queries like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;logs&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;log_date&lt;/span&gt; &lt;span class="k"&gt;BETWEEN&lt;/span&gt; &lt;span class="s1"&gt;'2025-01-01'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="s1"&gt;'2025-01-31'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Works best when data is &lt;strong&gt;naturally ordered&lt;/strong&gt; (like timestamps).&lt;/p&gt;




&lt;h2&gt;
  
  
  6. &lt;strong&gt;Covering Index (a.k.a. Index with INCLUDE columns)&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Stores extra columns in the index itself.&lt;/li&gt;
&lt;li&gt;Avoids going back to the table (called “index-only scan”).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Postgres:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_orders_customer_date&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;INCLUDE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total_amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total_amount&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 DB serves query &lt;strong&gt;only from index&lt;/strong&gt;, no table lookup needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. &lt;strong&gt;Partial / Filtered Index&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Index only rows that meet a condition.&lt;/li&gt;
&lt;li&gt;Saves space &amp;amp; improves performance when you query subsets often.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Postgres:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_active_users&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Queries on active users become lightning fast, without indexing inactive ones.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. &lt;strong&gt;Expression Index&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Index on a function or expression.&lt;/li&gt;
&lt;li&gt;Great when queries always apply transformations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Postgres:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_lower_email&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;LOWER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;LOWER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'abc@gmail.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Uses index instead of scanning all rows.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 How to Know Which Index to Use?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exact match lookup&lt;/strong&gt; → Hash index (Postgres) or B-Tree.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Range queries (&amp;gt;, &amp;lt;, BETWEEN)&lt;/strong&gt; → B-Tree.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text search / JSONB search&lt;/strong&gt; → GIN.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geospatial / similarity&lt;/strong&gt; → GiST.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-series / ordered data&lt;/strong&gt; → BRIN.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only certain rows&lt;/strong&gt; → Partial index.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always lowercase/transform&lt;/strong&gt; → Expression index.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 Important Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Indexes &lt;strong&gt;speed up reads but slow down writes&lt;/strong&gt; (inserts/updates/deletes need to update indexes).&lt;/li&gt;
&lt;li&gt;Too many indexes = slower writes + more storage.&lt;/li&gt;
&lt;li&gt;Always use &lt;code&gt;EXPLAIN&lt;/code&gt; or &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; to see if your query uses the index.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;✅ &lt;strong&gt;Summary:&lt;/strong&gt;&lt;br&gt;
Indexes are like shortcuts — different types exist for different problems.&lt;br&gt;
Mastering them = 80% of database optimization as a database engineer.&lt;/p&gt;

</description>
      <category>database</category>
      <category>webdev</category>
      <category>backend</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
