<?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: Hoang Guruu</title>
    <description>The latest articles on DEV Community by Hoang Guruu (@hoangguruu).</description>
    <link>https://dev.to/hoangguruu</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%2F1271845%2F7723a023-bdd6-491e-9dd9-02ae921fb738.png</url>
      <title>DEV Community: Hoang Guruu</title>
      <link>https://dev.to/hoangguruu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hoangguruu"/>
    <language>en</language>
    <item>
      <title>Awesome Kubernetes Resources !!! 🔥</title>
      <dc:creator>Hoang Guruu</dc:creator>
      <pubDate>Wed, 19 Mar 2025 03:04:35 +0000</pubDate>
      <link>https://dev.to/aws-builders/awesome-kubernetes-resources--218p</link>
      <guid>https://dev.to/aws-builders/awesome-kubernetes-resources--218p</guid>
      <description>&lt;h1&gt;
  
  
  Awesome Kubernetes Resources &lt;a href="https://awesome.re" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fawesome.re%2Fbadge.svg" alt="Awesome" width="110" height="20"&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;【 &lt;a href="https://www.youtube.com/@HoangGuruu" rel="noopener noreferrer"&gt;👨🏻‍💻 YouTube&lt;/a&gt; 】&lt;br&gt;
Watch more other contents related DevOps - AWS&lt;/p&gt;

&lt;p&gt;A curated list of awesome Kubernetes tools and resources.&lt;/p&gt;

&lt;p&gt;Inspired by &lt;a href="https://github.com/sindresorhus/awesome" rel="noopener noreferrer"&gt;awesome&lt;/a&gt; list and &lt;a href="https://github.com/donnemartin/awesome-aws" rel="noopener noreferrer"&gt;donnemartin/awesome-aws&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fiery Meter of Awesomeness
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repo with 0050+ Stars: 🔥&lt;/li&gt;
&lt;li&gt;Repo with 0200+ Stars: 🔥🔥&lt;/li&gt;
&lt;li&gt;Repo with 0500+ Stars: 🔥🔥🔥&lt;/li&gt;
&lt;li&gt;Repo with 1000+ Stars: 🔥🔥🔥🔥&lt;/li&gt;
&lt;li&gt;Repo with 2000+ Stars: 🔥🔥🔥🔥🔥&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Idea taken from &lt;a href="https://github.com/donnemartin/awesome-aws" rel="noopener noreferrer"&gt;donnemartin/awesome-aws&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
Awesome Kubernetes Resources 

&lt;ul&gt;
&lt;li&gt;The Fiery Meter of Awesomeness&lt;/li&gt;
&lt;li&gt;Contents&lt;/li&gt;
&lt;li&gt;Tools and Libraries&lt;/li&gt;
&lt;li&gt;Command Line Tools&lt;/li&gt;
&lt;li&gt;Cluster Provisioning&lt;/li&gt;
&lt;li&gt;Automation and CI/CD&lt;/li&gt;
&lt;li&gt;Cluster Resources Management&lt;/li&gt;
&lt;li&gt;Secrets Management&lt;/li&gt;
&lt;li&gt;Networking&lt;/li&gt;
&lt;li&gt;Storage&lt;/li&gt;
&lt;li&gt;Testing and Troubleshooting&lt;/li&gt;
&lt;li&gt;Monitoring, Alerts, and Visualization&lt;/li&gt;
&lt;li&gt;Backup and Restore&lt;/li&gt;
&lt;li&gt;Security and Compliance&lt;/li&gt;
&lt;li&gt;Service Mesh&lt;/li&gt;
&lt;li&gt;Development Tools&lt;/li&gt;
&lt;li&gt;Data Processing and Machine Learning&lt;/li&gt;
&lt;li&gt;Data Management&lt;/li&gt;
&lt;li&gt;Miscellaneous&lt;/li&gt;
&lt;li&gt;Guides, Documentations, Blogs, and Learnings&lt;/li&gt;
&lt;li&gt;Guides&lt;/li&gt;
&lt;li&gt;Blogs and Videos&lt;/li&gt;
&lt;li&gt;Learnings and Documentations&lt;/li&gt;
&lt;li&gt;Certification Guides&lt;/li&gt;
&lt;li&gt;Contribute&lt;/li&gt;
&lt;li&gt;License&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tools and Libraries
&lt;/h2&gt;

&lt;p&gt;Items with 💚 indicate open source projects. &lt;/p&gt;

&lt;h3&gt;
  
  
  Command Line Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💚&lt;a href="https://github.com/helm/helm" rel="noopener noreferrer"&gt;Helm&lt;/a&gt; 🔥🔥🔥🔥🔥 - Helm is a tool for managing Charts. Charts are packages of pre-configured Kubernetes resources.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/helmfile/helmfile" rel="noopener noreferrer"&gt;Helmfile&lt;/a&gt; 🔥🔥🔥🔥🔥 - Helmfile is a declarative spec for deploying helm charts.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/helmwave/helmwave" rel="noopener noreferrer"&gt;Helmwave&lt;/a&gt; 🔥🔥🔥 - Helmwave is helm3-native tool for deploy your Helm Charts. It is like Docker-Compose, but for Helm.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/infrahq/infra" rel="noopener noreferrer"&gt;Infra&lt;/a&gt; 🔥🔥🔥 - Infra enables you to discover and access infrastructure (e.g. Kubernetes, databases). We help you connect an identity provider such as Okta or Azure active directory, and map users/groups with the permissions you set to your infrastructure.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/derailed/k9s" rel="noopener noreferrer"&gt;K9s&lt;/a&gt; 🔥🔥🔥🔥🔥 - K9s provides a terminal UI to interact with your Kubernetes clusters.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/vmware-tanzu/carvel-kapp" rel="noopener noreferrer"&gt;kapp&lt;/a&gt; 🔥🔥🔥 - kapp is a simple deployment tool focused on the concept of "Kubernetes application" — a set of resources with the same label&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/fidelity/kconnect" rel="noopener noreferrer"&gt;kconnect&lt;/a&gt; 🔥🔥 - kconnect is a CLI utility that can be used to discover and securely access Kubernetes clusters across multiple operating environments.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/omrikiei/ktunnel" rel="noopener noreferrer"&gt;Ktunnel&lt;/a&gt; 🔥🔥 - Ktunnel is a CLI tool that establishes a reverse tunnel between a kubernetes cluster and your local machine.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/astefanutti/kubebox" rel="noopener noreferrer"&gt;Kubebox&lt;/a&gt; 🔥🔥🔥🔥 - Terminal and Web console for Kubernetes&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/johanhaleby/kubetail" rel="noopener noreferrer"&gt;Kubetail&lt;/a&gt; 🔥🔥🔥🔥🔥 - Bash script that enables you to aggregate (tail/follow) logs from multiple pods into one stream.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/cloudnativelabs/kube-shell" rel="noopener noreferrer"&gt;kube-shell&lt;/a&gt; 🔥🔥🔥🔥 - Kube-shell: An integrated shell for working with the Kubernetes CLI.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/hidetatz/kubecolor" rel="noopener noreferrer"&gt;kubecolor&lt;/a&gt; 🔥🔥🔥 - colorizes kubectl output&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/ahmetb/kubectl-tree" rel="noopener noreferrer"&gt;kubectl tree&lt;/a&gt; 🔥🔥🔥🔥 - A kubectl plugin to explore ownership relationships between Kubernetes objects through owners.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/ahmetb/kubectl-aliases" rel="noopener noreferrer"&gt;kubectl-aliases&lt;/a&gt; 🔥🔥🔥🔥🔥 - This repository contains a script to generate hundreds of convenient shell aliases for kubectl.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/ahmetb/kubectx" rel="noopener noreferrer"&gt;kubectx + kubens&lt;/a&gt; 🔥🔥🔥🔥🔥 - &lt;code&gt;kubectx&lt;/code&gt; helps you switch between clusters back and forth, and &lt;code&gt;kubens&lt;/code&gt; helps you switch between Kubernetes namespaces smoothly.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/jonmosco/kube-ps1" rel="noopener noreferrer"&gt;kube-ps1&lt;/a&gt; 🔥🔥🔥🔥🔥 - kube-ps1: A script that lets you add the current Kubernetes context and namespace configured on kubectl to your Bash/Zsh prompt strings (i.e. the $PS1).&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/weaveworks/kubediff" rel="noopener noreferrer"&gt;kubediff&lt;/a&gt; 🔥🔥🔥 - Kubediff is a tool for Kubernetes to show you the differences between your running configuration and your version controlled configuration.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/jlesquembre/kubeprompt" rel="noopener noreferrer"&gt;kubeprompt&lt;/a&gt; 🔥 - Isolates KUBECONFIG in each shell and shows the current Kubernetes context/namespace in your prompt&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/oam-dev/kubevela" rel="noopener noreferrer"&gt;Kubevela&lt;/a&gt; 🔥🔥🔥🔥🔥 - KubeVela is an easy-to-use yet extensible platform that enables them to design and ship applications with minimal effort.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/konveyor/move2kube" rel="noopener noreferrer"&gt;Move2Kube&lt;/a&gt; 🔥🔥 - A tool to help users migrate their apps from legacy platforms like Cloud Foundry to Kubernetes and Openshift. Analyses the application source code and generates Kubernetes YAMLs, Helm Charts, Tekton Pipelines, etc. The analysis and generation can be heavily customized to produce the exact output that you want.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/FairwindsOps/nova/" rel="noopener noreferrer"&gt;nova&lt;/a&gt; 🔥🔥 - Nova scans your cluster for installed Helm charts, then cross-checks them against all known Helm repositories.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/pluralsh/plural" rel="noopener noreferrer"&gt;Plural&lt;/a&gt; 🔥🔥 - Plural is a CLI tool and holistic DevOps management platform for rapidly deploying, managing, and monitoring open-source applications on Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/FairwindsOps/rbac-lookup" rel="noopener noreferrer"&gt;RBAC Lookup&lt;/a&gt; 🔥🔥🔥 - RBAC Lookup is a CLI that allows you to easily find Kubernetes roles and cluster roles bound to any user, service account, or group name.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/stern/stern" rel="noopener noreferrer"&gt;stern&lt;/a&gt; 🔥🔥🔥🔥🔥 - Stern allows you to tail multiple pods on Kubernetes and multiple containers within the pod.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cluster Provisioning
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubernetes-sigs/bootkube" rel="noopener noreferrer"&gt;Bootkube&lt;/a&gt; 🔥🔥🔥🔥 - Bootkube is a tool for launching self-hosted Kubernetes clusters.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/berops/claudie" rel="noopener noreferrer"&gt;Claudie&lt;/a&gt; 🔥 - Multi-cloud clusters with each nodepool in a different cloud provider.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubernetes-sigs/cluster-api" rel="noopener noreferrer"&gt;Cluster API&lt;/a&gt; 🔥🔥🔥🔥🔥 - Cluster API is a Kubernetes sub-project focused on providing declarative APIs and tooling to simplify provisioning, upgrading, and operating multiple Kubernetes clusters.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/weaveworks/eksctl" rel="noopener noreferrer"&gt;eksctl&lt;/a&gt; 🔥🔥🔥🔥🔥 - &lt;code&gt;eksctl&lt;/code&gt; is a simple CLI tool for creating clusters on EKS - Amazon's new managed Kubernetes service for EC2.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/k0sproject/k0s" rel="noopener noreferrer"&gt;k0s&lt;/a&gt; 🔥🔥🔥🔥🔥 - k0s - Zero Friction Kubernetes (The Simple, Solid &amp;amp; Certified Kubernetes Distribution)&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/rancher/k3d" rel="noopener noreferrer"&gt;k3d&lt;/a&gt; 🔥🔥🔥🔥🔥 - k3d,and Windows.,destroy,half the memory,highly available,is a tool for running local k3s clusters in docker. It's a single binary about 20 MB. You need to have docker installed.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/rancher/k3s" rel="noopener noreferrer"&gt;k3s&lt;/a&gt; 🔥🔥🔥🔥🔥 - Lightweight Kubernetes. Easy to install,Kubernetes clusters from the command line.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubernetes-sigs/kind" rel="noopener noreferrer"&gt;kind&lt;/a&gt; 🔥🔥🔥🔥🔥 - kind is a tool for running local Kubernetes clusters using Docker container "nodes".&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubernetes/kops" rel="noopener noreferrer"&gt;kops&lt;/a&gt; 🔥🔥🔥🔥🔥 - &lt;code&gt;kops&lt;/code&gt; helps you create,like kind,upgrade and maintain production-grade&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubernetes-incubator/kube-aws" rel="noopener noreferrer"&gt;kube-aws&lt;/a&gt; 🔥🔥🔥🔥 - &lt;code&gt;kube-aws&lt;/code&gt; is a command-line tool to create/update/destroy Kubernetes clusters on AWS.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubernetes-sigs/kubespray" rel="noopener noreferrer"&gt;kubespray&lt;/a&gt; 🔥🔥🔥🔥🔥 - Deploy a production ready Kubernetes cluster&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/ubuntu/microk8s" rel="noopener noreferrer"&gt;microK8s&lt;/a&gt; 🔥🔥🔥🔥🔥 - The smallest, fastest Kubernetes&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubernetes/minikube" rel="noopener noreferrer"&gt;Minikube&lt;/a&gt; 🔥🔥🔥🔥🔥 - minikube implements a local Kubernetes cluster on macOS,Linux,all in a binary less than 100 MB.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/siderolabs/talos" rel="noopener noreferrer"&gt;Talos Linux&lt;/a&gt; 🔥🔥🔥🔥🔥 - Talos Linux is a minimal, immutable, secure OS that installs vanilla Kubernetes - for production datacenters, K8s@home, and Edge.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="[https://karpenter.sh](https://github.com/aws/karpenter-provider-aws)"&gt;karpenter&lt;/a&gt; 🔥🔥🔥🔥🔥 - Karpenter is a Kubernetes Node Autoscaler built for flexibility, performance, and simplicity.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/" rel="noopener noreferrer"&gt;Kubeadm&lt;/a&gt; - kubeadm performs the actions necessary to get a minimum viable cluster up and running.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Automation and CI/CD
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💚&lt;a href="https://github.com/argoproj/argo-cd" rel="noopener noreferrer"&gt;Argo CD&lt;/a&gt; 🔥🔥🔥🔥🔥 - Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/argoproj/argo-events" rel="noopener noreferrer"&gt;Argo Events&lt;/a&gt; 🔥🔥🔥🔥 - Argo Events is an event-driven workflow automation framework for Kubernetes which helps you trigger K8s objects, Argo Workflows, Serverless workloads, etc.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/argoproj/argo-rollouts" rel="noopener noreferrer"&gt;Argo Rollouts&lt;/a&gt; 🔥🔥🔥🔥 - Argo Rollouts controller, uses the Rollout custom resource to provide additional deployment strategies such as Blue Green and Canary to Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/argoproj/argo" rel="noopener noreferrer"&gt;Argo Workflows&lt;/a&gt; 🔥🔥🔥🔥🔥 - Argo Workflows is an open source container-native workflow engine for orchestrating parallel jobs on Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/argoproj-labs/argocd-autopilot" rel="noopener noreferrer"&gt;Argocd autopilot&lt;/a&gt; 🔥🔥🔥 - The Argo-CD Autopilot is a tool which offers an opinionated way of installing Argo-CD and managing GitOps repositories.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/weaveworks/flagger" rel="noopener noreferrer"&gt;Flagger&lt;/a&gt; 🔥🔥🔥🔥🔥 - Flagger is a progressive delivery tool that automates the release process for applications running on Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/fluxcd/flux2" rel="noopener noreferrer"&gt;Flux2&lt;/a&gt; 🔥🔥🔥🔥🔥 - Flux version 2 is built from the ground up to use Kubernetes' API extension system, and to integrate with Prometheus and other core components of the Kubernetes ecosystem.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/estahn/k8s-image-swapper/" rel="noopener noreferrer"&gt;k8s-image-swapper&lt;/a&gt; 🔥🔥 - &lt;code&gt;k8s-image-swapper&lt;/code&gt; is a mutating webhook for Kubernetes, downloading images into your own registry and pointing the images to that new location.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubero-dev/kubero" rel="noopener noreferrer"&gt;Kubero&lt;/a&gt; 🔥🔥🔥🔥🔥 - A free and self-hosted Heroku PaaS alternative for Kubernetes that implements GitOps&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubesphere/kubesphere" rel="noopener noreferrer"&gt;KubeSphere&lt;/a&gt; 🔥🔥🔥🔥🔥 - KubeSphere is a distributed operating system providing cloud native stack with Kubernetes as its kernel, and aims to be plug-and-play architecture for third-party applications seamless integration to boost its ecosystem.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/stakater/Reloader" rel="noopener noreferrer"&gt;Reloader&lt;/a&gt; 🔥🔥🔥🔥🔥 - Reloader can watch changes in &lt;code&gt;ConfigMap&lt;/code&gt; and &lt;code&gt;Secret&lt;/code&gt; and do rolling upgrades on Pods with their associated &lt;code&gt;DeploymentConfigs&lt;/code&gt;, &lt;code&gt;Deployments&lt;/code&gt;, &lt;code&gt;Daemonsets&lt;/code&gt; and &lt;code&gt;Statefulsets&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/appvia/terranetes-controller" rel="noopener noreferrer"&gt;terranetes-controller&lt;/a&gt; 🔥 - Terranetes controller enables the platform team to deliver self-service capabilities around cloud resources.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/GoogleContainerTools/skaffold" rel="noopener noreferrer"&gt;Skaffold&lt;/a&gt; 🔥🔥🔥🔥🔥 - Skaffold is a command line tool that facilitates continuous development for Kubernetes applications.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/spinnaker/spinnaker" rel="noopener noreferrer"&gt;Spinnaker&lt;/a&gt; 🔥🔥🔥🔥🔥 - Spinnaker is an open-source continuous delivery platform for releasing software changes with high velocity and confidence.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/weaveworks/tf-controller" rel="noopener noreferrer"&gt;TF-controller&lt;/a&gt; 🔥 - TF-controller is an experimental controller for Flux to reconcile Terraform resources in the GitOps way.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/werf/werf" rel="noopener noreferrer"&gt;werf&lt;/a&gt; 🔥🔥🔥🔥🔥 - werf is a CLI tool glueing Git, Docker, Helm &amp;amp; Kubernetes with any CI system to implement CI/CD and GitOps. &lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/weaveworks/weave-gitops" rel="noopener noreferrer"&gt;Weave GitOps&lt;/a&gt; 🔥🔥 - Weave GitOps is a simple open source developer platform for people who want cloud native applications, without needing Kubernetes expertise.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/redkubes/otomi-core" rel="noopener noreferrer"&gt;Otomi - Self-hosted PaaS for K8s&lt;/a&gt; 🔥🔥🔥🔥 - Otomi adds developer- and operations-centric tools, automation, and developer self-service on top of Kubernetes in any infrastructure or cloud, to code, build, release, deploy, secure, operate and monitor containerized applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cluster Resources Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💚&lt;a href="https://github.com/clusterpedia-io/clusterpedia" rel="noopener noreferrer"&gt;Clusterpedia&lt;/a&gt; 🔥 - Clusterpedia is used for complex resource searches across multiple clusters, support simultaneous search of a single kind of resource or multiple kinds of resources existing in multiple clusters.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/grafana/tanka" rel="noopener noreferrer"&gt;Grafana Tanka&lt;/a&gt; 🔥🔥🔥🔥 - The clean, concise and super flexible alternative to YAML for your Kubernetes cluster.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kedacore/keda" rel="noopener noreferrer"&gt;KEDA&lt;/a&gt; 🔥🔥🔥🔥🔥 - KEDA allows for fine grained autoscaling (including to/from zero) for event driven Kubernetes workloads.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/openkruise/kruise" rel="noopener noreferrer"&gt;Kruise&lt;/a&gt; 🔥🔥🔥🔥🔥 - Kruise consists of several controllers which extend and complement the Kubernetes core controllers for workload management.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/bluek8s/kubedirector" rel="noopener noreferrer"&gt;KubeDirector&lt;/a&gt; 🔥🔥 - KubeDirector uses standard Kubernetes (K8s) facilities of custom resources and API extensions to implement stateful scaleout application clusters.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubenav/kubenav" rel="noopener noreferrer"&gt;Kubenav&lt;/a&gt; 🔥🔥🔥🔥 - kubenav is the navigator for your Kubernetes clusters right in your pocket.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/liqotech/liqo" rel="noopener noreferrer"&gt;Liqo&lt;/a&gt; 🔥🔥 - Liqo implements Dynamic resource sharing across different Kubernetes clusters (e.g.; offloading pods and services), supporting decentralized governance.&lt;/li&gt;
&lt;li&gt;💚 &lt;a href="https://github.com/meshery/meshery" rel="noopener noreferrer"&gt;Meshery&lt;/a&gt; 🔥🔥🔥🔥🔥 - Meshery is an open-source cloud-native manager that enables the design and management of all Kubernetes-based infrastructure and applications.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/FairwindsOps/pluto" rel="noopener noreferrer"&gt;Pluto&lt;/a&gt; 🔥🔥🔥🔥 - Pluto is a utility to help users find deprecated Kubernetes apiVersions in their code repositories and their helm releases.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/FairwindsOps/polaris" rel="noopener noreferrer"&gt;Polaris&lt;/a&gt; 🔥🔥🔥🔥🔥 - Polaris is an open source policy engine for Kubernetes that validates and remediates resource configuration.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/projectsveltos/addon-manager" rel="noopener noreferrer"&gt;Projectsveltos&lt;/a&gt; 🔥 Projectsveltos is a Kubernetes add-on controller that simplifies the deployment and management of add-ons and applications across multiple clusters.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubernetes-sigs/multi-tenancy/tree/master/incubator/hnc" rel="noopener noreferrer"&gt;The Hierarchical Namespace Controller&lt;/a&gt; 🔥🔥🔥 - Hierarchical namespaces make it easier to share your cluster by making namespaces more powerful.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Secrets Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💚&lt;a href="https://github.com/godaddy/kubernetes-external-secrets" rel="noopener noreferrer"&gt;Kubernetes External Secrets&lt;/a&gt; 🔥🔥🔥🔥🔥 - Kubernetes External Secrets allows you to use external secret management systems, like AWS Secrets Manager or HashiCorp Vault, to securely add secrets in Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/bitnami-labs/sealed-secrets" rel="noopener noreferrer"&gt;Sealed Secrets&lt;/a&gt; 🔥🔥🔥🔥🔥 - Encrypt your Secret into a SealedSecret, which is safe to store - even to a public repository.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/SparebankenVest/azure-key-vault-to-kubernetes" rel="noopener noreferrer"&gt;akv2k8s&lt;/a&gt; 🔥🔥 - Azure Key Vault to Kubernetes (akv2k8s) will make Azure Key Vault objects available to Kubernetes in two ways: as native Kubernetes Secrets; as environment variables directly injected into your Container application&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Networking
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💚&lt;a href="https://github.com/projectcalico/calico" rel="noopener noreferrer"&gt;Calico Networking&lt;/a&gt; 🔥🔥🔥🔥🔥 - Calico is an open source networking and network security solution for containers, virtual machines, and bare-metal workloads&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/jetstack/cert-manager" rel="noopener noreferrer"&gt;cert-manager&lt;/a&gt; 🔥🔥🔥🔥🔥 - cert-manager is a Kubernetes add-on to automate the management and issuance of TLS certificates from various issuing sources.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/cilium/cilium" rel="noopener noreferrer"&gt;cilium&lt;/a&gt; 🔥🔥🔥🔥🔥 - Cilium is a networking, observability, and security solution with an eBPF-based dataplane.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/coredns/coredns" rel="noopener noreferrer"&gt;CoreDNS&lt;/a&gt; 🔥🔥🔥🔥🔥 - CoreDNS is a fast and flexible DNS server that works on Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubernetes/ingress-nginx" rel="noopener noreferrer"&gt;ingress-nginx&lt;/a&gt; 🔥🔥🔥🔥🔥 - &lt;code&gt;ingress-nginx&lt;/code&gt; is an Ingress controller for Kubernetes using NGINX as a reverse proxy and load balancer.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/Kong/kubernetes-ingress-controller" rel="noopener noreferrer"&gt;Kong for Kubernetes&lt;/a&gt; 🔥🔥🔥🔥 - Configure plugins, health checking, load balancing and more in Kong for Kubernetes Services.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/eldadru/ksniff" rel="noopener noreferrer"&gt;ksniff&lt;/a&gt; 🔥🔥🔥🔥 - A kubectl plugin that utilize tcpdump and Wireshark to start a remote capture on any pod in your Kubernetes cluster.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/iovisor/kubectl-trace" rel="noopener noreferrer"&gt;kubectl trace&lt;/a&gt; 🔥🔥🔥🔥 - &lt;code&gt;kubectl trace&lt;/code&gt; is a kubectl plugin that allows you to schedule the execution of bpftrace programs in your Kubernetes cluster.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/immanuelfodor/kube-karp" rel="noopener noreferrer"&gt;Kube Karp&lt;/a&gt; 🔥 - Add a floating virtual IP to Kubernetes cluster nodes for load balancing easily based on the CARP protocol&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/nginxinc/kubernetes-ingress" rel="noopener noreferrer"&gt;kubernetes-ingress&lt;/a&gt; 🔥🔥🔥🔥🔥  - An implementation of an Ingress controller for NGINX and NGINX Plus (commercial).&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/alauda/kube-ovn" rel="noopener noreferrer"&gt;kube-ovn&lt;/a&gt; 🔥🔥🔥🔥  - A Kubernetes Network Fabric for Enterprises that is Rich in Functions and Easy in Operations.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/loxilb-io/loxilb" rel="noopener noreferrer"&gt;loxilb&lt;/a&gt; 🔥🔥🔥  - A Kubernetes service load-balancer based on eBPF.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Storage
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💚&lt;a href="https://github.com/longhorn/longhorn" rel="noopener noreferrer"&gt;Longhorn&lt;/a&gt; 🔥🔥🔥🔥🔥 - Longhorn is a distributed block storage system for Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/openebs/openebs" rel="noopener noreferrer"&gt;OpenEBS&lt;/a&gt; 🔥🔥🔥🔥🔥 - OpenEBS is the most widely deployed and easy to use open-source storage solution for Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/rook/rook" rel="noopener noreferrer"&gt;Rook&lt;/a&gt; 🔥🔥🔥🔥🔥 - Rook is an open source cloud-native storage orchestrator for Kubernetes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Testing and Troubleshooting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kyverno/chainsaw" rel="noopener noreferrer"&gt;Chainsaw&lt;/a&gt; 🔥 - The ultimate end to end testing tool for Kubernetes operators.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/pingcap/chaos-mesh" rel="noopener noreferrer"&gt;Chaos Mesh&lt;/a&gt; 🔥🔥🔥🔥🔥 - Chaos Mesh® is a cloud-native Chaos Engineering platform that orchestrates chaos on Kubernetes environments.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/linki/chaoskube" rel="noopener noreferrer"&gt;chaoskube&lt;/a&gt; 🔥🔥🔥🔥 - &lt;code&gt;chaoskube&lt;/code&gt; periodically kills random pods in your Kubernetes cluster.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/open-policy-agent/conftest" rel="noopener noreferrer"&gt;Conftest&lt;/a&gt; 🔥🔥🔥🔥 - Conftest helps you write tests against structured configuration data.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/bats-core/bats-detik" rel="noopener noreferrer"&gt;DETIK&lt;/a&gt; 🔥 - A library that simplifies end-to-end testing of K8s applications by using &lt;a href="https://github.com/bats-core/bats-core" rel="noopener noreferrer"&gt;BATS&lt;/a&gt; assertions and natural language queries.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/loadimpact/k6" rel="noopener noreferrer"&gt;k6&lt;/a&gt; 🔥🔥🔥🔥🔥 - k6 is a modern load testing tool, building on Load Impact's years of experience in the load and performance testing industry.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/eldadru/ksniff" rel="noopener noreferrer"&gt;ksniff&lt;/a&gt; 🔥🔥🔥🔥 - A kubectl plugin that utilize tcpdump and Wireshark to start a remote capture on any pod in your Kubernetes cluster.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/storax/kubedoom" rel="noopener noreferrer"&gt;Kube DOOM&lt;/a&gt; 🔥🔥🔥🔥 - The next level of chaos engineering is here! Kill pods inside your Kubernetes cluster by shooting them in Doom!&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/asobti/kube-monkey" rel="noopener noreferrer"&gt;kube-monkey&lt;/a&gt; 🔥🔥🔥🔥🔥 - It randomly deletes Kubernetes (k8s) pods in the cluster encouraging and validating the development of failure-resilient services.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/zegl/kube-score" rel="noopener noreferrer"&gt;kube-score&lt;/a&gt; 🔥🔥🔥🔥 - &lt;code&gt;kube-score&lt;/code&gt; is a tool that performs static code analysis of your Kubernetes object definitions.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/JamesTGrant/kubectl-debug" rel="noopener noreferrer"&gt;Kubectl-debug&lt;/a&gt; 🔥🔥🔥🔥🔥 - &lt;code&gt;kubectl-debug&lt;/code&gt; is an out-of-tree solution for troubleshooting running pods, which allows you to run a new container in running pods for debugging purpose.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/lucky-sideburn/KubeInvaders" rel="noopener noreferrer"&gt;KubeInvaders&lt;/a&gt; 🔥🔥🔥 - Through KubeInvaders you can stress Kubernetes cluster in a fun way and check how it is resilient.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/vapor-ware/kubetest" rel="noopener noreferrer"&gt;Kubetest&lt;/a&gt; 🔥 - Kubetest is a pytest plugin that makes it easier to manage a Kubernetes cluster within your integration tests.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/litmuschaos/litmus" rel="noopener noreferrer"&gt;Litmus&lt;/a&gt; 🔥🔥🔥🔥🔥 - Litmus provides tools to orchestrate chaos on Kubernetes to help SREs find weaknesses in their deployments.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://popeyecli.io/" rel="noopener noreferrer"&gt;popeye&lt;/a&gt; 🔥🔥🔥🔥🔥 - Popeye is a utility that scans live Kubernetes cluster and reports potential issues with deployed resources and configurations.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/bloomberg/powerfulseal" rel="noopener noreferrer"&gt;PowerfulSeal&lt;/a&gt; 🔥🔥🔥🔥 - PowerfulSeal injects failure into your Kubernetes clusters, so that you can detect problems as early as possible.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubeshop/testkube" rel="noopener noreferrer"&gt;Testkube&lt;/a&gt; 🔥🔥🔥 - Testkube is a Kubernetes native Testing Framework for test orchestration and execution. It allows you to run any of your tests inside a Kubernetes cluster. Integrates with your CI/CD and allows you to follow a GitOps approach to Testing while having a centralized place for all of your Test Results accross all clusters.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Monitoring, Alerts, and Visualization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💚&lt;a href="https://github.com/infracloudio/botkube" rel="noopener noreferrer"&gt;BotKube&lt;/a&gt; 🔥🔥🔥🔥 - BotKube integration with Slack or Mattermost helps you monitor your Kubernetes cluster, debug critical deployments and gives recommendations for standard practices by running checks on the Kubernetes resources.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/flanksource/canary-checker" rel="noopener noreferrer"&gt;Canary Checker&lt;/a&gt; 🔥 - Canary Checker is a kubernetes-native health check platform with 30+ built-in health check types.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/cortexproject/cortex" rel="noopener noreferrer"&gt;Cortex&lt;/a&gt; 🔥🔥🔥🔥🔥 - Cortex provides horizontally scalable, highly available, multi-tenant, long term storage for Prometheus.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/FairwindsOps/goldilocks" rel="noopener noreferrer"&gt;Goldilocks&lt;/a&gt; 🔥🔥🔥 - Goldilocks is a utility that can help you identify a starting point for resource requests and limits.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/bloomberg/goldpinger" rel="noopener noreferrer"&gt;Goldpinger&lt;/a&gt; 🔥🔥🔥🔥🔥 - Debugging tool for Kubernetes which tests and displays connectivity between nodes in the cluster.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/grafana/grafana" rel="noopener noreferrer"&gt;Grafana&lt;/a&gt; 🔥🔥🔥🔥🔥 - Grafana allows you to query, visualize, alert on and understand your metrics no matter where they are stored.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/komodorio/helm-dashboard" rel="noopener noreferrer"&gt;Helm Dashboard&lt;/a&gt; 🔥🔥🔥🔥 - The missing UI for Helm. The Helm Dashboard plugin offers a UI-driven way to view installed Helm charts, see their revision history and corresponding k8s resources. &lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kiali/kiali" rel="noopener noreferrer"&gt;Kiali&lt;/a&gt; 🔥🔥🔥🔥🔥 - Kiali works with Istio to visualise the service mesh topology.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/flant/k8s-image-availability-exporter" rel="noopener noreferrer"&gt;k8s-image-availability-exporter&lt;/a&gt; 🔥 - Prometheus exporter that warns you proactively about images that are defined in Kubernetes objects but are not available in the container registry. &lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/robscott/kube-capacity" rel="noopener noreferrer"&gt;kube-capacity&lt;/a&gt; 🔥🔥🔥 - This is a simple CLI that provides an overview of the resource requests, limits, and utilization in a Kubernetes cluster.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubernetes/dashboard" rel="noopener noreferrer"&gt;Kubernetes Dashboard&lt;/a&gt; 🔥🔥🔥🔥🔥 - Kubernetes Dashboard is a general purpose, web-based UI for Kubernetes clusters.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/relferreira/kubedev" rel="noopener noreferrer"&gt;Kubedev&lt;/a&gt; 🔥 - Kubedev is a powerful and beautiful user interface for managing Kubernetes clusters.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/KubeHelper/kubehelper" rel="noopener noreferrer"&gt;KubeHelper&lt;/a&gt; 🔥 - KubeHelper - simplifies many daily Kubernetes cluster tasks through a web interface.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubernetes-sigs/metrics-server" rel="noopener noreferrer"&gt;Kubernetes Metrics Server&lt;/a&gt; 🔥🔥🔥🔥🔥 - Metrics Server is a scalable, efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/hjacobs/kube-ops-view" rel="noopener noreferrer"&gt;Kubernetes Operational View&lt;/a&gt; 🔥🔥🔥🔥 - A tool that aims to provide a common operational picture for multiple Kubernetes clusters.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubernetes/kube-state-metrics" rel="noopener noreferrer"&gt;kube-state-metrics&lt;/a&gt; 🔥🔥🔥🔥🔥 - kube-state-metrics is a simple service that listens to the Kubernetes API server and generates metrics about the state of the objects.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/robusta-dev/kubewatch" rel="noopener noreferrer"&gt;kubewatch&lt;/a&gt; 🔥🔥🔥🔥🔥 - &lt;code&gt;kubewatch&lt;/code&gt; is a Kubernetes watcher that currently publishes notification to available collaboration hubs/notification channels.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/lensapp/lens" rel="noopener noreferrer"&gt;Lens&lt;/a&gt; 🔥🔥🔥🔥🔥 - Lens it's an useful, attractive, open source user interface (UI) for working with Kubernetes clusters.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/up9inc/mizu" rel="noopener noreferrer"&gt;Mizu&lt;/a&gt; 🔥🔥🔥 - API traffic viewer for Kubernetes enabling you to view all API communication between microservices. Think TCPDump and Wireshark re-invented for Kubernetes&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/otterize/network-mapper" rel="noopener noreferrer"&gt;Network mapper&lt;/a&gt; 🔥🔥 - Map Kubernetes in-cluster traffic and export as text, intents, or an image.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/derailed/popeye" rel="noopener noreferrer"&gt;Popeye&lt;/a&gt; 🔥🔥🔥🔥🔥 - Popeye is a utility that scans live Kubernetes cluster and reports potential issues with deployed resources and configurations.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/prometheus/prometheus" rel="noopener noreferrer"&gt;Prometheus&lt;/a&gt; 🔥🔥🔥🔥🔥 - Prometheus, a Cloud Native Computing Foundation project, is a systems and service monitoring system.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/searchlight/searchlight" rel="noopener noreferrer"&gt;Searchlight&lt;/a&gt; 🔥🔥 - Searchlight/Icinga periodically runs various checks on a Kubernetes cluster and sends notifications if detects an issue.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/salesforce/sloop" rel="noopener noreferrer"&gt;Sloop&lt;/a&gt; 🔥🔥🔥 - Sloop monitors Kubernetes, recording histories of events and resource state changes and providing visualizations to aid in debugging past events.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/thanos-io/thanos" rel="noopener noreferrer"&gt;Thanos&lt;/a&gt; 🔥🔥🔥🔥🔥 - Thanos is a set of components that can be composed into a highly available metric system with unlimited storage capacity.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/guiqui/k8Studio" rel="noopener noreferrer"&gt;K8Studio&lt;/a&gt; 🔥🔥🔥 - K8Studio IDE to manage and visualise Kubernetes Clusters.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Backup and Restore
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💚&lt;a href="https://github.com/bpineau/katafygio" rel="noopener noreferrer"&gt;katafygio&lt;/a&gt; 🔥 - katafygio discovers Kubernetes objects (deployments, services, ...), and continuously save them as yaml files in a git repository.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/vmware-tanzu/velero" rel="noopener noreferrer"&gt;Velero&lt;/a&gt; 🔥🔥🔥🔥🔥 - Velero (formerly Heptio Ark) gives you tools to back up and restore your Kubernetes cluster resources and persistent volumes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Security and Compliance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💚&lt;a href="https://github.com/datreeio/datree" rel="noopener noreferrer"&gt;Datree&lt;/a&gt; 🔥🔥🔥🔥🔥 - Datree is a CLI tool that supports Kubernetes admins in their roles by preventing developers from making errors in Kubernetes configurations that can cause clusters to fail in production.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/deepfence/ThreatMapper" rel="noopener noreferrer"&gt;Deepfence ThreatMapper&lt;/a&gt; 🔥🔥🔥 - Apache v2, powerful runtime vulnerability scanner for kubernetes, virtual machines and serverless.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/falcosecurity/falco" rel="noopener noreferrer"&gt;Falco&lt;/a&gt; 🔥🔥🔥🔥🔥 - Falco is a behavioral activity monitor designed to detect anomalous activity in your applications. You can use Falco to monitor run-time security of your Kubernetes applications and internal components.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/open-policy-agent/gatekeeper" rel="noopener noreferrer"&gt;Gatekeeper&lt;/a&gt; 🔥🔥🔥🔥🔥 - Policy controller for Kubernetes&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/otterize/intents-operator" rel="noopener noreferrer"&gt;Intents operator&lt;/a&gt; 🔥🔥 - Manage network policies, Istio Authorization Policies, and Kafka ACLs in a Kubernetes cluster with ease.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/cruise-automation/k-rail" rel="noopener noreferrer"&gt;k-rail&lt;/a&gt; 🔥🔥 - k-rail is a workload policy enforcement tool for Kubernetes. It can help you secure a multi tenant cluster with minimal disruption and maximum velocity.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/plexsystems/konstraint" rel="noopener noreferrer"&gt;Konstraint&lt;/a&gt; 🔥🔥 - Konstraint is a CLI tool to assist with the creation and management of constraints when using Gatekeeper.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/aquasecurity/kube-bench" rel="noopener noreferrer"&gt;kube-bench&lt;/a&gt; 🔥🔥🔥🔥🔥 - kube-bench is a Go application that checks whether Kubernetes is deployed securely by running the checks documented in the CIS Kubernetes Benchmark.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/aquasecurity/kube-hunter" rel="noopener noreferrer"&gt;kube-hunter&lt;/a&gt; 🔥🔥🔥🔥🔥 - kube-hunter hunts for security weaknesses in Kubernetes clusters.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/stackrox/kube-linter" rel="noopener noreferrer"&gt;KubeLinter&lt;/a&gt; 🔥🔥🔥🔥 - KubeLinter is a static analysis tool that checks Kubernetes YAML files and Helm charts to ensure the applications represented in them adhere to best practices.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/cyberark/kubesploit" rel="noopener noreferrer"&gt;Kubesploit&lt;/a&gt; 🔥🔥🔥 - Kubesploit is a cross-platform post-exploitation HTTP/2 Command &amp;amp; Control server and agent dedicated for containerized environments written in Golang and built on top of Merlin project by Russel Van Tuyl (&lt;a class="mentioned-user" href="https://dev.to/ne0nd0g"&gt;@ne0nd0g&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/cyberark/KubiScan" rel="noopener noreferrer"&gt;KubiScan&lt;/a&gt; 🔥🔥🔥 - A tool for scanning Kubernetes cluster for risky permissions in Kubernetes's Role-based access control (RBAC) authorization model.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kyverno/kyverno" rel="noopener noreferrer"&gt;Kyverno&lt;/a&gt; 🔥🔥🔥🔥 - Kyverno is a policy engine designed for Kubernetes. It can validate, mutate, and generate configurations using admission controls and background scans.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/hardbyte/netchecks/" rel="noopener noreferrer"&gt;Netchecks&lt;/a&gt; 🔥 - Set of tools for testing network conditions and asserting that they are as expected.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/sighupio/permission-manager" rel="noopener noreferrer"&gt;Permission manager&lt;/a&gt; 🔥🔥🔥 - Permission Manager is an application developed by SIGHUP that enables a super-easy and user-friendly RBAC management for Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/corneliusweig/rakkess" rel="noopener noreferrer"&gt;rakkess&lt;/a&gt; 🔥🔥🔥 - kubectl plugin to show an access matrix for server resources&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/rond-authz/rond" rel="noopener noreferrer"&gt;Rönd&lt;/a&gt; 🔥 - Rönd is an open-source lightweight Kubernetes sidecar container that helps you protect your APIs with simple security policies. It also natively allows you to build your RBAC/ABAC solution.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/gravitational/teleport" rel="noopener noreferrer"&gt;Teleport&lt;/a&gt; 🔥🔥🔥🔥🔥 - Teleport Unified Access Plane enables engineers to quickly access any computing resource anywhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Service Mesh
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💚&lt;a href="https://github.com/istio/istio" rel="noopener noreferrer"&gt;Istio&lt;/a&gt; 🔥🔥🔥🔥🔥 - An open platform to connect, manage, and secure microservices.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/linkerd/linkerd" rel="noopener noreferrer"&gt;Linkerd&lt;/a&gt; 🔥🔥🔥🔥🔥 - Linkerd is a transparent service mesh, designed to make modern applications safe and sane.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/openservicemesh/osm/" rel="noopener noreferrer"&gt;Open Service Mesh&lt;/a&gt; 🔥🔥🔥🔥🔥 - Open Service Mesh (OSM) is a lightweight, extensible, Cloud Native service mesh that allows users to uniformly manage, secure, and get out-of-the-box observability features for highly dynamic microservice environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Development Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💚&lt;a href="https://github.com/cyclops-ui/cyclops" rel="noopener noreferrer"&gt;Cyclops&lt;/a&gt; 🔥🔥 - Customizable UI for Kubernetes deployments&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/eclipse/jkube" rel="noopener noreferrer"&gt;Eclipse JKube&lt;/a&gt; 🔥🔥 - Tools and plugins for Java developers that help you create container images along with the required manifests to deploy your applications to Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/garden-io/garden" rel="noopener noreferrer"&gt;garden&lt;/a&gt; 🔥🔥🔥🔥🔥 - Garden provides production-like Kubernetes testing environments for integration tests, QA, and development.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/gefyrahq/gefyra" rel="noopener noreferrer"&gt;gefyra&lt;/a&gt; 🔥🔥🔥 -Gefyra blazingly-fast, rock-solid, local application development ➡️ with Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/google/ko" rel="noopener noreferrer"&gt;ko&lt;/a&gt; 🔥🔥🔥🔥🔥 - &lt;code&gt;ko&lt;/code&gt; is a tool for building and deploying Golang applications to Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/cloud66-oss/konfig" rel="noopener noreferrer"&gt;Konfig&lt;/a&gt; 🔥 - Konfig is a Kubernetes friendly Rails gem. It can load configuration and secrets from both YAML or folders with individual files and present them to your application the same way.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubevious/Kubevious" rel="noopener noreferrer"&gt;kubevious&lt;/a&gt; 🔥🔥🔥🔥 - Kubevious renders all configurations relevant to the application in one place. That saves a lot of time from operators, eliminating the need for looking up settings and digging within selectors and labels.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/ernoaapa/kubectl-warp" rel="noopener noreferrer"&gt;kubectl-warp&lt;/a&gt; 🔥🔥 - Kubernetes CLI plugin for syncing and executing local files in Pod on Kubernetes&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/saschagrunert/kubernix" rel="noopener noreferrer"&gt;kubernix&lt;/a&gt; 🔥🔥🔥 - This project aims to provide single dependency Kubernetes clusters for local testing, experimenting and development purposes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/uber/makisu" rel="noopener noreferrer"&gt;Makisu&lt;/a&gt; 🔥🔥🔥🔥🔥 - Makisu is a fast and flexible Docker image build tool designed for unprivileged containerized environments such as Mesos or Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/metalbear-co/mirrord" rel="noopener noreferrer"&gt;mirrord&lt;/a&gt; 🔥🔥🔥🔥🔥 - mirrord connects your local process and your cloud environment, and runs local code in cloud conditions.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubeshop/monokle" rel="noopener noreferrer"&gt;Monokle&lt;/a&gt; 🔥🔥🔥 - Monokle helps you create, edit and validate yaml manifests, visualize and validate resource links and dependencies, connect and compare resources to your clusters, debug the output of kustomize or helm, and more!&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/okteto/okteto" rel="noopener noreferrer"&gt;Okteto&lt;/a&gt; 🔥🔥🔥🔥 - &lt;code&gt;okteto&lt;/code&gt; accelerates the development workflow of Kubernetes applications.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/telepresenceio/telepresence" rel="noopener noreferrer"&gt;Telepresence&lt;/a&gt; 🔥🔥🔥🔥🔥 - Telepresence provides fast, realistic local development for Kubernetes microservices.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/tilt-dev/tilt" rel="noopener noreferrer"&gt;Tilt&lt;/a&gt; 🔥🔥🔥🔥🔥 - Tilt powers multi-service development and makes sure they behave.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/dotnet/tye" rel="noopener noreferrer"&gt;Tye&lt;/a&gt; 🔥🔥🔥🔥🔥 - Tye is a developer tool that makes developing, testing, and deploying microservices and distributed applications easier.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aptakube.com" rel="noopener noreferrer"&gt;Aptakube&lt;/a&gt; - A modern, lightweight and multi-cluster desktop client for Kubernetes. Connect to multiple clusters simultaneously to view, edit and manage all your resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Processing and Machine Learning
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubeflow/kubeflow" rel="noopener noreferrer"&gt;Kubeflow&lt;/a&gt; 🔥🔥🔥🔥🔥 - Kubeflow is a Cloud Native platform for machine learning based on Google’s internal machine learning pipelines.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/nebuly-ai/nos" rel="noopener noreferrer"&gt;nos&lt;/a&gt; 🔥🔥 - &lt;code&gt;nos&lt;/code&gt; is an open-source platform to efficiently run AI workloads on Kubernetes, increasing GPU utilization and reducing infrastructure and operational costs.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/strimzi/strimzi-kafka-operator" rel="noopener noreferrer"&gt;Strimzi&lt;/a&gt; 🔥🔥🔥🔥🔥 - Strimzi provides a way to run an Apache Kafka cluster on Kubernetes or OpenShift in various deployment configurations.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/volcano-sh/volcano" rel="noopener noreferrer"&gt;Volcano&lt;/a&gt; 🔥🔥🔥🔥 - Volcano is a batch system built on Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/apache/incubator-yunikorn-core" rel="noopener noreferrer"&gt;yunikorn&lt;/a&gt; 🔥🔥 - a light-weight, universal resource scheduler for container orchestrator systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💚&lt;a href="https://github.com/reactive-tech/kubegres" rel="noopener noreferrer"&gt;Kubegres&lt;/a&gt; 🔥🔥🔥 - Kubegres is a Kubernetes operator allowing to deploy one or many clusters of PostgreSql pods with data replication and failover enabled out-of-the box.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/CrunchyData/postgres-operator" rel="noopener noreferrer"&gt;Postgres Operator&lt;/a&gt; 🔥🔥🔥🔥🔥 - PGO, the Postgres Operator from Crunchy Data, gives you a declarative Postgres solution that automatically manages your PostgreSQL clusters.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/mongodb/mongodb-kubernetes-operator" rel="noopener noreferrer"&gt;MongoDB Community Kubernetes Operator&lt;/a&gt; 🔥🔥 - This is a Kubernetes Operator which deploys MongoDB Community into Kubernetes clusters.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/mysql/mysql-operator" rel="noopener noreferrer"&gt;MySQL Operator for Kubernetes&lt;/a&gt; 🔥 - The MYSQL Operator for Kubernetes is an Operator for Kubernetes managing MySQL InnoDB Cluster setups inside a Kubernetes Cluster.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/spotahome/redis-operator" rel="noopener noreferrer"&gt;Redis Operator&lt;/a&gt; 🔥🔥🔥 - Redis Operator creates/configures/manages redis-failovers atop Kubernetes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Miscellaneous
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💚&lt;a href="https://github.com/googleforgames/agones" rel="noopener noreferrer"&gt;Agones&lt;/a&gt; 🔥🔥🔥🔥🔥 - Agones is a library for hosting, running and scaling dedicated game servers on Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/aws/aws-controllers-k8s" rel="noopener noreferrer"&gt;AWS Controllers for Kubernetes&lt;/a&gt; 🔥🔥🔥🔥 - AWS Controllers for Kubernetes (ACK) lets you define and use AWS service resources directly from Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/aws/aws-node-termination-handler" rel="noopener noreferrer"&gt;AWS Node Termination Handler&lt;/a&gt; 🔥🔥🔥 - A Kubernetes Daemonset to gracefully handle EC2 instance shutdown&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/brigadecore/brigade/" rel="noopener noreferrer"&gt;Brigade&lt;/a&gt; 🔥🔥🔥🔥🔥 - Brigade is the tool for creating pipelines for Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/crossplane/crossplane" rel="noopener noreferrer"&gt;Crossplane&lt;/a&gt; 🔥🔥🔥🔥🔥 - Crossplane is an open source Kubernetes add-on that extends any cluster with the ability to provision and manage cloud infrastructure, services, and applications.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubernetes-sigs/descheduler" rel="noopener noreferrer"&gt;Descheduler for Kubernetes&lt;/a&gt; 🔥🔥🔥🔥🔥 - Descheduling pods from nodes based on policies&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/devtron-labs/devtron" rel="noopener noreferrer"&gt;Devtron&lt;/a&gt; 🔥🔥🔥🔥 - It is designed as a self-serve platform for operationalizing and maintaining applications (AppOps) on kubernetes in a developer friendly way.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/opencost/opencost" rel="noopener noreferrer"&gt;OpenCost&lt;/a&gt; 🔥🔥🔥🔥🔥 - OpenCost models give teams visibility into current and historical Kubernetes spend and resource allocation.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/gianlucam76/k8s-cleaner" rel="noopener noreferrer"&gt;K8s-Cleaner&lt;/a&gt; 🔥 - &lt;code&gt;k8s-cleaner&lt;/code&gt; identifies and removes unused resources.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/yogeshkk/K8sPurger" rel="noopener noreferrer"&gt;K8sPurger&lt;/a&gt; 🔥 - &lt;code&gt;K8sPurger&lt;/code&gt; Hunt Unused Resources In Kubernetes.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/kubeedge/kubeedge" rel="noopener noreferrer"&gt;KubeEdge&lt;/a&gt; 🔥🔥🔥🔥🔥 - KubeEdge is built upon Kubernetes and extends native containerized application orchestration and device management to hosts at the Edge.&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/rikatz/kubepug" rel="noopener noreferrer"&gt;KubePug&lt;/a&gt; 🔥🔥 - A tool to check deprecations before upgrading Kubernetes version&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/doitintl/kube-no-trouble" rel="noopener noreferrer"&gt;Kube No Trouble&lt;/a&gt; 🔥🔥🔥🔥🔥 - Easily check your clusters for use of deprecated APIs&lt;/li&gt;
&lt;li&gt;💚&lt;a href="https://github.com/flant/shell-operator" rel="noopener noreferrer"&gt;Shell-operator&lt;/a&gt; 🔥🔥🔥🔥 - Shell-operator is a tool for running event-driven scripts in a Kubernetes cluster.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Guides, Documentations, Blogs, and Learnings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Guides
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://medium.com/containermind/a-beginners-guide-to-kubernetes-7e8ca56420b6" rel="noopener noreferrer"&gt;A Beginner’s Guide to Kubernetes&lt;/a&gt; - A comprehensive introduction to Kubernetes architecture&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.datree.io/resources/kubernetes-schema-validation" rel="noopener noreferrer"&gt;A Deep Dive Into Kubernetes Schema Validation&lt;/a&gt; - A guide about the Kubernetes schema and how to validate it using OSS and native tools&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sookocheff.com/post/kubernetes/understanding-kubernetes-networking-model/" rel="noopener noreferrer"&gt;A Guide to the Kubernetes Networking Model&lt;/a&gt; - A in-depth run-through of Kubernetes networking&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.github.io/aws-eks-best-practices/" rel="noopener noreferrer"&gt;Amazon EKS Best Practices Guide for Security&lt;/a&gt; - This guide provides advice about protecting information, systems, and assets that are reliant on EKS while delivering business value through risk assessments and mitigation strategies.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/aws-samples/amazon-k8s-node-drainer" rel="noopener noreferrer"&gt;Amazon EKS Node Drainer&lt;/a&gt; 🔥 - A guide and an example to cordon and evict all evictable pods from an EC2 node being terminated.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.google.com/spreadsheets/d/191WWNpjJ2za6-nbG4ZoUMXMpUK8KlCIosvQB0f-oq3k/htmlview?pru=AAABdXUHlbs*g6XkyoZXhanlhRazst77Xw" rel="noopener noreferrer"&gt;Comparison of Kubernetes Ingress controllers&lt;/a&gt; - This research compares the capabilities of 14 different Kubernetes Ingress controllers.
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/faun/configuring-ha-kubernetes-cluster-on-bare-metal-servers-with-kubeadm-1-2-1e79f0f7857b" rel="noopener noreferrer"&gt;Configuring HA Kubernetes cluster on bare metal servers with kubeadm&lt;/a&gt; - A guide to standing up a HA Kubernetes cluster on bare metal servers with kubeadm.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/faun/google-kubernetes-engine-explain-like-im-five-1890e550c099" rel="noopener noreferrer"&gt;Introduction to Using Google Kubernetes Engine; Explain Like I’m Five!&lt;/a&gt; - Creating your first managed Kubernetes cluster on Google Kubernetes Engine using Terraform.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ahmetb/kubernetes-network-policy-recipes" rel="noopener noreferrer"&gt;Kubernetes Network Policy Recipes&lt;/a&gt; 🔥🔥🔥🔥🔥 - This repository contains various use cases of Kubernetes Network Policies and sample YAML files to leverage in your setup.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kelseyhightower/kubernetes-the-hard-way" rel="noopener noreferrer"&gt;Kubernetes The Hard Way&lt;/a&gt; 🔥🔥🔥🔥🔥 - Kubernetes The Hard Way guides you through bootstrapping a highly available Kubernetes cluster with end-to-end encryption between components and RBAC authentication.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kubernetes-sigs/multi-tenancy" rel="noopener noreferrer"&gt;Kubernetes Working Group for Multi-Tenancy&lt;/a&gt; 🔥🔥🔥 - This is a working place for multi-tenancy related proposals and prototypes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/faun/production-grade-kubernetes-monitoring-using-prometheus-78144b835b60" rel="noopener noreferrer"&gt;Production grade Kubernetes Monitoring using Prometheus&lt;/a&gt; - A in-depth guide to deploy Prometheus monitoring solution.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.cncf.io/phippy/the-childrens-illustrated-guide-to-kubernetes/" rel="noopener noreferrer"&gt;The Illustrated Children’s Guide to Kubernetes&lt;/a&gt; - Graphical explanations of Kubernetes&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://learnk8s.io/a/troubleshooting-kubernetes.pdf" rel="noopener noreferrer"&gt;Troubleshooting Kubernetes deployments&lt;/a&gt; - A flow chart to troubleshoot a kubernetes deployment in case of issues

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://povilasv.me/vertical-pod-autoscaling-the-definitive-guide/" rel="noopener noreferrer"&gt;Vertical Pod Autoscaling: The Definitive Guide&lt;/a&gt; - An in-depth explanation on Kubernetes VPA: what it is, how it works, how to use it and which limitations it has. &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://medium.com/faun/writing-your-first-kubernetes-operator-8f3df4453234" rel="noopener noreferrer"&gt;Writing Your First Kubernetes Operator&lt;/a&gt; - In this article, we’ll see how to build and deploy your first Kubernetes Operator using the Operator SDK.&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Blogs and Videos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://blog.pipetail.io/posts/2020-05-04-most-common-mistakes-k8s/" rel="noopener noreferrer"&gt;10 most common mistakes using kubernetes&lt;/a&gt; - Common pitfalls and how to avoid them.
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=YjZ4AZ7hRM0" rel="noopener noreferrer"&gt;How the Department of Defense Moved to Kubernetes and Istio&lt;/a&gt; - Focus on the sidecar security stack leveraging Envoy and sidecar containers to ensure zero trust security and baked-in multi-layer security.
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/WTbIBqNcjoQ" rel="noopener noreferrer"&gt;Kubernetes at Reddit: Tales from Production&lt;/a&gt; - Hear of successes, share in the heartbreak of production explosions, and gain insight into what has and hasn't worked well for one of the world's busiest web properties.
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/hjacobs/kubernetes-failure-stories" rel="noopener noreferrer"&gt;Kubernetes Failure Stories&lt;/a&gt; 🔥🔥🔥🔥🔥 - A compiled list of links to public failure stories related to Kubernetes.
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=0Omvgd7Hg1I" rel="noopener noreferrer"&gt;Life of a Packet&lt;/a&gt; - Tracing the path of network traffic in the Kubernetes system.
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=Uj2N9S58GLU" rel="noopener noreferrer"&gt;OPA Deep Dive&lt;/a&gt; - Deep dive on some exciting new features in the OPA project presented by the co-creators.
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://openai.com/blog/scaling-kubernetes-to-2500-nodes/" rel="noopener noreferrer"&gt;Scaling Kubernetes to 2,500 Nodes&lt;/a&gt; + &lt;a href="https://openai.com/blog/scaling-kubernetes-to-7500-nodes/" rel="noopener noreferrer"&gt;Scaling Kubernetes to 7,500 Nodes&lt;/a&gt; - Issues you will encounter when running high-scale Kubernetes workloads.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://servicemesh.es/" rel="noopener noreferrer"&gt;Service Mesh Comparison&lt;/a&gt; - An easy compensation to help choose one of the service Mesh implementations.
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datree.io/resources/argocd-best-practices-you-should-know" rel="noopener noreferrer"&gt;ArgoCD Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Learnings and Documentations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://medium.com/containermind/a-beginners-guide-to-kubernetes-7e8ca56420b6" rel="noopener noreferrer"&gt;A Beginner’s Guide to Kubernetes&lt;/a&gt; - A comprehensive introduction to Kubernetes architecture&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.flant.com/configmaps-in-kubernetes-how-they-work-and-what-you-should-remember/" rel="noopener noreferrer"&gt;ConfigMaps in Kubernetes: how they work and what you should remember&lt;/a&gt; - Understanding the evolution to ConfigMaps, how they work and what happens when they change. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/tutorials/configuration/configure-redis-using-configmap/" rel="noopener noreferrer"&gt;Configuring Redis using a ConfigMap&lt;/a&gt; - A walkthrough that provides a real world example of how to configure Redis using a ConfigMap&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/tutorials/stateful-application/cassandra/" rel="noopener noreferrer"&gt;Example: Deploying Cassandra with a StatefulSet&lt;/a&gt; - This tutorial shows you how to run Apache Cassandra on Kubernetes. Cassandra, a database, needs persistent storage to provide data durability.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/tutorials/stateless-application/guestbook/" rel="noopener noreferrer"&gt;Example: Deploying PHP Guestbook application with Redis&lt;/a&gt; - This tutorial shows you how to build and deploy a simple, multi-tier web application using Kubernetes and Docker.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/" rel="noopener noreferrer"&gt;Example: Deploying WordPress and MySQL with Persistent Volumes&lt;/a&gt; - This tutorial shows you how to deploy a WordPress site and a MySQL database using Minikube.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/tutorials/stateless-application/expose-external-ip-address/" rel="noopener noreferrer"&gt;Exposing an External IP Address to Access an Application in a Cluster&lt;/a&gt; - This guide shows how to create a Kubernetes Service object that exposes an external IP address.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/reference/kubectl/cheatsheet/" rel="noopener noreferrer"&gt;kubectl Cheat Sheet&lt;/a&gt; - An official list of commonly used kubectl commands and flags.
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dennyzhang/cheatsheet-kubernetes-A4" rel="noopener noreferrer"&gt;Kubectl Kubernetes CheatSheet&lt;/a&gt; 🔥🔥🔥🔥 - A cheatsheet containing many helpful kubectl commands&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/" rel="noopener noreferrer"&gt;Kubernetes API Reference Docs&lt;/a&gt; - A high-level overview of the basic types of resources provided by the Kubernetes API and their primary functions.
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/tutorials/kubernetes-basics/" rel="noopener noreferrer"&gt;Learn Kubernetes Basics&lt;/a&gt; - This tutorial provides a walkthrough of the basics of the Kubernetes cluster orchestration system.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://labs.play-with-k8s.com/" rel="noopener noreferrer"&gt;Play with Kubernetes&lt;/a&gt; - Play with Kubernetes is a playground which allows users to run K8s clusters in a matter of seconds.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.flant.com/ready-to-use-commands-and-tips-for-kubectl/" rel="noopener noreferrer"&gt;Ready-to-use commands and tips for kubectl&lt;/a&gt; - Various kubectl tips and tricks by Flant’s engineers.
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/tutorials/stateful-application/zookeeper/" rel="noopener noreferrer"&gt;Running ZooKeeper, A Distributed System Coordinator&lt;/a&gt; - This tutorial demonstrates running Apache Zookeeper on Kubernetes using StatefulSets, PodDisruptionBudgets, and PodAntiAffinity.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.linux.com/audience/enterprise/set-cicd-pipeline-kubernetes-part-1-overview/" rel="noopener noreferrer"&gt;Set Up a CI/CD Pipeline with Kubernetes&lt;/a&gt; - A end-to-end guide to set up a CI/CD Pipeline with Kubernetes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/" rel="noopener noreferrer"&gt;StatefulSet Basics&lt;/a&gt; - This tutorial provides an introduction to managing applications with StatefulSets.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=v4wJE3I8BYM" rel="noopener noreferrer"&gt;Webinar: K8s with OPA Gatekeeper&lt;/a&gt; - How to use OPA to control what end-users can do on the cluster and ways to ensure that clusters are in compliance with company policies.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Certification Guides
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/ijelliti/CKSS-Certified-Kubernetes-Security-Specialist" rel="noopener noreferrer"&gt;Certified Kubernetes Security Specialist - CKSS&lt;/a&gt; 🔥🔥 - This repository is a collection of resources to prepare for the Certified Kubernetes Security Specialist (CKSS) exam.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/walidshaari/Certified-Kubernetes-Security-Specialist" rel="noopener noreferrer"&gt;CKS "Certified Kubernetes security specialist certification&lt;/a&gt; 🔥🔥🔥🔥 - Kubernetes security resources primarly from material allowed during the exam, and extra optional items to help you advance your container and kubernetes security journey.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/faun/how-to-pass-certified-kubernetes-administrator-cka-exam-on-first-attempt-36c0ceb4c9e" rel="noopener noreferrer"&gt;How to pass the Certified Kubernetes Administrator (CKA) exam on the first attempt&lt;/a&gt; - A guide to pass CKA exam&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/walidshaari/Kubernetes-Certified-Administrator" rel="noopener noreferrer"&gt;The ultimate CKA "Certfified Kuberenetes Administator" resource since exam inception&lt;/a&gt;  - An updated repo of offical resources to help you master the CKA exam as well some extra resources to consolidate your kubernetes administration knowledge.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://killer.sh/" rel="noopener noreferrer"&gt;Kubernetes Exam Simulator&lt;/a&gt; - CKS/CKA/CKAD exams scenarios and environment.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Contribute
&lt;/h2&gt;

&lt;p&gt;Contributions welcome! Read the &lt;a href="//contributing.md"&gt;contribution guidelines&lt;/a&gt; first.&lt;/p&gt;

&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://creativecommons.org/publicdomain/zero/1.0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmirrors.creativecommons.org%2Fpresskit%2Fbuttons%2F88x31%2Fsvg%2Fcc-zero.svg" alt="CC0" width="88" height="31"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To the extent possible under law, Tom Huang has waived all copyright and&lt;br&gt;
related or neighboring rights to this work.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>aws</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Kubernetes Deep Dive: YAML Describe Explained!</title>
      <dc:creator>Hoang Guruu</dc:creator>
      <pubDate>Mon, 17 Mar 2025 07:09:05 +0000</pubDate>
      <link>https://dev.to/aws-builders/kubernetes-deep-dive-yaml-describe-explained-4hl4</link>
      <guid>https://dev.to/aws-builders/kubernetes-deep-dive-yaml-describe-explained-4hl4</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyd1brqmec3pp4o5a786k.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyd1brqmec3pp4o5a786k.jpeg" alt="Image description" width="800" height="953"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Useful GitHub Repositories Every DevOps Engineer Should Bookmark</title>
      <dc:creator>Hoang Guruu</dc:creator>
      <pubDate>Sun, 16 Mar 2025 14:52:04 +0000</pubDate>
      <link>https://dev.to/aws-builders/useful-github-repositories-every-devops-engineer-should-bookmark-3058</link>
      <guid>https://dev.to/aws-builders/useful-github-repositories-every-devops-engineer-should-bookmark-3058</guid>
      <description>&lt;p&gt;🚀 Useful GitHub Repositories Every DevOps Engineer Should Bookmark 📌&lt;/p&gt;

&lt;p&gt;(You’ll Thank Me Later)&lt;/p&gt;

&lt;p&gt;1️⃣ Awesome Sysadmin (Sysadmin tools &amp;amp; resources)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/ge7QusvK" rel="noopener noreferrer"&gt;https://lnkd.in/ge7QusvK&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2️⃣ DevOps Exercises (Practice real-world DevOps scenarios)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/g_NSiHxB" rel="noopener noreferrer"&gt;https://lnkd.in/g_NSiHxB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3️⃣ Kubernetes the Hard Way (Step-by-step Kubernetes setup from scratch)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/ghHay3Pr" rel="noopener noreferrer"&gt;https://lnkd.in/ghHay3Pr&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4️⃣ Terraform Best Practices (Infrastructure as Code done right)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/gUFTmuuG" rel="noopener noreferrer"&gt;https://lnkd.in/gUFTmuuG&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5️⃣ Prometheus Monitoring (Monitor your infrastructure like a pro)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/g5j2hvWA" rel="noopener noreferrer"&gt;https://lnkd.in/g5j2hvWA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6️⃣ Ansible for DevOps (Automate everything with Ansible)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/gw2ynKE6" rel="noopener noreferrer"&gt;https://lnkd.in/gw2ynKE6&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7️⃣ CI/CD Pipeline Examples (Learn different CI/CD approaches)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/gR-u6hNt" rel="noopener noreferrer"&gt;https://lnkd.in/gR-u6hNt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8️⃣ The Art of Command Line (Master the command line like a wizard)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/guNcEYpM" rel="noopener noreferrer"&gt;https://lnkd.in/guNcEYpM&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9️⃣ Chaos Engineering Tools (Break things to make them resilient)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/g5qFU7ma" rel="noopener noreferrer"&gt;https://lnkd.in/g5qFU7ma&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔟 DockSTARTer (Automate Docker deployments easily)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/gy-ZtyvQ" rel="noopener noreferrer"&gt;https://lnkd.in/gy-ZtyvQ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1️⃣1️⃣ Site Reliability Engineering (SRE) Case Studies&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/gQ678bWj" rel="noopener noreferrer"&gt;https://lnkd.in/gQ678bWj&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1️⃣2️⃣ Test Your Sysadmin Skills (Are you really a sysadmin?)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/gb2WpkN2" rel="noopener noreferrer"&gt;https://lnkd.in/gb2WpkN2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1️⃣3️⃣ Awesome DevSecOps (Security for DevOps workflows)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/gFErut5W" rel="noopener noreferrer"&gt;https://lnkd.in/gFErut5W&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1️⃣4️⃣ Fast Kubernetes (Learn Kubernetes quickly)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/gbBM7vZi" rel="noopener noreferrer"&gt;https://lnkd.in/gbBM7vZi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1️⃣5️⃣ Kubernetes (Official Repo) (Core Kubernetes project)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/gheQpPQ5" rel="noopener noreferrer"&gt;https://lnkd.in/gheQpPQ5&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1️⃣6️⃣ Kubernetes Ingress Nginx (Manage ingress traffic in K8s)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/g2Dru-2s" rel="noopener noreferrer"&gt;https://lnkd.in/g2Dru-2s&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1️⃣7️⃣ kubectl (K8s CLI tool) (Master Kubernetes CLI)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/g4RuqvEU" rel="noopener noreferrer"&gt;https://lnkd.in/g4RuqvEU&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1️⃣8️⃣ Kubernetes Metrics (Resource usage monitoring)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/gYM3cKhB" rel="noopener noreferrer"&gt;https://lnkd.in/gYM3cKhB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1️⃣9️⃣ Kube-State-Metrics (Detailed monitoring for Kubernetes objects)&lt;br&gt;
 ↳ &lt;a href="https://lnkd.in/g27vrHZ7" rel="noopener noreferrer"&gt;https://lnkd.in/g27vrHZ7&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎥 Watch more DevOps &amp;amp; AWS videos on YouTube: 🔗&lt;a href="https://lnkd.in/g7tpVmdV" rel="noopener noreferrer"&gt;https://lnkd.in/g7tpVmdV&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;♻ Repost to share with your network! 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>aws</category>
      <category>programming</category>
    </item>
    <item>
      <title>[ Solution Library AWS ] Live Chat Content AI on AWS</title>
      <dc:creator>Hoang Guruu</dc:creator>
      <pubDate>Fri, 14 Mar 2025 02:13:33 +0000</pubDate>
      <link>https://dev.to/aws-builders/-solution-library-aws-live-chat-content-ai-on-aws-5gih</link>
      <guid>https://dev.to/aws-builders/-solution-library-aws-live-chat-content-ai-on-aws-5gih</guid>
      <description>&lt;p&gt;【 &lt;a href="https://www.youtube.com/@HoangGuruu" rel="noopener noreferrer"&gt;👨🏻‍💻 YouTube&lt;/a&gt; 】&lt;br&gt;
Watch more other contents related DevOps - AWS&lt;/p&gt;
&lt;h3&gt;
  
  
  System Architecture Diagram
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/aws-solutions-library-samples/guidance-for-live-chat-content-moderation-with-generative-ai-on-aws/blob/main/live-chat-moderation-gen-ai-architecture-diagram.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6halqopewmaajzgupx4i.png" alt="System Architecture Diagram" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;Table of Contents&lt;/li&gt;
&lt;li&gt;Overview&lt;/li&gt;
&lt;li&gt;Architecture&lt;/li&gt;
&lt;li&gt;
Features

&lt;ul&gt;
&lt;li&gt;Cost&lt;/li&gt;
&lt;li&gt;Supported AI Models&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Prerequisites&lt;/li&gt;
&lt;li&gt;Deployment&lt;/li&gt;
&lt;li&gt;Deployment Validation&lt;/li&gt;
&lt;li&gt;Usage&lt;/li&gt;
&lt;li&gt;
Running the Solution

&lt;ul&gt;
&lt;li&gt;Switching Prompts/Models&lt;/li&gt;
&lt;li&gt;Updating the Front-End&lt;/li&gt;
&lt;li&gt;Scripts Usage&lt;/li&gt;
&lt;li&gt;Moderation Guidelines&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Monitoring and Observability&lt;/li&gt;
&lt;li&gt;Performance and Scalability&lt;/li&gt;
&lt;li&gt;Security Considerations&lt;/li&gt;
&lt;li&gt;Cleanup&lt;/li&gt;
&lt;li&gt;Next Steps&lt;/li&gt;
&lt;li&gt;Notices&lt;/li&gt;
&lt;li&gt;Authors&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

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

&lt;p&gt;The &lt;strong&gt;Live Chat Content Moderation with generative AI on AWS&lt;/strong&gt; project is a scalable, multilingual, real-time chat moderation system designed for live chat platforms. It leverages AWS services and generative AI to automatically filter and moderate chat messages, ensuring a safe and engaging environment for users.&lt;/p&gt;
&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

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

&lt;p&gt;This solution utilizes several AWS services to create a robust and scalable architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Amazon API Gateway&lt;/strong&gt;: Handles incoming WebSocket connections and REST API requests;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;AWS Lambda&lt;/strong&gt;: Processes messages and interacts with other services;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Amazon DynamoDB&lt;/strong&gt;: Stores chat messages, approved messages, and moderation prompts;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Amazon SQS&lt;/strong&gt;: Manages message queues for reliable processing;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;AWS AppSync&lt;/strong&gt;: Facilitates real-time updates using GraphQL subscriptions;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Amazon Bedrock&lt;/strong&gt;: Provides generative AI capabilities for message moderation;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Amazon CloudFront &amp;amp; S3&lt;/strong&gt;: Hosts and serves the front-end application;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;AWS WAF&lt;/strong&gt;: Protects your web applications from common exploits;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;AWS CDK&lt;/strong&gt;: Defines and deploys the infrastructure as code.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;  Real-time chat moderation using generative AI;&lt;/li&gt;
&lt;li&gt;  Scalable WebSocket connections for live chat;&lt;/li&gt;
&lt;li&gt;  Multiple AI model support with easy switching;&lt;/li&gt;
&lt;li&gt;  Front-end React application for chat interface;&lt;/li&gt;
&lt;li&gt;  Comprehensive observability and monitoring;&lt;/li&gt;
&lt;li&gt;  Secure and compliant with AWS best practices.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Cost
&lt;/h3&gt;

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

&lt;p&gt;The solution utilizes several AWS services, each contributing to the overall cost. Key services include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Amazon API Gateway: Charges based on the number of API calls and data transfer;&lt;/li&gt;
&lt;li&gt; AWS Lambda: Costs depend on the number of requests, duration, and memory allocated;&lt;/li&gt;
&lt;li&gt; Amazon DynamoDB: Pricing based on read/write capacity units or on-demand pricing;&lt;/li&gt;
&lt;li&gt; Amazon SQS: Charges per million requests;&lt;/li&gt;
&lt;li&gt; AWS AppSync: Costs based on the number of API requests and real-time updates;&lt;/li&gt;
&lt;li&gt; Amazon Bedrock: Pricing varies by model and is based on the number of input and output tokens;&lt;/li&gt;
&lt;li&gt; Amazon CloudFront: Charges for data transfer and number of requests;&lt;/li&gt;
&lt;li&gt; AWS WAF: Charges on the number of web ACLs, number of rules per web ACL, and number of web requests;&lt;/li&gt;
&lt;li&gt; Amazon CloudWatch: Costs for log ingestion, storage, and dashboard usage;&lt;/li&gt;
&lt;li&gt; AWS Systems Manager Parameter Store: Standard parameters are free, advanced parameters have a nominal cost.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is an example of a monthly cost estimate based on 1,000 users, 1,000,000 messages sent and 200,000,000 token usage based on N. Virginia (us-east-1):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS service: Amazon CloudFront

&lt;ul&gt;
&lt;li&gt;Dimensions: 1,000 users requesting 64 MBs of Static Assets&lt;/li&gt;
&lt;li&gt;Cost [USD]: $7.84&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS service: AWS WAF

&lt;ul&gt;
&lt;li&gt;Dimensions: 2 Web ACLs + 2 Rules + 1,000,000 of requests&lt;/li&gt;
&lt;li&gt;Cost [USD]: $13.20&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS service: Amazon Simple Storage Service (S3)

&lt;ul&gt;
&lt;li&gt;Dimensions: 16 MBs of Static Assets&lt;/li&gt;
&lt;li&gt;Cost [USD]: $4.03&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS service: Amazon API Gateway

&lt;ul&gt;
&lt;li&gt;Dimensions: 1,000,000 REST API Requests&lt;/li&gt;
&lt;li&gt;Cost [USD]: $3.50&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS service: Amazon Simple Queue Service (SQS)

&lt;ul&gt;
&lt;li&gt;Dimensions: 1,000,000 Messages&lt;/li&gt;
&lt;li&gt;Cost [USD]: $0.01&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS service: AWS Lambda

&lt;ul&gt;
&lt;li&gt;Dimensions: 1,000,000 of Lambda Executions with 256 MBs of RAM and 2000ms average duration&lt;/li&gt;
&lt;li&gt;Cost [USD]: $8.53&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS service: AWS AppSync

&lt;ul&gt;
&lt;li&gt;Dimensions: 1,000,000 of API requests and 1,000 of connected clients with 1 hour duration&lt;/li&gt;
&lt;li&gt;Cost [USD]: $10.29&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS service: Amazon Bedrock

&lt;ul&gt;
&lt;li&gt;Dimensions: 200,000,000 of input + output tokens&lt;/li&gt;
&lt;li&gt;Cost [USD]: $30.20&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS service: Amazon Bedrock Guardrails

&lt;ul&gt;
&lt;li&gt;Dimensions: 5,000 text units (1,000,000 messages with 200 characters average)&lt;/li&gt;
&lt;li&gt;Cost [USD]: $3.75&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS service: AWS Systems Manager

&lt;ul&gt;
&lt;li&gt;Dimensions: 1 SSM Query per minute&lt;/li&gt;
&lt;li&gt;Cost [USD]: $0.01&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS service: Amazon DynamoDB

&lt;ul&gt;
&lt;li&gt;Dimensions: Reads from Prompt Store and 1,000,000 Writes to Messages Tables&lt;/li&gt;
&lt;li&gt;Cost [USD]: $2.27&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS service: Amazon CloudWatch

&lt;ul&gt;
&lt;li&gt;Dimensions: 34 Metrics, 1 Dashboard, 1 GB of Logs&lt;/li&gt;
&lt;li&gt;Cost [USD]: $11.21&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS service: AWS X-Ray

&lt;ul&gt;
&lt;li&gt;Dimensions: 20% sample of 1,000,000 messages&lt;/li&gt;
&lt;li&gt;Cost [USD]: $1.20&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a more accurate cost estimate, use the AWS Pricing Calculator and input your expected usage patterns.&lt;/p&gt;
&lt;h3&gt;
  
  
  Supported AI Models
&lt;/h3&gt;

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

&lt;p&gt;The system supports four different AI models for chat moderation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Anthropic Claude Haiku&lt;/strong&gt;: Claude 3 Haiku is Anthropic's fastest, most compact model for near-instant responsiveness. It answers simple queries and requests with speed. Customers will be able to build seamless AI experiences that mimic human interactions. Claude 3 Haiku can process images and return text outputs, and features a 200K context window.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Amazon Titan&lt;/strong&gt;: Amazon Titan Text Premier is an advanced, high-performance, and cost-effective LLM engineered to deliver superior performance for enterprise-grade text generation applications, including optimized performance for retrieval-augmented generation (RAG) and Agents.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Meta Llama&lt;/strong&gt;: Meta Llama 3 is an accessible, open large language model (LLM) designed for developers, researchers, and businesses to build, experiment, and responsibly scale their generative AI ideas. Part of a foundational system, it serves as a bedrock for innovation in the global community. Ideal for limited computational power and resources, edge devices, and faster training times.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Amazon Nova Micro&lt;/strong&gt;: Amazon Nova family of models offer customers multiple price performance operating points to best optimize between accuracy, speed, and cost. Amazon Nova Micro is a text only model that delivers the lowest latency responses at the lowest cost per inference among Nova family.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each model has its own strengths and characteristics. You can switch between these models using the &lt;code&gt;prompt-switch.bash&lt;/code&gt; script.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;  AWS Account;&lt;/li&gt;
&lt;li&gt;  AWS CLI configured with your credentials with permissions configured;&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://nodejs.org/en/download/package-manager" rel="noopener noreferrer"&gt;Node.js installed (version 20.x or later) in your system&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;  Appropriate permissions to install npm packages in your system;&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://git-scm.com/downloads" rel="noopener noreferrer"&gt;Git installed in your system&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://jqlang.github.io/jq/download/" rel="noopener noreferrer"&gt;jq installed in your system&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Deployment
&lt;/h2&gt;

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

&lt;ol&gt;
&lt;li&gt; Clone the repository:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/aws-samples/live-chat-content-moderation-with-genai-on-aws.git

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

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt; Navigate to the project directory:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd live-chat-content-moderation-with-genai-on-aws/scripts

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

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt; Run the installation script:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This script will set up the necessary AWS resources, deploy the back-end infrastructure, and prepare the front-end application.&lt;/p&gt;
&lt;h2&gt;
  
  
  Deployment Validation
&lt;/h2&gt;

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

&lt;p&gt;After running the installation script (&lt;code&gt;./install.bash&lt;/code&gt;), follow these steps to validate the successful deployment of your Live Chat Moderation system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open the AWS CloudFormation console and verify the status of the stack named "ChatModeration". It should be in the "CREATE_COMPLETE" state.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the outputs of the CloudFormation stack for the following key resources:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*   REST API Endpoint
*   GraphQL API Endpoint
*   CloudFront Distribution Domain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt; Verify the creation of DynamoDB tables:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws dynamodb list-tables --query "TableNames[?contains(@, 'ChatModeration')]"

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

&lt;/div&gt;


&lt;p&gt;You should see four tables: ApprovedMessagesTable, UnapprovedMessagesTable, HallucinationsTable, and PromptStoreTable.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Confirm the Lambda function deployment:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws lambda get-function --function-name ChatModeration-MessageProcessorFunction

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

&lt;/div&gt;


&lt;p&gt;This should return details about the deployed function.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Verify the SQS queues:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws sqs list-queues --queue-name-prefix ChatModeration

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

&lt;/div&gt;


&lt;p&gt;You should see two queues: MessageQueue.fifo and DeadLetterQueue.fifo.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Check the AppSync API:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws appsync list-graphql-apis --query "graphqlApis[?name=='ChatModeration-GraphQLApi']"

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

&lt;/div&gt;


&lt;p&gt;This should return details about your GraphQL API.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Verify the CloudFront distribution:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws cloudfront list-distributions --query "DistributionList.Items"

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

&lt;/div&gt;


&lt;p&gt;You should see details of your CloudFront distribution.&lt;/p&gt;

&lt;p&gt;If all these resources are present and correctly configured, your deployment has been successful.&lt;/p&gt;
&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Running the Solution
&lt;/h2&gt;

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

&lt;p&gt;After installation, the application should be accessible via the CloudFront URL provided in the output. To test and use the Live Chat Moderation system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open a web browser and navigate to the CloudFront Distribution Domain provided in &lt;code&gt;./install.bash&lt;/code&gt; output or the CloudFormation stack outputs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You should see the chat interface. Try sending various types of messages:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;  A normal, non-offensive message: "Hello, how is everyone doing today?"&lt;/li&gt;
&lt;li&gt;  A message containing mild profanity: "This stream is damn good!"&lt;/li&gt;
&lt;li&gt;  A message with hate speech or discrimination: "I hate [directed message]"&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt; Observe the behavior:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;  Normal messages should appear in the chat;&lt;/li&gt;
&lt;li&gt;  Mildly offensive messages may or may not be blocked, depending on the AI model's judgment;&lt;/li&gt;
&lt;li&gt;  Hate speech or discriminatory messages should be blocked, and you should receive a notification.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;To test the real-time nature of the chat, open the application in two different browser windows and send messages from both. You should see messages appear in real-time on both screens.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To verify the multilingual support, try sending messages in different languages.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Expected Output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Approved messages appear in the chat interface;&lt;/li&gt;
&lt;li&gt;  Blocked messages trigger a notification to the user;&lt;/li&gt;
&lt;li&gt;  The chat updates in real-time across multiple browser windows.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Switching Prompts/Models
&lt;/h3&gt;

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

&lt;p&gt;To switch between different AI models or prompts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./prompt-switch.bash &amp;lt;model-name&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;&amp;lt;model-name&amp;gt;&lt;/code&gt; with one of the available options: &lt;code&gt;titan&lt;/code&gt;, &lt;code&gt;haiku&lt;/code&gt;, &lt;code&gt;llama&lt;/code&gt; or &lt;code&gt;nova-micro&lt;/code&gt;. The aforementioned &lt;code&gt;./install.bash&lt;/code&gt; script configures Anthropic Claude Haiku to be used by default.&lt;/p&gt;

&lt;h3&gt;
  
  
  Updating the Front-End
&lt;/h3&gt;

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

&lt;p&gt;After making changes to the front-end code, deploy updates using:&lt;/p&gt;

&lt;p&gt;This script will build the React application and update the S3 bucket and CloudFront distribution. This is not required at the first deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scripts Usage
&lt;/h3&gt;

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

&lt;p&gt;The scripts should be executed from the &lt;code&gt;./scripts&lt;/code&gt; directory. Running from another path may cause issues or the scripts may fail.&lt;/p&gt;

&lt;h3&gt;
  
  
  Moderation Guidelines
&lt;/h3&gt;

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

&lt;p&gt;The AI models use the following prompt as the main guideline for moderating chat messages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Instructions:
You are a moderation bot tasked with identifying and preventing the spread of harmful, aggressive, racist, or toxic messages in a live stream chat. Analyze the context and intent of the message, not just specific words. Respond only with y for safe messages or n for harmful messages. Do not provide any explanation.
Consider these guidelines when evaluating:
1. Hate speech or discrimination
2. Explicit threats of violence
3. Severe profanity
4. Bullying or harassment
5. Spam or excessive self-promotion
6. Selling or advertising products
7. Sharing personal information
8. Encouraging self-harm or illegal activities
If a message is ambiguous, err on the side of caution and allow it.
Your entire response MUST be either y or n, nothing else.

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

&lt;/div&gt;



&lt;p&gt;This prompt instructs the AI to evaluate messages based on various criteria and respond with a simple 'y' for safe messages or 'n' for harmful ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitoring and Observability
&lt;/h2&gt;

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

&lt;p&gt;The project includes a CloudWatch dashboard for monitoring key metrics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Bedrock model invocations and latency;&lt;/li&gt;
&lt;li&gt;  SQS queue metrics;&lt;/li&gt;
&lt;li&gt;  Lambda function metrics;&lt;/li&gt;
&lt;li&gt;  API Gateway request counts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Access the dashboard named "ChatModeration-Monitoring" in the Amazon CloudWatch console. You can also add a service trace map to the CloudWatch dashboard by doing the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Access the X-Ray Trace Map in CloudWatch: a. Open the CloudWatch console. b. In the left navigation pane, under the X-Ray Traces section, select Trace Map.&lt;/li&gt;
&lt;li&gt; Add the Service Map to the CloudWatch Dashboard: a. Within the Trace Map view, click on the Actions menu. b. Choose Add to dashboard. c. Select the dashboard named "ChatModeration-Monitoring".&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Performance and Scalability
&lt;/h2&gt;

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

&lt;p&gt;The Live Chat Moderation with Generative AI system is built on AWS services, which provide high scalability and performance. However, it's important to be aware of AWS service quotas and limits that may affect the system's scalability:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;API Gateway&lt;/strong&gt;: Limits on the number of WebSocket connections and API requests per second;&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Lambda&lt;/strong&gt;: Concurrent execution limits and individual function timeout limits;&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;DynamoDB&lt;/strong&gt;: Read and write capacity units, which affect the rate of database operations;&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;SQS&lt;/strong&gt;: Message throughput and retention limits;&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Bedrock&lt;/strong&gt;: API call rate limits and token limits for AI model invocations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To test the system's performance and identify potential bottlenecks, you can use Locust for load testing. The project includes a Locust configuration file located at &lt;code&gt;../tests/locust/locust.conf&lt;/code&gt;. This file is automatically updated with the correct API endpoint when you run the &lt;code&gt;publish.bash&lt;/code&gt; script.&lt;/p&gt;

&lt;p&gt;To use Locust:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Install Locust:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Navigate to the Locust test directory:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run Locust:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open a web browser and go to &lt;code&gt;http://localhost:8089&lt;/code&gt; to access the Locust web interface.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter the number of users to simulate, spawn rate, and other test parameters.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start the test and monitor the results to identify performance bottlenecks or scalability issues.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Remember to monitor your AWS usage and adjust service limits if needed as your chat moderation system scales.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security Considerations
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;  DynamoDB tables use encryption at rest;&lt;/li&gt;
&lt;li&gt;  Lambda functions use least-privilege IAM roles;&lt;/li&gt;
&lt;li&gt;  S3 bucket for static assets is not publicly accessible;&lt;/li&gt;
&lt;li&gt;  CloudFront distribution uses HTTPS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cleanup
&lt;/h2&gt;

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

&lt;p&gt;To delete all resources associated with the Live Chat Moderation system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Destroy the CDK stack:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd backend/cdk
cdk destroy

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

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

&lt;p&gt;To further enhance your Live Chat Moderation system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Customize AI Prompts: Modify the prompts in the &lt;code&gt;insert-prompt.bash &amp;lt;model-name&amp;gt;&lt;/code&gt; scripts to fine-tune the moderation criteria for your specific use case.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement User Authentication: Add user authentication to associate messages with verified user accounts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can improve DDoS attack protection of the solution by using AWS Shield Advanced to enable advanced protection up to the application layer (Layer 7 on OSI network model). Check reference blog &lt;a href="https://aws.amazon.com/blogs/security/protect-apis-with-amazon-api-gateway-and-perimeter-protection-services/" rel="noopener noreferrer"&gt;https://aws.amazon.com/blogs/security/protect-apis-with-amazon-api-gateway-and-perimeter-protection-services/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Notices
&lt;/h2&gt;

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

&lt;p&gt;&lt;em&gt;Customers are responsible for making their own independent assessment of the information in this Guidance. This Guidance: (a) is for informational purposes only, (b) represents AWS current product offerings and practices, which are subject to change without notice, and (c) does not create any commitments or assurances from AWS and its affiliates, suppliers or licensors. AWS products or services are provided “as is” without warranties, representations, or conditions of any kind, whether express or implied. AWS responsibilities and liabilities to its customers are controlled by AWS agreements, and this Guidance is not part of, nor does it modify, any agreement between AWS and its customers.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Authors
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;  Gabriel Costa&lt;/li&gt;
&lt;li&gt;  Juliano Baeta&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>devops</category>
    </item>
    <item>
      <title>Top 17 DevOps AI Tools [2025]</title>
      <dc:creator>Hoang Guruu</dc:creator>
      <pubDate>Thu, 13 Mar 2025 05:07:31 +0000</pubDate>
      <link>https://dev.to/aws-builders/top-17-devops-ai-tools-2025-4go5</link>
      <guid>https://dev.to/aws-builders/top-17-devops-ai-tools-2025-4go5</guid>
      <description>&lt;h1&gt;
  
  
  Top 17 DevOps AI Tools [2025] | LambdaTest
&lt;/h1&gt;

&lt;p&gt;Next-Gen App &amp;amp; Browser Testing Cloud&lt;/p&gt;

&lt;p&gt;【 &lt;a href="https://www.youtube.com/@HoangGuruu" rel="noopener noreferrer"&gt;👨🏻‍💻 YouTube&lt;/a&gt; 】&lt;br&gt;
Watch more other contents related DevOps - AWS&lt;/p&gt;

&lt;p&gt;Trusted by 2 Mn+ QAs &amp;amp; Devs to accelerate their release cycles&lt;/p&gt;

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

&lt;p&gt;Chandrika Deb&lt;/p&gt;

&lt;p&gt;Posted On: January 17, 2025&lt;/p&gt;

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

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

&lt;p&gt;DevOps AI tools are transforming the software development process by breaking traditional barriers and enhancing efficiency. With these DevOps AI tools, you can automate complex tasks, enable continuous improvement and help development and QA teams to deliver high-quality software with ease. Integrating DevOps AI tools allows organizations to move beyond old-fashioned working methods and achieve new levels of productivity and performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TABLE OF CONTENTS&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Top 17 DevOps AI Tools [2025] | LambdaTest

&lt;ul&gt;
&lt;li&gt;Why AI in DevOps?&lt;/li&gt;
&lt;li&gt;LambdaTest&lt;/li&gt;
&lt;li&gt;GitHub Copilot&lt;/li&gt;
&lt;li&gt;AWS CodeGuru&lt;/li&gt;
&lt;li&gt;Datadog&lt;/li&gt;
&lt;li&gt;New Relic&lt;/li&gt;
&lt;li&gt;Sysdig&lt;/li&gt;
&lt;li&gt;Mabl&lt;/li&gt;
&lt;li&gt;Jenkins X&lt;/li&gt;
&lt;li&gt;CircleCI&lt;/li&gt;
&lt;li&gt;Azure DevOps&lt;/li&gt;
&lt;li&gt;Snyk&lt;/li&gt;
&lt;li&gt;Splunk&lt;/li&gt;
&lt;li&gt;CloudHealth&lt;/li&gt;
&lt;li&gt;Dynatrace&lt;/li&gt;
&lt;li&gt;Ansible&lt;/li&gt;
&lt;li&gt;IBM Watson AIOps&lt;/li&gt;
&lt;li&gt;Scalability&lt;/li&gt;
&lt;li&gt;Integration Capabilities&lt;/li&gt;
&lt;li&gt;Team Adoption&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;Frequently Asked Questions (FAQs)&lt;/li&gt;
&lt;li&gt;Are AI DevOps tools suitable for small teams?&lt;/li&gt;
&lt;li&gt;How secure are AI-powered DevOps tools?&lt;/li&gt;
&lt;li&gt;Can AI completely replace human DevOps engineers?&lt;/li&gt;
&lt;li&gt;What is the typical ROI of implementing AI DevOps tools?&lt;/li&gt;
&lt;li&gt;How quickly do AI DevOps tools adapt to new technologies?&lt;/li&gt;
&lt;li&gt;
Citations

&lt;ul&gt;
&lt;li&gt;Chandrika Deb&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why AI in DevOps?
&lt;/h2&gt;

&lt;p&gt;According to &lt;a href="https://marketresearch.biz/report/generative-ai-in-devops-market" rel="noopener noreferrer"&gt;MarketResearch&lt;/a&gt;, the Generative AI in DevOps market is projected to grow from approximately USD 942.5 million in 2022 to an estimated USD 22,100 million by 2032, representing a remarkable 38.20% compound annual growth rate. This explosive growth reflects AI’s transformative potential in software development and operations.&lt;/p&gt;

&lt;p&gt;Below are some of the reasons why AI is beneficial for DevOps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Automation:&lt;/strong&gt; By automating the process, you can manage the repetitive tasks, allowing teams to focus on strategic, high-value work across the development and testing process.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Predictive Insights:&lt;/strong&gt; AI analyzes and helps forecast potential system issues before they impact performance, reducing downtime and risks.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Smart Resource Management:&lt;/strong&gt; AI optimizes infrastructure usage by analyzing performance metrics and workload patterns, enabling cost-effective scaling.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Data-Driven Decisions:&lt;/strong&gt; Advanced AI analytics provide actionable insights, helping DevOps teams work faster, help them inform decisions, and quickly adapt to market changes.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Enhanced Collaboration:&lt;/strong&gt; AI bridges communication gaps between development and operations teams by offering transparent, data-backed recommendations and streamlining workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI integrates intelligent solutions into DevOps workflows, helping teams proactively prevent system failures, reduce manual effort, and enhance efficiency. This allows teams to focus on strategic innovation.&lt;/p&gt;

&lt;p&gt;DevOps AI tools allow teams to auto-prioritize alerts, suggest solutions, and execute resolution playbooks, significantly reducing the time it takes to recover from software bugs. This not only accelerates workflow speed but also supports Agile processes and advances innovative practices.&lt;/p&gt;

&lt;p&gt;Further, let’s learn various DevOps AI tools that will help development and QA teams make decisions on which tools can fulfill their DevOps requirements.&lt;/p&gt;

&lt;p&gt;Below are some of the most popular and widely used DevOps AI tools that help developers and testers streamline workflows by automating processes and enhancing team collaboration. This list will help developers and testers choose the right tool that meets the project requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  LambdaTest
&lt;/h3&gt;

&lt;p&gt;LambdaTest is an AI-powered test execution platform that lets you run manual and automation tests at scale by allowing you to integrate with the best CI/CD tools like Jenkins, CircleCI, GitLab, and more. This platform helps you enhance your DevOps workflows effectively.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fie8z1kzx5drh3j8eq2bz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fie8z1kzx5drh3j8eq2bz.png" alt="AI-powered test execution platform that lets you run manual and automation tests " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features of LambdaTest DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It accelerates test automation and DevOps workflow, offering speeds up to 70% faster than traditional cloud grids through &lt;a href="https://www.lambdatest.com/hyperexecute" rel="noopener noreferrer"&gt;HyperExecute&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  It offers &lt;a href="https://www.lambdatest.com/kane-ai" rel="noopener noreferrer"&gt;KaneAI&lt;/a&gt;, a GenAI native QA Agent-as-a-Service platform, that enables teams to create, debug, and refine tests using natural language, reducing the workload of QA teams and enhancing quality processes. With high-speed execution and automated issue identification, KaneAI streamlines testing and boosts efficiency.&lt;/li&gt;
&lt;li&gt;  It mitigates potential issues by providing insights through advanced AI analysis, enhancing testing quality and efficiency.&lt;/li&gt;
&lt;li&gt;  It identifies the causes of flaky tests, tracks failure history, and recognizes patterns, allowing for customized environment adjustments.&lt;/li&gt;
&lt;li&gt;  It provides AI-powered insights that analyze test data to improve automation efficiency and reduce failure rates.&lt;/li&gt;
&lt;li&gt;  It enhances team collaboration that allows teams to work together on test creation, execution, and results in real time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  GitHub Copilot
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;, an AI-powered code generation tool, enhances aspects of CI/CD workflows. As one of the most popular DevOps AI tools, it indirectly reduces developer effort by improving efficiency and code quality. This tool provides intelligent suggestions, helps accelerate development cycles and enables teams to deliver reliable software.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8zuu45zhbcgqt2glwdh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8zuu45zhbcgqt2glwdh.png" alt="GitHub Copilot, an AI-powered code generation tool" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features of GitHub Copilot DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It suggests code snippets and entire functions in real-time, streamlining development and reducing manual coding efforts.&lt;/li&gt;
&lt;li&gt;  It assists in various programming languages, enabling DevOps teams to work across diverse codebases without extensive language-specific expertise.&lt;/li&gt;
&lt;li&gt;  It seamlessly integrates with popular IDEs like Visual Studio Code, enhancing existing workflows without requiring additional tools.&lt;/li&gt;
&lt;li&gt;  It also integrates with Azure DevOps CI/CD pipelines, assisting in managing operations and providing insights into workloads, thereby enhancing functionality.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Optimize your DevOps workflow by integrating GitHub Copilot for a seamless release cycle. &lt;a href="https://accounts.lambdatest.com/register" rel="noopener noreferrer"&gt;Try LambdaTest Today!&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS CodeGuru
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/codeguru/" rel="noopener noreferrer"&gt;AWS CodeGuru&lt;/a&gt; is an AI-driven development tool that transforms how DevOps teams address code quality, performance, and security. This DevOps AI tool leverages advanced machine learning techniques to deliver comprehensive code analysis through its two core features: CodeGuru Reviewer for automated code reviews and CodeGuru Profiler for performance optimization.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Key Features of AWS CodeGuru DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It analyzes code to identify defects, deviations from best practices, and potential security vulnerabilities, providing actionable recommendations to improve code quality.&lt;/li&gt;
&lt;li&gt;  It continuously monitors applications in production to detect performance bottlenecks, high CPU utilization, and memory inefficiencies, offering insights to enhance application performance and reduce costs.&lt;/li&gt;
&lt;li&gt;  It scans codebases to detect vulnerabilities, such as those listed in the OWASP Top Ten and CWE Top 25, and provides recommendations for remediation, enhancing the security posture of applications.&lt;/li&gt;
&lt;li&gt;  It integrates seamlessly with existing development tools and CI/CD pipelines, enabling continuous code analysis and performance monitoring without disrupting established workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Datadog
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.datadoghq.com/" rel="noopener noreferrer"&gt;Datadog&lt;/a&gt; is a cloud monitoring platform that transforms application management through intelligent analytics. This DevOps AI tool uses machine learning to metrics, logs, and traces, data, and it enables DevOps teams to detect performance anomalies, identify infrastructure issues, and proactively recognize potential problems before they impact users.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Key Features of Datadog DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Its DevOps copilot assists in investigating and responding to incidents more efficiently across the Datadog platform.&lt;/li&gt;
&lt;li&gt;  AI accelerates investigations by automatically correlating telemetry and surfacing outliers, anomalies, and root causes of issues across the tech stack.&lt;/li&gt;
&lt;li&gt;  It provides monitoring solutions by using machine learning, enabling teams to easily detect outliers in their application and infrastructure performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  New Relic
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://newrelic.com/" rel="noopener noreferrer"&gt;New Relic&lt;/a&gt; is an observability platform offering real-time insights into how applications are performing based on user experience. By using this DevOps AI tool, collecting and analyzing telemetry data becomes easy, and DevOps teams can easily identify performance bottlenecks in their applications and track health metrics.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5d29ku8zs6oov82cmd60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5d29ku8zs6oov82cmd60.png" alt="New Relic is an observability platform offering real-time insights" width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features of New Relic DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Its AIOps capabilities utilize machine learning to automatically detect anomalies, correlate related incidents, and reduce alert noise, enabling teams to focus on critical issues.&lt;/li&gt;
&lt;li&gt;  It provides tools to quickly identify the root causes of issues, integrating data from various sources to offer comprehensive insights and expedite resolution.&lt;/li&gt;
&lt;li&gt;  It offers end-to-end visibility into AI-powered applications, allowing teams to monitor performance, ensure quality responses, and manage costs effectively.&lt;/li&gt;
&lt;li&gt;  It leverages large language models, enabling users to interact with their observability data using everyday language, making it accessible to a broader range of team members.&lt;/li&gt;
&lt;li&gt;  It integrates with tools like GitHub Copilot, facilitating seamless workflows and enhancing the efficiency of development and operations teams.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sysdig
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://sysdig.com/" rel="noopener noreferrer"&gt;Sysdig&lt;/a&gt; is an innovative DevOps AI tool that leverages AI and machine learning to enhance DevOps operations across containerized environments. It works through multiple integrated mechanisms to provide comprehensive monitoring and security by providing runtime threat detection through continuous monitoring, automated vulnerability scanning of operating systems, applications, and libraries, resource optimization through intelligent allocation process and runtime analysis and detailed forensic timeline.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Key Features of Sysdig DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It accelerates human response to cloud threats through multi-step reasoning and contextual awareness. It assists security, development, and DevOps teams in collaboratively addressing security challenges more efficiently.&lt;/li&gt;
&lt;li&gt;  It leverages machine learning to detect and analyze patterns, anomalies, and potential security threats within the software stack. This enables proactive identification and resolution of issues, ensuring application stability and security.&lt;/li&gt;
&lt;li&gt;  It automatically identifies unusual behaviors and potential threats within cloud and Kubernetes environments, allowing DevOps engineers to address issues before they impact operations.&lt;/li&gt;
&lt;li&gt;  It utilizes AI-driven insights to analyze the behavior and performance of containers, microservices, and infrastructure components.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mabl
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.mabl.com/" rel="noopener noreferrer"&gt;Mabl&lt;/a&gt; is an innovative AI-driven test automation platform that helps to make the web application testing process fast and smooth through intelligent automation and seamless CI/CD pipeline integration. Using the Mabl DevOps AI tool will help teams deliver high-quality applications much faster through adaptive machine learning. This tool significantly reduces the need for manual test scripting and maintenance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwo3k4xcfpmzrc8zrajyb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwo3k4xcfpmzrc8zrajyb.png" alt="Mabl is an innovative AI-driven test automation platform" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features of Mabl DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Its expert systems and probabilistic models automatically adapt tests to changes in application elements, reducing maintenance efforts and ensuring test reliability.&lt;/li&gt;
&lt;li&gt;  Its machine learning models learn application timing to dynamically adjust tests, leading to faster and more reliable execution across different environments.&lt;/li&gt;
&lt;li&gt;  It allows users to validate complex application behaviors using natural language descriptions, simplifying the creation of comprehensive test scenarios.&lt;/li&gt;
&lt;li&gt;  It detects unexpected UI changes, ensuring a consistent user experience and maintaining application quality.&lt;/li&gt;
&lt;li&gt;  It monitors page load times and test run durations, using clustering techniques to identify potential regressions early in the development cycle.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Jenkins X
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://jenkins-x.io/" rel="noopener noreferrer"&gt;Jenkins X&lt;/a&gt; is a cloud-native automation platform that enhances Continuous Integration and Continuous Delivery by integrating with popular open-source projects like Kubernetes, Tekton, Kuberhealthy, Grafana, Jenkins, and Nexus. This DevOps AI tool uses Infrastructure as Code through Terraform for cloud resource management, implements GitOps for version control and cluster state management, and utilizes secure secret management through providers like Vault or cloud-hosted solutions.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Key Features of Jenkins X DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It analyzes past build data to predict potential failures before they occur, allowing engineers to address issues proactively.&lt;/li&gt;
&lt;li&gt;  Its decision-making helps in automating rollbacks in case of deployment failures, minimizing downtime.&lt;/li&gt;
&lt;li&gt;  It optimizes resource allocation during the build process, reducing costs and improving efficiency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subscribe to the &lt;a href="https://www.youtube.com/c/LambdaTest?sub_confirmation=1" rel="noopener noreferrer"&gt;LambdaTest YouTube channel&lt;/a&gt; and get more videos on DevOps, AIOps, and more.&lt;/p&gt;

&lt;h3&gt;
  
  
  CircleCI
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://circleci.com/" rel="noopener noreferrer"&gt;CircleCI&lt;/a&gt; is a leading cloud-based platform for CI/CD that automates the software development process, enabling teams to build, test, and deploy applications with efficiency and precision. By integrating seamlessly with popular version control systems like GitHub, GitLab and Bitbucket, CircleCI enhances collaboration and accelerates development cycles.&lt;/p&gt;

&lt;p&gt;This DevOps AI tool uses machine learning algorithms for job scheduling and resource allocation, ensuring faster pipeline execution, while its robust feature set and intuitive interface make it a top choice for DevOps teams aiming to improve software quality and delivery speed.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Key Features of CircleCI DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It enables parallel processing of tasks, such as building and testing, to reduce build times and speed up deployments.&lt;/li&gt;
&lt;li&gt;  It offers strong Docker integration, allowing teams to containerize applications for consistent environments across development, testing, and production stages.&lt;/li&gt;
&lt;li&gt;  It provides highly configurable pipelines for defining complex workflows, managing dependencies between jobs, and streamlining delivery processes across staging and production environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Azure DevOps
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/products/devops/" rel="noopener noreferrer"&gt;Azure DevOps&lt;/a&gt; is a comprehensive set of tools and services provided by Microsoft. It is one of the most used DevOps AI tools when integrated with Azure’s AI and machine learning services. This integration enhances CI/CD processes, test automation, and infrastructure management.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Key Features of Azure DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It automatically generates and runs test cases based on code changes, improving test coverage and reducing manual effort.&lt;/li&gt;
&lt;li&gt;  It optimizes build processes by identifying bottlenecks and recommending improvements.&lt;/li&gt;
&lt;li&gt;  It analyzes past deployments to predict the success of future deployments, reducing the risk of failures.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Snyk
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://snyk.io/" rel="noopener noreferrer"&gt;Snyk&lt;/a&gt; is one of the most powerful DevOps AI tools that provides end-to-end security scanning capabilities across the development lifecycle, as it focuses on automatically scanning the codebases for vulnerabilities in open-source libraries and dependencies, enabling early detection and remediation of potential security issues. Performing security scans on container images, ensuring applications remain secure throughout the containerization process and offering Cloud Security Posture Management (CSPM) to identify and fix misconfigurations and security gaps in cloud infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1mffs9qitb521sgepls.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1mffs9qitb521sgepls.png" alt="Snyk is one of the most powerful DevOps AI tools" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features of Snyk DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It utilizes AI to perform Static Application Security Testing (SAST), identifying vulnerabilities in real time as developers write code. This immediate feedback allows for prompt remediation, reducing security risks early in the development process.&lt;/li&gt;
&lt;li&gt;  It improves the accuracy of vulnerability identification across application source code, open-source libraries, container infrastructures, and Infrastructure-as-Code (IaC). This comprehensive analysis ensures a robust security posture.&lt;/li&gt;
&lt;li&gt;  Its AI capabilities provide actionable fix advice directly within development tools. This integration streamlines the remediation process, enabling developers to address security issues efficiently without disrupting their workflow.&lt;/li&gt;
&lt;li&gt;  Its AI-driven continuous monitoring features alert DevOps teams to new security threats and vulnerabilities as they emerge. This proactive approach ensures that applications remain secure even as new risks develop.&lt;/li&gt;
&lt;li&gt;  It provides context from data collected across various security and observability tools. This holistic view enables organizations to assess and manage application risk more effectively.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Splunk
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.splunk.com/" rel="noopener noreferrer"&gt;Splunk&lt;/a&gt; is an emerging game-changing platform in the data-driven world of DevOps, which takes massive amounts of machine-generated data and turns it into meaningful insights. Advanced machine learning capabilities enable Splunk to go beyond the traditional log analysis, offering organizations a powerful DevOps AI tool for proactive monitoring, security, and operational intelligence.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Key Features Splunk DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It provides guided workflows and smart assistants for users to create custom machine learning models designed for specific DevOps use cases, enhancing data analysis and decision-making processes.&lt;/li&gt;
&lt;li&gt;  It utilizes AI to offer predictive analytics, alert noise reduction, anomaly detection, adaptive thresholding, and incident correlation, providing a comprehensive AIOps solution for monitoring and maintaining IT service health.&lt;/li&gt;
&lt;li&gt;  It uses generative AI to provide a chat experience that helps users author and learn Splunk Processing Language (SPL) by interacting in plain English, offering query suggestions, explanations, and detailed breakdowns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.pagerduty.com/" rel="noopener noreferrer"&gt;PagerDuty&lt;/a&gt; is a leading incident management platform that provides robust solutions to DevOps teams for detecting, responding to, and resolving production incidents efficiently. This tool allows organizations to minimize downtime by providing real-time monitoring and automated response systems.&lt;/p&gt;

&lt;p&gt;The newest offering of this DevOps AI tool is PagerDuty AIOps, which incorporates artificial intelligence and automation into the capabilities. This solution helps reduce noise in the incident management process, improving defect triage efficiency and response accuracy and allows teams to automate repetitive tasks in the incident response workflow.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Key Features of PagerDuty DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It automatically detects and routes incidents to qualified team members based on expertise and availability for rapid response to critical issues.&lt;/li&gt;
&lt;li&gt;  It uses an ML-based approach to limit alert fatigue by grouping associated alerts and prioritizing relevant issues, so teams need to focus on what counts the most.&lt;/li&gt;
&lt;li&gt;  It ensures that scheduling and escalation policies are automated, thereby ensuring continuous coverage to address incidents in a structured response chain.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CloudHealth
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.cloudhealthtech.com/" rel="noopener noreferrer"&gt;CloudHealth&lt;/a&gt; by VMWare leverages AI to optimize the cloud cost. It analyzes cloud resource usage to provide intelligent recommendations, including rightsizing suggestions for workload-appropriate instance types and reserved instance opportunities for predictable workloads, driving significant cost saving. It also offers comprehensive resource management through automated tagging, categorization, and scaling recommendations based on usage patterns. The platform streamlines compliance management through automated reporting and monitoring.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Key Features of CloudHealth DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It utilizes AI to provide rightsizing recommendations across CPU, memory, disk, and network resources, ensuring efficient resource utilization and cost savings.&lt;/li&gt;
&lt;li&gt;  It Offers AI-driven insights for optimizing workloads and automating processes, enhancing operational efficiency and performance.&lt;/li&gt;
&lt;li&gt;  It provides detailed cost analysis and recommendations for Kubernetes clusters, assisting in right-sizing node pools and underlying infrastructure for optimal performance.&lt;/li&gt;
&lt;li&gt;  It improves cloud compliance and security posture with full visibility into misconfigurations based on predefined rules and custom policies, prioritizing issues based on risk scores and automating remediation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dynatrace
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.dynatrace.com/" rel="noopener noreferrer"&gt;Dynatrace&lt;/a&gt; delivers comprehensive monitoring through Davis AI and DevOps AI tool that uses an intelligent engine that processes billions of dependencies in milliseconds to detect anomalies and perform root cause analysis. This tool helps track system metrics such as CPU performance, response times, and network traffic across the entire technology stack, from infrastructure to end-user interactions. It enables automated anomaly detection and root cause analysis, thus helping teams quickly identify issues before they affect users.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Key Features of Dynatrace DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It continuously analyzes vast data to detect anomalies, perform root cause analysis, and provide precise answers, enabling rapid issue resolution and proactive performance optimization.&lt;/li&gt;
&lt;li&gt;  It automatically identifies the root cause of performance issues, reducing the time spent on troubleshooting.&lt;/li&gt;
&lt;li&gt;  It forecasts potential issues, allowing teams to address them proactively before they impact operations.&lt;/li&gt;
&lt;li&gt;  It autonomously identifies unusual patterns or behaviors across the entire technology stack, facilitating early detection of potential problems.&lt;/li&gt;
&lt;li&gt;  It continuously monitors cloud environments, detecting and resolving issues without human intervention.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ansible
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.ansible.com/" rel="noopener noreferrer"&gt;​​Ansible&lt;/a&gt; provides streamlined automation for IT orchestration and configuration management through its declarative language. Teams can efficiently define and execute automation tasks, ensuring consistent environment management. This tool provides simplicity and effectiveness making it a valuable tool for managing complex IT infrastructures at scale.&lt;/p&gt;

&lt;p&gt;By integrating AI, this DevOps AI tool transforms from a simple automation platform into an intelligent system capable of making real-time decisions and adapting to complex infrastructure needs.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Key Features of Ansible DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Its intelligent algorithms dynamically adjust configurations based on the infrastructure state.&lt;/li&gt;
&lt;li&gt;  It automates the detection and correction of system issues.&lt;/li&gt;
&lt;li&gt;  Its predictive resource scaling analysis of usage patterns to optimize performance and resource allocation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  IBM Watson AIOps
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.ibm.com/docs/en/watson-aiops/2.1?topic=overview" rel="noopener noreferrer"&gt;IBM Watson AIOps&lt;/a&gt; enhances IT operations through machine learning and natural language processing, offering autonomous incident management and resolution. Operating on a consumption-based pricing model, the platform delivers two core capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Predictive Analytics:&lt;/strong&gt; Analyzes historical and real-time data to forecast potential incidents before they impact system performance, enabling proactive issue resolution and minimizing service disruptions.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Automated Troubleshooting:&lt;/strong&gt; Leverages AI-driven analytics and NLP to determine root causes by examining log data, alerts, and change history, reducing manual intervention in incident resolution.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Key Features IBM Watson AIOps DevOps AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It automatically clusters related events to identify root causes, streamlining incident management and reducing resolution times.&lt;/li&gt;
&lt;li&gt;  It uses machine learning to detect anomalies in logs and alerts, enabling proactive issue identification before they impact operations.&lt;/li&gt;
&lt;li&gt;  It processes unstructured data from sources such as logs, tickets, and chats to extract valuable insights, enrich predictive alerts and enhance decision-making.&lt;/li&gt;
&lt;li&gt;  It identifies the root fault component and assesses the impact radius, facilitating quick problem isolation and resolution.&lt;/li&gt;
&lt;li&gt;  It provides AI-driven recommendations based on historical data, assisting teams in resolving outages swiftly and preventing future incidents.&lt;/li&gt;
&lt;li&gt;  It utilizes deep learning models to predict risks associated with code and configuration changes, offering proactive alerts to prevent potential issues.&lt;/li&gt;
&lt;li&gt;  It seamlessly connects with existing DevOps tools, aggregating data across the entire stack to provide comprehensive insights and maintain workflow continuity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Selecting the right DevOps AI tool can be the difference between transformative efficiency and technological frustration. The process requires a holistic approach that goes beyond surface-level features, demanding a strategic evaluation of your organization’s unique needs and potential for growth.&lt;/p&gt;

&lt;p&gt;The key is to select tools that align with your specific organizational needs and existing technology stack.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scalability
&lt;/h3&gt;

&lt;p&gt;The ideal DevOps AI tool should be able to seamlessly expand with your existing infrastructure, handling increasing complexity without performance degradation. A truly scalable tool adapts to your growth, offering flexible resource allocation and the ability to manage increasingly sophisticated workflows as your organization evolves.&lt;/p&gt;

&lt;p&gt;By integrating AI into DevOps workflows, organizations can streamline the development process by reducing manual intervention and errors. Teams can also boost their productivity by using various &lt;a href="https://www.lambdatest.com/blog/devops-automation-tools/" rel="noopener noreferrer"&gt;DevOps automation tools&lt;/a&gt; that enable them to focus on innovation and continuous improvements in delivering high-quality software applications.&lt;/p&gt;

&lt;p&gt;Implementing containerization, monitoring tools like Prometheus and Grafana, and creating collaborative environments can help businesses enhance the efficiency and reliability of AI models.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integration Capabilities
&lt;/h3&gt;

&lt;p&gt;Your DevOps AI tool must become an organic part of your existing technology landscape. This means deep, seamless integration with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Continuous Integration/Continuous Deployment (CI/CD) pipelines&lt;/li&gt;
&lt;li&gt;  Cloud platforms&lt;/li&gt;
&lt;li&gt;  Source code management systems&lt;/li&gt;
&lt;li&gt;  Monitoring and logging infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is a harmonious technological ecosystem where AI tools enhance, rather than disrupt, your existing workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Team Adoption
&lt;/h3&gt;

&lt;p&gt;Technical capabilities mean nothing if your team can’t effectively use the DevOps AI tools conveniently. Teams must be able to adapt to new technologies and trends to keep enhancing the development and testing process.&lt;/p&gt;

&lt;p&gt;Consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Intuitive interfaces&lt;/li&gt;
&lt;li&gt;  Comprehensive documentation&lt;/li&gt;
&lt;li&gt;  Training resources&lt;/li&gt;
&lt;li&gt;  Community support&lt;/li&gt;
&lt;li&gt;  Alignment with your team’s current skill set&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most powerful DevOps AI tool must be chosen based on the requirements of the project. While AI is not meant to completely replace human judgment, it serves as a powerful tool that augments human capabilities by reducing risks, increasing efficiency, and providing insights that might be overlooked by human analysts.&lt;/p&gt;

&lt;p&gt;Key benefits include speed of decision-making, improved accuracy, risk reduction, and the ability to create an infinite institutional memory. However, successful AI integration requires building trust, democratizing access, and seamlessly embedding these technologies into existing systems, with an ongoing emphasis on human-centered design and ethical considerations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;As you move forward AI is no longer an optional add-on but a necessary part of effective DevOps strategies. The right combination of AI tools can dramatically improve efficiency, reduce operational risks, and accelerate innovation. Implementing AI tools in DevOps can revolutionize workflows by automating tasks, enhancing decision-making, and boosting efficiency.&lt;/p&gt;

&lt;p&gt;However, some of the challenges, such as data quality, integration complexity, performance strain, security risks, and high costs, need to be overcome for successful implementation. High-quality data through consistent logging and centralized pipelines, choosing compatible tools to reduce integration complexity, and utilizing cloud-based solutions to optimize resources can help overcome these obstacles.&lt;/p&gt;

&lt;p&gt;Additionally, prioritizing AI tools with robust security features and regulatory compliance safeguards sensitive data while evaluating ROI ensures cost-effectiveness. With strategic planning and the right tools, organizations can unlock AI’s full potential to transform their DevOps processes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions (FAQs)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Are AI DevOps tools suitable for small teams?
&lt;/h3&gt;

&lt;p&gt;Yes, many tools offer scalable pricing and can benefit teams of all sizes.&lt;/p&gt;

&lt;h3&gt;
  
  
  How secure are AI-powered DevOps tools?
&lt;/h3&gt;

&lt;p&gt;Reputable tools prioritize security and often provide additional layers of protection through AI-driven threat detection.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can AI completely replace human DevOps engineers?
&lt;/h3&gt;

&lt;p&gt;No, AI is designed to augment and assist human capabilities, not replace skilled professionals.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the typical ROI of implementing AI DevOps tools?
&lt;/h3&gt;

&lt;p&gt;ROI varies, but organizations often see improvements in deployment speed, resource efficiency, and reduced downtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  How quickly do AI DevOps tools adapt to new technologies?
&lt;/h3&gt;

&lt;p&gt;Most leading tools use machine learning models that continuously update and learn from vast datasets, ensuring relatively quick adaptation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Citations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  AI and DevOps in Information Technology and Its Future in the United States: &lt;a href="https://www.researchgate.net/publication/357033152_AI_and_DevOps_in_Information_Technology_and_Its_Future_in_the_United_States" rel="noopener noreferrer"&gt;https://www.researchgate.net/publication/357033152_AI_and_DevOps_in_Information-_Technology_and_Its_Future_in_the_United_States&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Integrating AI into DevOps pipelines: &lt;a href="https://ijsra.net/sites/default/files/IJSRA-2024-1838.pdf" rel="noopener noreferrer"&gt;https://ijsra.net/sites/default/files/IJSRA-2024-1838.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.lambdatest.com/blog/author/chandrikadeb7/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsecure.gravatar.com%2Favatar%2F9bbd07b0aeb940809d5e7e3534afd5ae%3Fs%3D150%26d%3Dmm%26r%3Dr" width="150" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.lambdatest.com/blog/author/chandrikadeb7/" rel="noopener noreferrer"&gt;Chandrika Deb&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Chandrika is a digital marketer with 4+ years of experience in digital transformation and technical content creation. As a freelance writer specializing in DevOps and software testing, her blogs have attracted over 500,000 views. In her free time, she enjoys binge-watching Netflix and illustrating on her iPad.&lt;/p&gt;

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

&lt;p&gt;Author’s Profile&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.lambdatest.com/blog/author/chandrikadeb7/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsecure.gravatar.com%2Favatar%2F9bbd07b0aeb940809d5e7e3534afd5ae%3Fs%3D60%26d%3Dmm%26r%3Dr" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chandrika Deb&lt;/p&gt;

&lt;p&gt;Chandrika is a digital marketer with 4+ years of experience in digital transformation and technical content creation. As a freelance writer specializing in DevOps and software testing, her blogs have attracted over 500,000 views. In her free time, she enjoys binge-watching Netflix and illustrating on her iPad.&lt;/p&gt;

&lt;p&gt;Got Questions? Drop them on LambdaTest Community. &lt;a href="https://community.lambdatest.com/" rel="noopener noreferrer"&gt;Visit now&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reviews.capterra.com/products/new/04d4f272-f472-4466-b43f-a7fc008b2ae0/54764669-7ab8-45e4-9d1b-5080658231a0/?lang=en" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3p4w2coaa71z2ixfs4oy.png" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try LambdaTest Now !!&lt;/p&gt;

&lt;p&gt;Get 100 minutes of automation test minutes FREE!!&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.lambdatest.com%2Fassets_black_theme%2Fimages%2Fcookie.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.lambdatest.com%2Fassets_black_theme%2Fimages%2Fcookie.svg" alt="Cookie" width="48" height="48"&gt;&lt;/a&gt; X&lt;/p&gt;

&lt;p&gt;We use cookies to give you the best experience. Cookies help to provide a more personalized experience and relevant advertising for you, and web analytics for us. Learn More in our &lt;a href="https://www.lambdatest.com/legal/cookie" rel="noopener noreferrer"&gt;Cookies policy&lt;/a&gt;, &lt;a href="https://www.lambdatest.com/legal/privacy" rel="noopener noreferrer"&gt;Privacy&lt;/a&gt; &amp;amp; &lt;a href="https://www.lambdatest.com/legal/terms-of-service" rel="noopener noreferrer"&gt;Terms of service&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>aws</category>
      <category>ai</category>
    </item>
    <item>
      <title>Top 110+ DevOps Interview Questions and Answers for 2025</title>
      <dc:creator>Hoang Guruu</dc:creator>
      <pubDate>Mon, 10 Mar 2025 02:41:15 +0000</pubDate>
      <link>https://dev.to/aws-builders/top-110-devops-interview-questions-and-answers-for-2025-4h4n</link>
      <guid>https://dev.to/aws-builders/top-110-devops-interview-questions-and-answers-for-2025-4h4n</guid>
      <description>&lt;p&gt;【 &lt;a href="https://www.youtube.com/@HoangGuruu" rel="noopener noreferrer"&gt;👨🏻‍💻 YouTube&lt;/a&gt; 】&lt;br&gt;
Watch more other contents related DevOps - AWS&lt;/p&gt;

&lt;h2&gt;
  
  
  What is DevOps?
&lt;/h2&gt;

&lt;p&gt;A group of activities and approaches called DevOps combines &lt;a href="https://www.simplilearn.com/tutorials/programming-tutorial/what-is-software-development" rel="noopener noreferrer"&gt;software development&lt;/a&gt; (Dev) with information technology operations (Ops) to improve the efficiency and quality of software development, delivery, and deployment.&lt;/p&gt;

&lt;p&gt;DevOps' primary objective is to foster teamwork between the development and operations teams so that they may collaborate easily across the whole software development life cycle. In addition, automation, continuous integration, delivery, and deployment are used to speed up and reduce mistakes in the software development process.&lt;/p&gt;

&lt;p&gt;Monitoring and feedback are also emphasized in DevOps, which enables the development and operations teams to see problems early and proactively handle them. Using DevOps methods, businesses may improve their agility, competitiveness, and overall productivity by achieving quicker release cycles, higher-quality software, and enhanced team cooperation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a DevOps Engineer? 
&lt;/h2&gt;

&lt;p&gt;A &lt;a href="https://www.simplilearn.com/tutorials/devops-tutorial/how-to-become-devops-engineer" rel="noopener noreferrer"&gt;DevOps engineer&lt;/a&gt; is an expert in developing, deploying, and maintaining software systems using the DevOps methodology and practices.&lt;/p&gt;

&lt;p&gt;DevOps engineers collaborate closely with IT operations teams, software developers, and other stakeholders to guarantee the effective delivery of software products. To increase the efficiency and quality of software development, they implement automation, continuous integration, and continuous delivery/deployment (CI/CD) practices. They also locate and resolve issues that arise throughout the development process.&lt;/p&gt;

&lt;p&gt;DevOps engineers often have extensive backgrounds in IT operations, systems administration, software development, scripting, automation, and cloud computing skills. They are adept at using various tools and technologies, including source code management systems, build and deployment tools, virtualization and container technologies, and monitoring and logging tools.&lt;/p&gt;

&lt;p&gt;DevOps engineers must be proficient in technical and interpersonal skills, teamwork, and problem-solving techniques. They also need to be able to interact and collaborate successfully with coworkers from all backgrounds and disciplines since they work closely with several teams within the business.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the Requirements to Become a DevOps Engineer?
&lt;/h2&gt;

&lt;p&gt;Different criteria for becoming a DevOps engineer may exist depending on the business and the individual function. However, some specific fundamental skills and certifications are frequently needed or recommended. They consist of the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Excellent technical background: DevOps engineers should be well-versed in IT operations, systems administration, and software development. A degree in computer science, information technology, or a similar discipline may be required, as well as relevant experience and certifications.&lt;/li&gt;
&lt;li&gt;  Experience with DevOps tools and methodologies: DevOps engineers should have experience with various DevOps technologies and processes, including version control systems, build and deployment automation, containerization, cloud computing, and monitoring and logging tools.&lt;/li&gt;
&lt;li&gt;  Scripting and automation skills: DevOps engineers should have strong scripting skills and be proficient in using tools such as Bash, Python, or PowerShell to automate tasks and processes.&lt;/li&gt;
&lt;li&gt;  Cloud computing experience: DevOps engineers should have experience working with cloud platforms such as Amazon Web Services (AWS), Microsoft Azure, or Google Cloud Platform (GCP).&lt;/li&gt;
&lt;li&gt;  Soft skills: DevOps engineers should be effective communicators, able to collaborate with teams across departments, and possess strong problem-solving and analytical skills.&lt;/li&gt;
&lt;li&gt;  Certification: Some organizations may require DevOps engineers to hold relevant certifications such as Certified DevOps Engineer (CDE), Certified Kubernetes Administrator (CKA), or AWS Certified DevOps Engineer - Professional.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let us now begin with some general DevOps interview questions and answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  General DevOps Interview Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. What do you know about DevOps?
&lt;/h3&gt;

&lt;p&gt;Your answer must be simple. Begin by explaining the growing importance of DevOps in the &lt;a href="https://www.simplilearn.com/6-trends-shaking-up-the-it-industry-article" rel="noopener noreferrer"&gt;IT industry.&lt;/a&gt; Discuss how such an approach aims to synergize the efforts of the development and operations teams to accelerate the delivery of software products with a minimal failure rate. Include how DevOps is a value-added practice where development and operations engineers join hands throughout the product or service lifecycle, from the design stage to the deployment point.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. How is DevOps different from agile methodology?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.simplilearn.com/tutorials/devops-tutorial/what-is-devops" rel="noopener noreferrer"&gt;DevOps is a culture&lt;/a&gt; that allows the development and operations teams to work together. This results in &lt;a href="https://www.simplilearn.com/tutorials/devops-tutorial/continuous-delivery-and-continuous-deployment" rel="noopener noreferrer"&gt;continuous software development&lt;/a&gt;, testing, integration, deployment, and monitoring throughout the lifecycle.&lt;/p&gt;

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

&lt;p&gt;Agile is a &lt;a href="https://www.simplilearn.com/tutorials/agile-scrum-tutorial/what-is-agile" rel="noopener noreferrer"&gt;software development methodology&lt;/a&gt; that focuses on iterative, incremental, small, and rapid software releases and customer feedback. It addresses gaps and conflicts between customers and developers.&lt;/p&gt;

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

&lt;p&gt;DevOps addresses gaps and conflicts between the Developers and IT Operations.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  3. Which are some of the most popular DevOps tools?
&lt;/h3&gt;

&lt;p&gt;The most popular &lt;a href="https://www.simplilearn.com/tutorials/devops-tutorial/devops-tools" rel="noopener noreferrer"&gt;DevOps tools&lt;/a&gt; include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;a href="https://www.simplilearn.com/tutorials/selenium-tutorial/what-is-selenium" rel="noopener noreferrer"&gt;Selenium&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.simplilearn.com/puppet-tutorial-article" rel="noopener noreferrer"&gt;Puppet&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.simplilearn.com/chef-tutorial-article" rel="noopener noreferrer"&gt;Chef&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.simplilearn.com/tutorials/git-tutorial" rel="noopener noreferrer"&gt;Git&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.simplilearn.com/tutorials/jenkins-tutorial/what-is-jenkins" rel="noopener noreferrer"&gt;Jenkins&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.simplilearn.com/tutorials/ansible-tutorial" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.simplilearn.com/tutorials/docker-tutorial" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  4. What are the different phases in DevOps?
&lt;/h3&gt;

&lt;p&gt;The various phases of the DevOps lifecycle are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Plan: Initially, there should be a plan for the type of application that needs to be developed. Getting a rough picture of the development process is always a good idea.&lt;/li&gt;
&lt;li&gt;  Code: The application is coded as per the end-user requirements. &lt;/li&gt;
&lt;li&gt;  Build: Build the application by integrating various codes formed in the previous steps.&lt;/li&gt;
&lt;li&gt;  Test: This is the most crucial step of the application development. Test the application and rebuild, if necessary.&lt;/li&gt;
&lt;li&gt;  Integrate: Multiple codes from different programmers are integrated into one.&lt;/li&gt;
&lt;li&gt;  Deploy: Code is deployed into a cloud environment for further usage. It is ensured that any new changes do not affect the functioning of a high traffic website.&lt;/li&gt;
&lt;li&gt;  Operate: Operations are performed on the code if required.&lt;/li&gt;
&lt;li&gt;  Monitor: Application performance is monitored. Changes are made to meet the end-user requirements.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The above figure indicates the DevOps lifecycle.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bridge the gap between software developers and operations and develop your career in DevOps by choosing our unique &lt;a href="https://www.simplilearn.com/pgp-devops-certification-training-course?source=GhPreviewCTAText" rel="noopener noreferrer"&gt;Post Graduate Program in DevOps.&lt;/a&gt; Enroll for the PGP in collaboration with Caltech CTME Today!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  5. Mention some of the core benefits of DevOps.
&lt;/h3&gt;

&lt;p&gt;The core benefits of DevOps are as follows:&lt;/p&gt;

&lt;h4&gt;
  
  
  Technical benefits
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  Continuous software delivery&lt;/li&gt;
&lt;li&gt;  Less complex problems to manage&lt;/li&gt;
&lt;li&gt;  Early detection and faster correction of defects&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Business benefits
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  Faster delivery of features&lt;/li&gt;
&lt;li&gt;  Stable operating environments&lt;/li&gt;
&lt;li&gt;  Improved communication and collaboration between the teams&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. How will you approach a project that needs to implement DevOps?
&lt;/h3&gt;

&lt;p&gt;The following standard approaches can be used to implement DevOps in a specific project:&lt;/p&gt;

&lt;h4&gt;
  
  
  Stage 1
&lt;/h4&gt;

&lt;p&gt;An assessment of the existing process and implementation for about two to three weeks to identify areas of improvement so that the team can create a road map for the implementation.&lt;/p&gt;

&lt;h4&gt;
  
  
  Stage 2
&lt;/h4&gt;

&lt;p&gt;Create a proof of concept (PoC). Once it is accepted and approved, the team can start implementing and rolling out the project plan.&lt;/p&gt;

&lt;h4&gt;
  
  
  Stage 3
&lt;/h4&gt;

&lt;p&gt;The project is now ready to implement DevOps by following a step-by-step process for version control, integration, testing, deployment, delivery, and monitoring.&lt;/p&gt;

&lt;p&gt;By following the proper steps for &lt;a href="https://www.simplilearn.com/tutorials/devops-tutorial/version-control" rel="noopener noreferrer"&gt;version control&lt;/a&gt;, integration, testing, deployment, delivery, and monitoring, the project is now ready for DevOps implementation.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. What is the difference between continuous delivery and continuous deployment?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Continuous Delivery: Ensures code can be safely deployed onto production

&lt;ul&gt;
&lt;li&gt;Continuous Deployment: Every change that passes the automated tests is deployed to production automatically&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Continuous Delivery: Ensures business applications and services function as expected

&lt;ul&gt;
&lt;li&gt;Continuous Deployment: Makes software development and the release process faster and more robust&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Continuous Delivery: Delivers every change to a production-like environment through rigorous automated testing

&lt;ul&gt;
&lt;li&gt;Continuous Deployment: There is no explicit approval from a developer, and it requires a developed culture of monitoring&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feud6eldheflr4ty24qj1.png" width="800" height="361"&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  8. What is the role of configuration management in DevOps?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Enables management of and changes to multiple systems.&lt;/li&gt;
&lt;li&gt;  Standardizes resource configurations, which in turn, manage IT infrastructure.&lt;/li&gt;
&lt;li&gt;  It helps with the administration and management of multiple servers and maintains the integrity of the entire infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9. How does continuous monitoring help you maintain the entire architecture of the system?
&lt;/h3&gt;

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

&lt;p&gt;Continuous monitoring in DevOps is a process of detecting, identifying, and reporting faults or threats in the system's entire infrastructure.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Ensures that all services, applications, and resources are running on the servers properly.&lt;/li&gt;
&lt;li&gt;  Monitors the status of servers and determines if applications are working correctly or not.&lt;/li&gt;
&lt;li&gt;  Enables continuous audit, transaction inspection, and control monitoring.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10. What is the role of AWS in DevOps?
&lt;/h3&gt;

&lt;p&gt;AWS has the following role in DevOps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Flexible services: Provides ready-to-use, flexible services without the need to install or set up the software.&lt;/li&gt;
&lt;li&gt;  Built for scale: You can manage a single instance or scale to thousands using AWS services.&lt;/li&gt;
&lt;li&gt;  Automation: AWS lets you automate tasks and processes, giving you more time to innovate&lt;/li&gt;
&lt;li&gt;  Secure: You can set user permissions and policies using AWS Identity and Access Management (IAM).&lt;/li&gt;
&lt;li&gt;  Large partner ecosystem: AWS supports a large ecosystem of partners that integrate with and extend AWS services.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  11. Name three important DevOps KPIs.
&lt;/h3&gt;

&lt;p&gt;The three important KPIs are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Meantime to failure recovery: This is the average time taken to recover from a failure.&lt;/li&gt;
&lt;li&gt;  Deployment frequency: The frequency in which the deployment occurs. &lt;/li&gt;
&lt;li&gt;  Percentage of failed deployments: The number of times the deployment fails.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  12. Explain the term "Infrastructure as Code" (IaC) as it relates to configuration management.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Writing code to manage configuration, deployment, and automatic provisioning.&lt;/li&gt;
&lt;li&gt;  Managing data centers with machine-readable definition files, rather than physical hardware configuration.&lt;/li&gt;
&lt;li&gt;  Ensuring all your servers and other infrastructure components are provisioned consistently and effortlessly. &lt;/li&gt;
&lt;li&gt;  Administering cloud computing environments, also known as &lt;a href="https://www.simplilearn.com/what-is-infrastructure-as-code-article" rel="noopener noreferrer"&gt;infrastructure as a service (IaaS)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  13. How is IaC implemented using AWS?
&lt;/h3&gt;

&lt;p&gt;Start by talking about the age-old mechanisms of writing commands onto script files and testing them in a separate environment before deployment and how IaC is replacing this approach. Similar to the codes written for other services, with the help of AWS, IaC allows developers to write, test, and descriptively maintain infrastructure entities, using formats such as JSON or YAML. This enables easier development and faster deployment of infrastructure changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  14. Why Has DevOps Gained Prominence over the Last Few Years?
&lt;/h3&gt;

&lt;p&gt;Before talking about the growing popularity of DevOps, discuss the current industry scenario. Begin with some examples of how big players such as &lt;a href="https://techbeacon.com/10-companies-killing-it-devops" rel="noopener noreferrer"&gt;Netflix and Facebook&lt;/a&gt; are investing in DevOps to automate and accelerate application deployment and how this has helped them grow their business. Using Facebook as an example, you would point to Facebook’s continuous deployment and code ownership models and how these have helped it scale up but ensure the quality of experience at the same time. Hundreds of lines of code are implemented without affecting quality, stability, and security.&lt;/p&gt;

&lt;p&gt;Your next use case should be Netflix. This streaming and on-demand video company follows similar practices with fully automated processes and systems. Mention the user bases of these two organizations: Facebook has 2 billion users, while Netflix streams online content to more than 100 million users worldwide.&lt;/p&gt;

&lt;p&gt;These are great examples of how DevOps can help organizations ensure higher success rates for releases, reduce the lead time between bug fixes, streamline and continuous delivery through automation, and reduce manpower costs overall.&lt;/p&gt;

&lt;h3&gt;
  
  
  15. What are the fundamental differences between DevOps &amp;amp; Agile?
&lt;/h3&gt;

&lt;p&gt;The main differences between Agile and DevOps are summarized below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Characteristics: Work Scope

&lt;ul&gt;
&lt;li&gt;Agile: Only Agility&lt;/li&gt;
&lt;li&gt;DevOps: Automation needed along with Agility&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Characteristics: Focus Area

&lt;ul&gt;
&lt;li&gt;Agile: Main priority is Time and deadlines&lt;/li&gt;
&lt;li&gt;DevOps: Quality and Time management are of equal priority&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Characteristics: Feedback Source

&lt;ul&gt;
&lt;li&gt;Agile: The main source of feedback - customers&lt;/li&gt;
&lt;li&gt;DevOps: The main source of feedback - self (tools used for monitoring)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Characteristics: Practices or Processes followed 

&lt;ul&gt;
&lt;li&gt;Agile: Practices like Agile Kanban, Scrum, etc., are followed.&lt;/li&gt;
&lt;li&gt;DevOps: Processes and practices like Continuous Development (CD), Continuous Integration (CI), etc., are followed.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Characteristics: Development Sprints or Release cycles

&lt;ul&gt;
&lt;li&gt;Agile: Release cycles are usually smaller.&lt;/li&gt;
&lt;li&gt;DevOps: Release cycles are smaller, along with immediate feedback.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Characteristics: Agility

&lt;ul&gt;
&lt;li&gt;Agile: Only development agility is present.&lt;/li&gt;
&lt;li&gt;DevOps: Both in operations and development, agility is followed.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Transform your DevOps career and learn the science of improving the operational and developmental activities by choosing our &lt;a href="https://www.simplilearn.com/pgp-devops-certification-training-course?source=GhPreviewCTAText" rel="noopener noreferrer"&gt;PGP in DevOps.&lt;/a&gt; Contact our admission counselor today and grab your seat!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  16. What are the anti-patterns of DevOps?
&lt;/h3&gt;

&lt;p&gt;Patterns are common practices that organizations usually follow. An anti-pattern is formed when an organization continues to follow a pattern adopted by others blindly but does not work for them. Some of the myths about DevOps include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Cannot perform DevOps → Have the wrong people&lt;/li&gt;
&lt;li&gt;  Developers do DevOps ⇒ Production Management&lt;/li&gt;
&lt;li&gt;  The solution to all the organization’s problems ⇒ DevOps&lt;/li&gt;
&lt;li&gt;  DevOps == Process &lt;/li&gt;
&lt;li&gt;  DevOps == Agile&lt;/li&gt;
&lt;li&gt;  Cannot perform DevOps → Organization is unique&lt;/li&gt;
&lt;li&gt;  A separate group needs to be made for DevOps&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  17. What are the benefits of using version control?
&lt;/h3&gt;

&lt;p&gt;Here are the benefits of using Version Control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  With the version control system (VCS), all team members are free to work on any file at any time. Later, VCS will allow the team to integrate all of the modifications into a single version.&lt;/li&gt;
&lt;li&gt;  The VCS asks us to provide a brief summary of what was changed every time we save a new version of the project. We also get to examine exactly what was modified in the file, allowing us to see who made what changes to the project.&lt;/li&gt;
&lt;li&gt;  Inside the VCS, all the previous variants and versions are properly stored. We can request any version at any moment and retrieve a snapshot of the entire project at our fingertips.&lt;/li&gt;
&lt;li&gt;  A distributed VCS, such as Git, lets all team members retrieve a complete history of the project. This allows developers or other stakeholders to use the local Git repositories of any of the teammates even if the main server goes down at any point.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  18. Describe the branching strategies you have used.
&lt;/h3&gt;

&lt;p&gt;This question is usually asked to test our knowledge of the purpose of branching and our experience of branching at a past job. &lt;/p&gt;

&lt;p&gt;Below topics can help in answering this DevOps interview question -&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Release branching - We can clone the develop branch to create a Release branch once it has enough functionality for a release. This branch kicks off the next release cycle; thus, no new features can be contributed beyond this point. The things that can be contributed are documentation generation, bug fixing, and other release-related tasks. The release is merged into the master and given a version number once it is ready to ship. It should also be merged into the development branch, which may have evolved since the initial release.&lt;/li&gt;
&lt;li&gt;  Feature branching - This branching model maintains all modifications for a specific feature contained within a branch. The branch gets merged into master once the feature has been completely tested and approved by using tests that are automated.&lt;/li&gt;
&lt;li&gt;  Task branching - In this branching model, every task is implemented in its respective branch. The task key is mentioned in the branch name. We need to simply look at the task key in the branch name to discover which code implements which task.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  19. Can you explain the “Shift left to reduce failure” concept in DevOps?
&lt;/h3&gt;

&lt;p&gt;Shift left is a DevOps idea for improving security, performance, and other factors. Let us take an example: if we look at all of the processes in DevOps, we can state that security is tested before the deployment step. By employing the left shift method, we can add security in the development phase, which is on the left. [will be depicted in a diagram] We can integrate with all phases, including before and during testing, not just development. This most likely raises the security level by detecting faults early.&lt;/p&gt;

&lt;h3&gt;
  
  
  20. What is the Blue/Green Deployment Pattern?
&lt;/h3&gt;

&lt;p&gt;This is a method of continuous deployment commonly used to reduce downtime. Traffic is transferred from one instance to another. To include a fresh version of the code, we must replace the old code with a new version. &lt;/p&gt;

&lt;p&gt;The new version exists in a green environment, and the old one in a blue environment. After making changes to the previous version, we need a new instance from the old one to execute a newer version of the instance.&lt;/p&gt;

&lt;h3&gt;
  
  
  21. What is Continuous Testing?
&lt;/h3&gt;

&lt;p&gt;Continuous Testing constitutes automated tests as part of the software delivery pipeline to provide instant feedback on the business risks present in the most recent release. To prevent problems in step-switching in the Software delivery life-cycle and to allow Development teams to receive immediate feedback, every build is continually tested in this manner. This results in a significant increase in a developer's productivity speed as it eliminates the requirement for re-running all the tests after each update and project re-building.&lt;/p&gt;

&lt;h3&gt;
  
  
  22. What is Automation Testing?
&lt;/h3&gt;

&lt;p&gt;Test automation or manual testing Automation is the process of automating a manual procedure to test an application or system. It entails using independent testing tools to develop test scripts that can be run repeatedly without the need for human interaction.&lt;/p&gt;

&lt;h3&gt;
  
  
  23. What are the benefits of Automation Testing?
&lt;/h3&gt;

&lt;p&gt;Some of the advantages of Automation Testing are -&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Helps to save money and time.&lt;/li&gt;
&lt;li&gt;  Unattended execution can be easily done.&lt;/li&gt;
&lt;li&gt;  Huge test matrices can be easily tested.&lt;/li&gt;
&lt;li&gt;  Parallel execution is enabled.&lt;/li&gt;
&lt;li&gt;  Reduced human-generated errors, which results in improved accuracy.&lt;/li&gt;
&lt;li&gt;  Repeated test tasks execution is supported.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  24. How to automate Testing in the DevOps lifecycle?
&lt;/h3&gt;

&lt;p&gt;Developers are obliged to commit all source code changes to a shared DevOps repository.&lt;/p&gt;

&lt;p&gt;Every time a change is made in the code, Jenkins-like Continuous Integration tools will grab it from this common repository and deploy it for Continuous Testing, which is done by tools like Selenium.&lt;/p&gt;

&lt;h3&gt;
  
  
  25. Why is Continuous Testing important for DevOps?
&lt;/h3&gt;

&lt;p&gt;Continuous testing allows for immediate testing of any code modification. This prevents concerns like quality issues and release delays that might occur whenever big-bang testing is delayed until the end of the cycle. In this way, Continuous Testing allows for high-quality and more frequent releases.&lt;/p&gt;

&lt;h3&gt;
  
  
  26. What are the key elements of Continuous Testing tools?
&lt;/h3&gt;

&lt;p&gt;Continuous Testing key elements are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Test Optimization: It guarantees that tests produce reliable results and actionable information. Test Data Management, Test Optimization Management, and Test Maintenance are examples of aspects.&lt;/li&gt;
&lt;li&gt;  Advanced Analysis: To avoid problems and achieve more within each iteration, it employs automation in areas like scope assessment/prioritization, change effect analysis, and static code analysis.&lt;/li&gt;
&lt;li&gt;  Policy Analysis: It guarantees that all processes align with the organization's changing business needs and that all compliance requirements are met.&lt;/li&gt;
&lt;li&gt;  Risk Assessment: Test coverage optimization, technical debt, risk mitigation duties, and quality evaluation are all covered to guarantee the build is ready to move on to the next stage.&lt;/li&gt;
&lt;li&gt;  Service Virtualization: Ensures that real-world testing scenarios are available. Service visualisation provides access to a virtual representation of the needed testing phases, ensuring its availability and reducing the time spent setting up the test environment.&lt;/li&gt;
&lt;li&gt;  Requirements Traceability: It guarantees that no rework is necessary and that real criteria are met. An object evaluation is used to determine which needs require additional validation, are in jeopardy and are performing as expected.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  DevOps Interview Questions for Source Code Management: Git
&lt;/h2&gt;

&lt;h3&gt;
  
  
  27. Explain the difference between a centralized and distributed version control system (VCS).
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Centralized Version Control System
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  All file versions are stored on a central server&lt;/li&gt;
&lt;li&gt;  No developer has a copy of all files on a local system&lt;/li&gt;
&lt;li&gt;  If the central server crashes, all data from the project will be lost&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h4&gt;
  
  
  Distributed Control System
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  Every developer has a copy of all versions of the code on their systems&lt;/li&gt;
&lt;li&gt;  Enables team members to work offline and does not rely on a single location for backups&lt;/li&gt;
&lt;li&gt;  There is no threat, even if the server crashes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  28. What is the git command that downloads any repository from GitHub to your computer?
&lt;/h3&gt;

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

&lt;p&gt;The &lt;a href="https://www.simplilearn.com/tutorials/git-tutorial/git-commands" rel="noopener noreferrer"&gt;git command&lt;/a&gt; that downloads any repository from GitHub to your computer is git clone.&lt;/p&gt;

&lt;h3&gt;
  
  
  29. How do you push a file from your local system to the GitHub repository using Git?
&lt;/h3&gt;

&lt;p&gt;First, connect the local repository to your remote repository:&lt;/p&gt;

&lt;p&gt;git remote add origin [copied web address]      &lt;/p&gt;

&lt;p&gt;// Ex: git remote add origin &lt;a href="https://github.com/Simplilearn-github/test.git" rel="noopener noreferrer"&gt;https://github.com/Simplilearn-github/test.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Second, push your file to the remote repository:&lt;/p&gt;

&lt;p&gt;git push origin master&lt;/p&gt;

&lt;h3&gt;
  
  
  30. How is a bare repository different from the standard way of initializing a Git repository?
&lt;/h3&gt;

&lt;p&gt;Using the standard method:&lt;/p&gt;

&lt;h4&gt;
  
  
  git init
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  You create a working directory with git init&lt;/li&gt;
&lt;li&gt;  A .git subfolder is created with all the git-related revision history&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using the bare way&lt;/p&gt;

&lt;h4&gt;
  
  
  git init --bare
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  It does not contain any working or checked out a copy of source files&lt;/li&gt;
&lt;li&gt;  Bare repositories store git revision history in the root folder of your repository, instead of the .git subfolder&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  31. Which of the following CLI commands can be used to rename files?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; git rm&lt;/li&gt;
&lt;li&gt; git mv&lt;/li&gt;
&lt;li&gt; git rm -r&lt;/li&gt;
&lt;li&gt; None of the above&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The correct answer is B) git mv&lt;/p&gt;

&lt;h3&gt;
  
  
  32. What is the process for reverting a commit that has already been pushed and made public?
&lt;/h3&gt;

&lt;p&gt;There are two ways that you can revert a commit: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Remove or fix the bad file in a new commit and push it to the remote repository. Then commit it to the remote repository using:
git commit –m "commit message"&lt;/li&gt;
&lt;li&gt; Create a new commit that undoes all the changes that were made in the bad commit. Use the following command:
git revert &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example: git revert 56de0938f&lt;/p&gt;

&lt;h3&gt;
  
  
  33. Explain the difference between git fetch and git pull.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Git fetch: Git fetch only downloads new data from a remote repository

&lt;ul&gt;
&lt;li&gt;Git pull: Git pull updates the current HEAD branch with the latest changes from the remote server&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Git fetch: Does not integrate any new data into your working files

&lt;ul&gt;
&lt;li&gt;Git pull: Downloads new data and integrate it with the current working files&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Git fetch: Users can run a Git fetch at any time to update the remote-tracking branches

&lt;ul&gt;
&lt;li&gt;Git pull: Tries to merge remote changes with your local ones&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Git fetch: Command - git fetch origin                  git fetch –-all

&lt;ul&gt;
&lt;li&gt;Git pull: Command - git pull origin master&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  34. What is Git stash?
&lt;/h3&gt;

&lt;p&gt;A developer working with a current branch wants to switch to another branch to work on something else, but the developer doesn't want to commit changes to your unfinished work. The solution to this issue is Git stash. Git stash takes your modified tracked files and saves them on a stack of unfinished changes that you can reapply at any time.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  35. Explain the concept of branching in Git.
&lt;/h3&gt;

&lt;p&gt;Suppose you are working on an application, and you want to add a new feature to the app. You can create a new branch and build the new feature on that branch.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  By default, you always work on the master branch&lt;/li&gt;
&lt;li&gt;  The circles on the branch represent various commits made on the branch&lt;/li&gt;
&lt;li&gt;  After you are done with all the changes, you can merge it with the master branch&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  36. What is the difference between Git Merge and Git Rebase?
&lt;/h3&gt;

&lt;p&gt;Suppose you are working on a new feature in a dedicated branch, and another team member updates the master branch with new commits. You can use these two functions:&lt;/p&gt;

&lt;h4&gt;
  
  
  Git Merge
&lt;/h4&gt;

&lt;p&gt;To incorporate the new commits into your feature branch, use Git merge.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Creates an extra merge commit every time you need to incorporate changes&lt;/li&gt;
&lt;li&gt;  But, it pollutes your feature branch history&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h4&gt;
  
  
  Git Rebase
&lt;/h4&gt;

&lt;p&gt;As an alternative to merging, you can rebase the feature branch on to master.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Incorporates all the new commits in the master branch&lt;/li&gt;
&lt;li&gt;  It creates new commits for every commit in the original branch and rewrites project history&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  37. How do you find a list of files that have been changed in a particular commit?
&lt;/h3&gt;

&lt;p&gt;The command to get a list of files that have been changed in a particular commit is:&lt;/p&gt;

&lt;p&gt;git diff-tree –r {commit hash}&lt;/p&gt;

&lt;p&gt;Example: git diff-tree –r 87e673f21b&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  -r flag instructs the command to list individual files&lt;/li&gt;
&lt;li&gt;  commit hash will list all the files that were changed or added in that commit&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  38. What is a merge conflict in Git, and how can it be resolved?
&lt;/h3&gt;

&lt;p&gt;A &lt;a href="https://www.simplilearn.com/tutorials/git-tutorial/merge-conflicts-in-git" rel="noopener noreferrer"&gt;Git merge conflict&lt;/a&gt; happens when merge branches compete for commits, and Git needs your help deciding which changes to incorporate in the final merge.&lt;/p&gt;

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

&lt;p&gt;Manually edit the conflicted file to select the changes you want to keep in the final merge.&lt;/p&gt;

&lt;p&gt;Resolve using GitHub conflict editor&lt;/p&gt;

&lt;p&gt;This is done when a merge conflict occurs after competing for line changes. For example, it may occur when people make different changes to the same line of the same file on different branches in your Git repository.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Resolving a merge conflict using conflict editor:&lt;/li&gt;
&lt;li&gt;  Under your repository name, click "Pull requests."&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;  In the "Pull requests" drop-down, click the pull request with a merge conflict that you'd like to resolve&lt;/li&gt;
&lt;li&gt;  Near the bottom of your pull request, click "Resolve conflicts."&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;  Decide if you want to keep only your branch's changes, the other branch's changes, or make a brand new change that may incorporate changes from both branches.&lt;/li&gt;
&lt;li&gt;  Delete the conflict markers &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;, =======, &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; and make the changes you want in the final merge.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;  If you have more than one merge conflict in your file, scroll down to the next set of conflict markers and repeat steps four and five to resolve your merge conflict.&lt;/li&gt;
&lt;li&gt;  Once you have resolved all the conflicts in the file, click Mark as resolved.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;  If you have more than one file with a conflict, select the next file you want to edit on the left side of the page under "conflicting files" and repeat steps four to seven until you've resolved all of your pull request's merge conflicts.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;  Once you've resolved your merge conflicts, click Commit merge. This merges the entire base branch into your head branch.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;  To merge your pull request, click Merge pull request.&lt;/li&gt;
&lt;li&gt;  A merge conflict is resolved using the command line.&lt;/li&gt;
&lt;li&gt;  Open Git Bash.&lt;/li&gt;
&lt;li&gt;  Navigate into the local Git repository that contains the merge conflict.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;  Generate a list of the files that the merge conflict affects. In this example, the file styleguide.md has a merge conflict.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;  Open any text editor, such as Sublime Text or Atom, and navigate to the file with merge conflicts.&lt;/li&gt;
&lt;li&gt;  To see the beginning of the merge conflict in your file, search the file for the conflict marker "&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;. " Open it, and you'll see the changes from the base branch after the line "&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD."&lt;/li&gt;
&lt;li&gt;  Next, you'll see "=======", which divides your changes from the changes in the other branch, followed by "&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; BRANCH-NAME".&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;  Decide if you only want to keep your branch's changes, the other branch's changes, or make a brand new change, which may incorporate changes from both branches.&lt;/li&gt;
&lt;li&gt;  Delete the conflict markers "&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;", "=======", "&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;" and make the changes you want in the final merge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;        In this example, both the changes are incorporated into the final merge:&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;  Add or stage your changes. &lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;  Commit your changes with a comment.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Now, you can merge the branches on the command line or push your changes to your remote repository on GitHub and merge them in a pull request.&lt;/p&gt;

&lt;h3&gt;
  
  
  39. What is Git bisect? How can you use it to determine the source of a (regression) bug?
&lt;/h3&gt;

&lt;p&gt;Git bisect is a tool that uses binary search to locate the commit that triggered a bug.&lt;/p&gt;

&lt;p&gt;Git bisect command -&lt;/p&gt;

&lt;p&gt;git bisect  &lt;/p&gt;

&lt;p&gt;The git bisect command is used in finding the bug performing a commit in the project by using a binary search algorithm.&lt;/p&gt;

&lt;p&gt;The bug-occurring commit is called the “bad” commit, and the commit before the bug occurs is called the “good” commit. We convey the same to the git bisect tool, and it picks a random commit between the two endpoints and prompts whether that one is the “good” or “bad” one. The process continues until the range is narrowed down and the exact commit that introduced the exact change is discovered.&lt;/p&gt;

&lt;h3&gt;
  
  
  40. Explain some basic Git commands.
&lt;/h3&gt;

&lt;p&gt;Some of the Basic Git Commands are summarized in the below table -&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Command: git init

&lt;ul&gt;
&lt;li&gt;Purpose: Used to start a new repository.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Command: git config:git config –global user.name “[name]”git config –global user.email “[email address]”

&lt;ul&gt;
&lt;li&gt;Purpose: This helps to set the username and email to whom the commits belong to.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Command: git clone 

&lt;ul&gt;
&lt;li&gt;Purpose: Used to create a local copy of an existing repository.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Command: git add:git add git add .

&lt;ul&gt;
&lt;li&gt;Purpose: Used to add one or more files to the staging area.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Command: git commit:git commit -a git commit -m “”

&lt;ul&gt;
&lt;li&gt;Purpose: Creates a snapshot or records of the file(s) that are in the staging area.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Command: git diff:git diff [first branch] [second branch]git diff -staged

&lt;ul&gt;
&lt;li&gt;Purpose: Used to show differences between the two mentioned branches/differences made in the files in the staging area vs current version.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Command: git status

&lt;ul&gt;
&lt;li&gt;Purpose: Lists out all the files that are to be committed.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Command: git rm 

&lt;ul&gt;
&lt;li&gt;Purpose: Used to delete a file(s) from the current working directory and also stages it.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Command: git show 

&lt;ul&gt;
&lt;li&gt;Purpose: Shows the content changes and metadata of the mentioned commit.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Command: git branch:git branch [branch name]git branch -d [branch name]git branch

&lt;ul&gt;
&lt;li&gt;Purpose: The first one creates a brand new branch.The second is used to delete the mentioned branch.The last one lists out all the branches available and also highlights the branch we are in currently.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  DevOps Interview Questions for Continuous Integration: Jenkins
&lt;/h2&gt;

&lt;h3&gt;
  
  
  41. Explain the master-slave architecture of Jenkins.
&lt;/h3&gt;

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

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.simplilearn.com/tutorials/jenkins-tutorial" rel="noopener noreferrer"&gt;Jenkins&lt;/a&gt; master pulls the code from the remote GitHub repository every time there is a code commit.&lt;/li&gt;
&lt;li&gt;  It distributes the workload to all the Jenkins slaves.&lt;/li&gt;
&lt;li&gt;  On request from the Jenkins master, the slaves carry out, builds, test, and produce test reports.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  42. What is Jenkinsfile?
&lt;/h3&gt;

&lt;p&gt;Jenkinsfile contains the definition of a Jenkins pipeline and is checked into the source control repository. It is a text file.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It allows code review and iteration on the pipeline.&lt;/li&gt;
&lt;li&gt;  It permits an audit trail for the pipeline.&lt;/li&gt;
&lt;li&gt;  There is a single source of truth for the pipeline, which can be viewed and edited.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  43. Which of the following commands runs Jenkins from the command line?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; java –jar Jenkins.war&lt;/li&gt;
&lt;li&gt; java –war Jenkins.jar&lt;/li&gt;
&lt;li&gt; java –jar Jenkins.jar&lt;/li&gt;
&lt;li&gt; java –war Jenkins.war&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The correct answer is A) java –jar Jenkins.war&lt;/p&gt;

&lt;h3&gt;
  
  
  44. What concepts are key aspects of the Jenkins pipeline?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Pipeline: User-defined model of a &lt;a href="https://www.simplilearn.com/tutorials/jenkins-tutorial/ci-cd-pipeline" rel="noopener noreferrer"&gt;CD pipeline&lt;/a&gt;. The pipeline's code defines the entire build process, which includes building, testing, and delivering an application&lt;/li&gt;
&lt;li&gt;  Node: A machine that is part of the Jenkins environment and capable of executing a pipeline&lt;/li&gt;
&lt;li&gt;  Step: A single task that tells Jenkins what to do at a particular point in time&lt;/li&gt;
&lt;li&gt;  Stage: Defines a conceptually distinct subset of tasks performed through the entire pipeline (build, test, deploy stages)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  45. Which file is used to define dependency in Maven?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; build.xml&lt;/li&gt;
&lt;li&gt; pom.xml&lt;/li&gt;
&lt;li&gt; dependency.xml&lt;/li&gt;
&lt;li&gt; Version.xml&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The correct answer is B) pom.xml&lt;/p&gt;

&lt;h3&gt;
  
  
  46. Explain the two types of pipelines in Jenkins, along with their syntax.
&lt;/h3&gt;

&lt;p&gt;Jenkins provides two ways of developing a pipeline code: Scripted and Declarative.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;   Scripted Pipeline: It is based on Groovy script as their Domain Specific Language. One or more node blocks do the core work throughout the entire pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Syntax:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Executes the pipeline or any of its stages on any available agent&lt;/li&gt;
&lt;li&gt; Defines the build stage&lt;/li&gt;
&lt;li&gt; Performs steps related to building stage&lt;/li&gt;
&lt;li&gt; Defines the test stage&lt;/li&gt;
&lt;li&gt; Performs steps related to the test stage&lt;/li&gt;
&lt;li&gt; Defines the deploy stage&lt;/li&gt;
&lt;li&gt; Performs steps related to the deploy stage&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;  Declarative Pipeline: It provides a simple and friendly syntax to define a pipeline. Here, the pipeline block defines the work done throughout the pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Syntax:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Executes the pipeline or any of its stages on any available agent&lt;/li&gt;
&lt;li&gt; Defines the build stage&lt;/li&gt;
&lt;li&gt; Performs steps related to building stage&lt;/li&gt;
&lt;li&gt; Defines the test stage&lt;/li&gt;
&lt;li&gt; Performs steps related to the test stage&lt;/li&gt;
&lt;li&gt; Defines the deploy stage&lt;/li&gt;
&lt;li&gt; Performs steps related to the deploy stage&lt;/li&gt;
&lt;/ol&gt;

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

&lt;h3&gt;
  
  
  47. How do you create a backup and copy files in Jenkins?
&lt;/h3&gt;

&lt;p&gt;In order to create a backup file, periodically back up your JENKINS_HOME directory.&lt;/p&gt;

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

&lt;p&gt;In order to create a backup of Jenkins setup, copy the JENKINS_HOME directory. You can also copy a job directory to clone or replicate a job or rename the directory.&lt;/p&gt;

&lt;h3&gt;
  
  
  48. How can you copy Jenkins from one server to another?
&lt;/h3&gt;

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

&lt;ul&gt;
&lt;li&gt;  Move the job from one Jenkins installation to another by copying the corresponding job directory.&lt;/li&gt;
&lt;li&gt;  Create a copy of an existing job by making a clone of a job directory with a different name.&lt;/li&gt;
&lt;li&gt;  Rename an existing job by renaming a directory.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  49. Name three security mechanisms Jenkins uses to authenticate users.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Jenkins uses an internal database to store user data and credentials.&lt;/li&gt;
&lt;li&gt;  Jenkins can use the Lightweight Directory Access Protocol (LDAP) server to authenticate users. &lt;/li&gt;
&lt;li&gt;  Jenkins can be configured to employ the authentication mechanism that the deployed application server uses. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  50. How is a custom build of a core plugin deployed?
&lt;/h3&gt;

&lt;p&gt;Steps to deploy a custom build of a core plugin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Copy the .hpi file to $JENKINS_HOME/plugins&lt;/li&gt;
&lt;li&gt;  Remove the plugin's development directory&lt;/li&gt;
&lt;li&gt;  Create an empty file called .hpi.pinned&lt;/li&gt;
&lt;li&gt;  Restart Jenkins and use your custom build of a core plugin&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  51. How can you temporarily turn off Jenkins security if the administrative users have locked themselves out of the admin console?
&lt;/h3&gt;

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

&lt;ul&gt;
&lt;li&gt;  When security is enabled, the Config file contains an &lt;a href="https://www.simplilearn.com/tutorials/programming-tutorial/what-is-xml" rel="noopener noreferrer"&gt;XML&lt;/a&gt; element named useSecurity that will be set to true.&lt;/li&gt;
&lt;li&gt;  By changing this setting to false, security will be disabled the next time Jenkins is restarted.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  52. What are the ways in which a build can be scheduled/run in Jenkins?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  By source code management commits.&lt;/li&gt;
&lt;li&gt;  After the completion of other builds.&lt;/li&gt;
&lt;li&gt;  Scheduled to run at a specified time.&lt;/li&gt;
&lt;li&gt;  Manual build requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  53. What are the commands that you can use to restart Jenkins manually?
&lt;/h3&gt;

&lt;p&gt;Two ways to manually restart Jenkins: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; (Jenkins_url)/restart            // Forces a restart without waiting for builds to complete                                &lt;/li&gt;
&lt;li&gt; (Jenkins_url)/safeRestart    // Allows all running builds to complete before it restarts   &lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  54. Explain how you can set up a Jenkins job?
&lt;/h3&gt;

&lt;p&gt;To create a Jenkins Job, we go to the top page of Jenkins, choose the New Job option and then select Build a free-style software project.&lt;/p&gt;

&lt;p&gt;The elements of this freestyle job are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Optional triggers for controlling when Jenkins builds.&lt;/li&gt;
&lt;li&gt;  Optional steps for gathering data from the build, like collecting javadoc, testing results and/or archiving artifacts.&lt;/li&gt;
&lt;li&gt;  A build script (ant, maven, shell script, batch file, etc.) that actually does the work.&lt;/li&gt;
&lt;li&gt;  Optional source code management system (SCM), like Subversion or CVS.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;DevOps Engineer is one of the top emerging jobs of this decade. Explore the endless opportunities and get hands-on experience of working on several projects by choosing our &lt;a href="https://www.simplilearn.com/devops-engineer-masters-program-certification-training?source=GhPreviewCTAText" rel="noopener noreferrer"&gt;DevOps Engineer Certification Course&lt;/a&gt;. Contact us and reserve your seat TODAY!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  DevOps Interview Questions for Continuous Testing: Selenium
&lt;/h2&gt;

&lt;h3&gt;
  
  
  55. What are the different Selenium components?
&lt;/h3&gt;

&lt;p&gt;Selenium has the following components:&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.simplilearn.com/tutorials/selenium-tutorial/selenium-ide" rel="noopener noreferrer"&gt;Selenium Integrated Development Environment (IDE)&lt;/a&gt; 
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  It has a simple framework and should be used for prototyping.&lt;/li&gt;
&lt;li&gt;  It has an easy-to-install Firefox plug-in.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Selenium Remote Control (RC)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  Testing framework for a developer to write code in any programming language (Java, PHP, Perl, C#, etc.).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.simplilearn.com/tutorials/selenium-tutorial/what-is-selenium-webdriver" rel="noopener noreferrer"&gt;Selenium WebDriver&lt;/a&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  Applies a better approach to automate browser activities.&lt;/li&gt;
&lt;li&gt;  It does not rely on JavaScript.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Selenium Grid
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  Works with Selenium RC and runs tests on different nodes using browsers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  56. What are the different exceptions in Selenium WebDriver?
&lt;/h3&gt;

&lt;p&gt;Exceptions are events that occur during the execution of a program and disrupt the normal flow of a program's instructions. Selenium has the following exceptions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  TimeoutException: It is thrown when a command performing an operation does not complete in the stipulated time.&lt;/li&gt;
&lt;li&gt;  NoSuchElementException: It is thrown when an element with specific attributes is not found on the web page.&lt;/li&gt;
&lt;li&gt;  ElementNotVisibleException: It is thrown when an element is present in Document Object Model (DOM) but is not visible. Ex: Hidden Elements defined in &lt;a href="https://www.simplilearn.com/tutorials/html-tutorial/what-is-html" rel="noopener noreferrer"&gt;HTML&lt;/a&gt; using type=“hidden”.&lt;/li&gt;
&lt;li&gt;  SessionNotFoundException: The WebDriver is performing the action immediately after quitting the browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  57. Can Selenium test an application on an Android browser?
&lt;/h3&gt;

&lt;p&gt;Selenium is capable of testing an application on an Android browser using an Android driver. You can use the Selendroid or Appium framework to test native apps or web apps in the Android browser. The following is a sample code:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  58. What are the different test types that Selenium supports? 
&lt;/h3&gt;

&lt;p&gt;Functional: This is a type of black-box testing in which the test cases are based on the software specification.&lt;/p&gt;

&lt;p&gt;Regression: This testing helps to find new errors, &lt;a href="https://www.simplilearn.com/regression-vs-classification-in-machine-learning-article" rel="noopener noreferrer"&gt;regressions&lt;/a&gt;, etc. in different functional and non-functional areas of code after the alteration. &lt;/p&gt;

&lt;p&gt;Load Testing: This testing seeks to monitor the response of a device after putting a load on it. It is carried out to study the behavior of the system under certain conditions.&lt;/p&gt;

&lt;h3&gt;
  
  
  59. How can you access the text of a web element?
&lt;/h3&gt;

&lt;p&gt;Get command is used to retrieve the text of a specified web element. The command does not return any parameter but returns a string value.&lt;/p&gt;

&lt;p&gt;Used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Verification of messages&lt;/li&gt;
&lt;li&gt;  Labels&lt;/li&gt;
&lt;li&gt;  Errors displayed on the web page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Syntax: &lt;/p&gt;

&lt;p&gt;String Text=driver.findElement(By.id(“text”)).getText();&lt;/p&gt;

&lt;h3&gt;
  
  
  60. How can you handle keyboard and mouse actions using Selenium?
&lt;/h3&gt;

&lt;p&gt;You can handle keyboard and mouse events with the advanced user interaction API. The advanced user interactions API contains actions and action classes.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method &lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;clickAndHold()&lt;/td&gt;
&lt;td&gt;Clicks without releasing the current mouse location &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dragAndDrop()&lt;/td&gt;
&lt;td&gt;Performs click-and-hold at the location of the source element &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;keyDown(modifier_key)&lt;/td&gt;
&lt;td&gt;Performs a modifier key press (ctrl, shift, Fn, etc.) &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;keyUp(modifier_key)&lt;/td&gt;
&lt;td&gt;Performs a key release&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  60. Which of these options is not a WebElement method?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; getText()&lt;/li&gt;
&lt;li&gt; size()&lt;/li&gt;
&lt;li&gt; getTagName()&lt;/li&gt;
&lt;li&gt; sendKeys()&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The correct answer is B) size()&lt;/p&gt;

&lt;h3&gt;
  
  
  61. When do we use findElement() and findElements()?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;   findElement()&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It finds the first element in the current web page that matches the specified locator value.&lt;/p&gt;

&lt;p&gt;Syntax:&lt;/p&gt;

&lt;p&gt;WebElement element=driver.findElements(By.xpath(“//div[&lt;a class="mentioned-user" href="https://dev.to/id"&gt;@id&lt;/a&gt;=‘example’]//ul//li”));&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;   findElements()&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It finds all the elements in the current web page that matches the specified locator value.&lt;/p&gt;

&lt;p&gt;Syntax:&lt;/p&gt;

&lt;p&gt;List elementList=driver.findElements(By.xpath(“//div[&lt;a class="mentioned-user" href="https://dev.to/id"&gt;@id&lt;/a&gt;=‘example’]//ul//li”));&lt;/p&gt;

&lt;h3&gt;
  
  
  62. What are driver.close() and driver.quit() in WebDriver?
&lt;/h3&gt;

&lt;p&gt;These are two different methods used to close the browser session in Selenium WebDriver:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  driver.close(): This is used to close the current browser window on which the focus is set. In this case, there is only one browser open.&lt;/li&gt;
&lt;li&gt;  driver.quit(): It closes all the browser windows and ends the WebDriver session using the driver.dispose method.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  63. How can you submit a form using Selenium?
&lt;/h3&gt;

&lt;p&gt;The following lines of code will let you submit a form using Selenium:&lt;/p&gt;

&lt;p&gt;WebElement el = driver.findElement(By.id(“ElementID”));&lt;/p&gt;

&lt;p&gt;el.submit();&lt;/p&gt;

&lt;h3&gt;
  
  
  64. What are the Testing types supported by Selenium?
&lt;/h3&gt;

&lt;p&gt;There are two types of testing that are primarily supported by Selenium:&lt;/p&gt;

&lt;p&gt;Functional Testing: Individual testing of software functional points or features.&lt;/p&gt;

&lt;p&gt;Regression Testing: Wherever a bug is fixed, a product is retested and this is called Regression Testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  65. What is Selenium IDE?
&lt;/h3&gt;

&lt;p&gt;Selenium integrated development environment (IDE)  is an all-in-one Selenium script development environment. It may be used to debug tests, alter and record and is also available as a Firefox extension. Selenium IDE comes with the whole Selenium Core that  allows us to rapidly and easily replay and record  tests in the exact environment where they will be conducted.&lt;/p&gt;

&lt;p&gt;Selenium IDE is the best environment for building Selenium tests, regardless of the style of testing we prefer, thanks to the ability to move instructions around rapidly and the autocomplete support.&lt;/p&gt;

&lt;h3&gt;
  
  
  66. What is the difference between Assert and Verify commands in Selenium?
&lt;/h3&gt;

&lt;p&gt;The difference between Verify and Assert commands in Selenium are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The verify commands determine whether or not the provided condition is true. The program execution does not halt regardless of whether the condition is true or not, i.e., all test steps will be completed, and verification failure will not stop the execution.&lt;/li&gt;
&lt;li&gt;  The assert command determines whether a condition is false or true. To know whether the supplied element is on the page or not, we do the following. The next test step will be performed by the program control, if the condition is true. However, no further tests will be run, and the execution will halt, if the condition is false.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  67. How to launch Browser using WebDriver?
&lt;/h3&gt;

&lt;p&gt;To launch Browser using WebDriver, following syntax is followed -&lt;/p&gt;

&lt;p&gt;WebDriver driver = new InternetExplorerDriver();&lt;/p&gt;

&lt;p&gt;WebDriver driver = new ChromeDriver();&lt;/p&gt;

&lt;p&gt;WebDriver driver = new FirefoxDriver();&lt;/p&gt;

&lt;h3&gt;
  
  
  68. What is the difference between Asset Management and Configuration Management?
&lt;/h3&gt;

&lt;p&gt;Differences between Configuration Management and Asset Management are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuration Management&lt;/th&gt;
&lt;th&gt;Asset Management&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Operational Relationships.&lt;/td&gt;
&lt;td&gt;Incidental relationships only.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintains troubleshooting data.&lt;/td&gt;
&lt;td&gt;Maintains taxes data.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Everything we deploy is scope.&lt;/td&gt;
&lt;td&gt;Everything we own is scope.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment to retirement - lifecycle.&lt;/td&gt;
&lt;td&gt;Purchase to disposal - lifecycle.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operations - main concern.&lt;/td&gt;
&lt;td&gt;Finances - main concern.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ITIL processes from interfacing.&lt;/td&gt;
&lt;td&gt;Leasing and purchasing from interfacing.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  DevOps Interview Questions for Configuration Management: Chef, Puppet, Ansible
&lt;/h2&gt;

&lt;h3&gt;
  
  
  69. Why are SSL certificates used in Chef?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  SSL certificates are used between the Chef server and the client to ensure that each node has access to the right data.&lt;/li&gt;
&lt;li&gt;  Every node has a private and public key pair. The public key is stored at the Chef server.&lt;/li&gt;
&lt;li&gt;  When an SSL certificate is sent to the server, it will contain the private key of the node.&lt;/li&gt;
&lt;li&gt;  The server compares this against the public key in order to identify the node and give the node access to the required data.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  70. Which of the following commands would you use to stop or disable the 'httpd' service when the system boots?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; # systemctl disable httpd.service&lt;/li&gt;
&lt;li&gt; # system disable httpd.service&lt;/li&gt;
&lt;li&gt; # system disable httpd&lt;/li&gt;
&lt;li&gt; # systemctl disable httpd.service&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The correct answer is A) # systemctl disable httpd.service&lt;/p&gt;

&lt;h3&gt;
  
  
  71. What is Test Kitchen in Chef?
&lt;/h3&gt;

&lt;p&gt;Test Kitchen is a command-line tool in Chef that spins up an instance and tests the cookbook on it before deploying it on the actual nodes.&lt;/p&gt;

&lt;p&gt;Here are the most commonly used kitchen commands:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  72. How does chef-apply differ from chef-client?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;chef-apply is run on the client system.&lt;/p&gt;

&lt;p&gt;chef-apply applies the recipe mentioned in the command on the client system.&lt;/p&gt;

&lt;p&gt;$ chef-apply recipe_name.rb&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;chef-client is also run on the client system.&lt;/p&gt;

&lt;p&gt;chef-client applies all the cookbooks in your server's run list to the client system.&lt;/p&gt;

&lt;p&gt;$ knife chef-client&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  73. What is the command to sign the requested certificates?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For Puppet version 2.7:&lt;/p&gt;

&lt;p&gt;# puppetca –sign hostname-of-agent&lt;/p&gt;

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

&lt;p&gt;# puppetca –sign ChefAgent&lt;/p&gt;

&lt;p&gt;# puppetca sign hostname-of-agent&lt;/p&gt;

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

&lt;p&gt;# puppetca sign ChefAgent&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For Puppet version 2.7:&lt;/p&gt;

&lt;p&gt;# puppetca –sign hostname-of-agent&lt;/p&gt;

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

&lt;p&gt;# puppetca –sign ChefAgent&lt;/p&gt;

&lt;p&gt;# puppetca sign hostname-of-agent&lt;/p&gt;

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

&lt;p&gt;# puppetca sign ChefAgent&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  74. Which open-source or community tools do you use to make Puppet more powerful?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Changes in the configuration are tracked using &lt;a href="https://www.simplilearn.com/tutorials/jira/what-is-jira-and-how-to-use-jira-testing-software" rel="noopener noreferrer"&gt;Jira&lt;/a&gt;, and further maintenance is done through internal procedures. &lt;/li&gt;
&lt;li&gt;  Version control takes the support of Git and Puppet's code manager app.&lt;/li&gt;
&lt;li&gt;  The changes are also passed through Jenkin's continuous integration pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  75. What are the resources in Puppet?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Resources are the basic units of any configuration management tool.&lt;/li&gt;
&lt;li&gt;  These are the features of a node, like its software packages or services.&lt;/li&gt;
&lt;li&gt;  A resource declaration, written in a catalog, describes the action to be performed on or with the resource.&lt;/li&gt;
&lt;li&gt;  When the catalog is executed, it sets the node to the desired state.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  76. What is a class in Puppet?
&lt;/h3&gt;

&lt;p&gt;Classes are named blocks in your manifest that configure various functionalities of the node, such as services, files, and packages.&lt;/p&gt;

&lt;p&gt;The classes are added to a node's catalog and are executed only when explicitly invoked.&lt;/p&gt;

&lt;p&gt;Class apache (String $version = ‘latest’) {&lt;/p&gt;

&lt;p&gt;package{&lt;/p&gt;

&lt;p&gt;‘httpd’: ensure =&amp;gt; $version,&lt;/p&gt;

&lt;p&gt;before =&amp;gt; File[‘/etc/httpd.conf’],}&lt;/p&gt;

&lt;h3&gt;
  
  
  77. What is an Ansible role?
&lt;/h3&gt;

&lt;p&gt;An &lt;a href="https://www.simplilearn.com/tutorials/ansible-tutorial/what-is-ansible" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt; role is an independent block of tasks, variables, files, and templates embedded inside a playbook.&lt;/p&gt;

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

&lt;p&gt;This playbook installs tomcat on node1.&lt;/p&gt;

&lt;h3&gt;
  
  
  78. When should I use '{{ }}'?
&lt;/h3&gt;

&lt;p&gt;Always use {{}} for variables, unless you have a conditional statement, such as "when: …". This is because conditional statements are run through Jinja, which resolves the expressions.&lt;/p&gt;

&lt;p&gt; For example:&lt;/p&gt;

&lt;p&gt;      echo “This prints the value of {{foo}}”&lt;/p&gt;

&lt;p&gt;      when : foo is defined&lt;/p&gt;

&lt;p&gt;Using brackets makes it simpler to distinguish between strings and undefined variables.&lt;/p&gt;

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

&lt;p&gt;This also ensures that Ansible doesn't recognize the line as a dictionary declaration.&lt;/p&gt;

&lt;h3&gt;
  
  
  79. What is the best way to make content reusable/redistributable?
&lt;/h3&gt;

&lt;p&gt;There are three ways to make content reusable or redistributable in Ansible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Roles are used to managing tasks in a playbook. They can be easily shared via Ansible Galaxy.&lt;/li&gt;
&lt;li&gt;  "include" is used to add a submodule or another file to a playbook. This means a code written once can be added to multiple playbooks.&lt;/li&gt;
&lt;li&gt;  "import" is an improvement of "include," which ensures that a file is added only once. This is helpful when a line is run recursively.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  80. How is Ansible different from Puppet?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ansible&lt;/th&gt;
&lt;th&gt;Puppet&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Easy agentless installation&lt;/td&gt;
&lt;td&gt;Agent-based installation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Based on Python&lt;/td&gt;
&lt;td&gt;Based on Ruby&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuration files are written in YAML&lt;/td&gt;
&lt;td&gt;Configuration files are written in DSL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No support for Windows&lt;/td&gt;
&lt;td&gt;Support for all popular OS's&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We will now look at some DevOps interview questions on contanerization.&lt;/p&gt;

&lt;h2&gt;
  
  
  DevOps Interview Questions on Containerization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  81. Explain the architecture of Docker.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.simplilearn.com/tutorials/docker-tutorial/what-is-docker" rel="noopener noreferrer"&gt;Docker&lt;/a&gt; uses a client-server architecture.&lt;/li&gt;
&lt;li&gt;  Docker Client is a service that runs a command. The command is translated using the REST API and is sent to the Docker Daemon (server). &lt;/li&gt;
&lt;li&gt;  Docker Daemon accepts the request and interacts with the operating system to build Docker images and run Docker containers.&lt;/li&gt;
&lt;li&gt;  A Docker image is a template of instructions, which is used to create containers.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.simplilearn.com/tutorials/docker-tutorial/what-is-docker-container" rel="noopener noreferrer"&gt;Docker container&lt;/a&gt; is an executable package of an application and its dependencies together.&lt;/li&gt;
&lt;li&gt;  Docker registry is a service to host and distribute Docker images among users.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  82. What are the advantages of Docker over virtual machines?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Criteria: Memory space

&lt;ul&gt;
&lt;li&gt;Virtual Machine : Occupies a lot of memory space&lt;/li&gt;
&lt;li&gt;Docker: Docker containers occupy less space&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Criteria: Boot-up time

&lt;ul&gt;
&lt;li&gt;Virtual Machine : Long boot-up time&lt;/li&gt;
&lt;li&gt;Docker: Short boot-up time&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Criteria: Performance

&lt;ul&gt;
&lt;li&gt;Virtual Machine : Running multiple virtual machines leads to unstable performance &lt;/li&gt;
&lt;li&gt;Docker: Containers have a better performance, as they are hosted in a single Docker engine&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Criteria: Scaling

&lt;ul&gt;
&lt;li&gt;Virtual Machine : Difficult to scale up&lt;/li&gt;
&lt;li&gt;Docker: Easy to scale up&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Criteria: Efficiency

&lt;ul&gt;
&lt;li&gt;Virtual Machine : Low efficiency&lt;/li&gt;
&lt;li&gt;Docker: High efficiency&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Criteria: Portability

&lt;ul&gt;
&lt;li&gt;Virtual Machine : Compatibility issues while porting across different platforms&lt;/li&gt;
&lt;li&gt;Docker: Easily portable across different platforms&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Criteria: Space allocation

&lt;ul&gt;
&lt;li&gt;Virtual Machine : Data volumes cannot be shared&lt;/li&gt;
&lt;li&gt;Docker: Data volumes are shared and used again across multiple containers&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  83. How do we share Docker containers with different nodes?
&lt;/h3&gt;

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

&lt;ul&gt;
&lt;li&gt;  It is possible to share Docker containers on different nodes with &lt;a href="https://www.simplilearn.com/tutorials/docker-tutorial/docker-swarm" rel="noopener noreferrer"&gt;Docker Swarm&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  Docker Swarm is a tool that allows IT administrators and developers to create and manage a cluster of swarm nodes within the Docker platform.&lt;/li&gt;
&lt;li&gt;  A swarm consists of two types of nodes: a manager node and a worker node.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  84. What are the commands used to create a Docker swarm?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a swarm where you want to run your manager node.&lt;/p&gt;

&lt;p&gt;Docker swarm init --advertise-addr  &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once you've created a swarm on your manager node, you can add worker nodes to your swarm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When a node is initialized as a manager, it immediately creates a token. In order to create a worker node, the following command (token) should be executed on the host machine of a worker node.&lt;/p&gt;

&lt;p&gt;docker swarm join \ --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \ 192.168.99.100:2377&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  85. How do you run multiple containers using a single service?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  It is possible to run multiple containers as a single service with Docker Compose.&lt;/li&gt;
&lt;li&gt;  Here, each container runs in isolation but can interact with each other.&lt;/li&gt;
&lt;li&gt;  All Docker Compose files are YAML files.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  86. What is a Dockerfile used for?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  A Dockerfile is used for creating Docker images using the build command.&lt;/li&gt;
&lt;li&gt;  With a Docker image, any user can run the code to create Docker containers.&lt;/li&gt;
&lt;li&gt;  Once a Docker image is built, it's uploaded in a Docker registry.&lt;/li&gt;
&lt;li&gt;  From the Docker registry, users can get the Docker image and build new containers whenever they want.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  87. Explain the differences between Docker images and Docker containers.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Docker Images : Docker images are templates of Docker containers

&lt;ul&gt;
&lt;li&gt;Docker Container: Containers are runtime instances of a Docker image&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Docker Images : An image is built using a Dockerfile

&lt;ul&gt;
&lt;li&gt;Docker Container: Containers are created using Docker images&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Docker Images : It is stored in a Docker repository or a Docker hub

&lt;ul&gt;
&lt;li&gt;Docker Container: They are stored in the Docker daemon&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Docker Images : The image layer is a read-only filesystem

&lt;ul&gt;
&lt;li&gt;Docker Container: Every container layer is a read-write filesystem&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  88. Instead of YAML, what can you use as an alternate file for building Docker compose?
&lt;/h3&gt;

&lt;p&gt;To build a Docker compose, a user can use a JSON file instead of YAML. In case a user wants to use a JSON file, he/she should specify the filename as given:&lt;/p&gt;

&lt;p&gt;Docker-compose -f Docker-compose.json up&lt;/p&gt;

&lt;h3&gt;
  
  
  89. How do you create a Docker container?
&lt;/h3&gt;

&lt;p&gt;Task: Create a MySQL Docker container &lt;/p&gt;

&lt;p&gt;A user can either build a Docker image or pull an existing Docker image (like MySQL) from Docker Hub.&lt;/p&gt;

&lt;p&gt;Now, Docker creates a new container MySQL from the existing Docker image. Simultaneously, the container layer of the read-write filesystem is also created on top of the image layer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Command to create a Docker container: Docker run -t –i MySQL &lt;/li&gt;
&lt;li&gt;  Command to list down the running containers: Docker ps&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  90. What is the difference between a registry and a repository?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Registry: A Docker registry is an open-source server-side service used for hosting and distributing Docker images

&lt;ul&gt;
&lt;li&gt;Repository: The repository is a collection of multiple versions of Docker images &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Registry: In a registry, a user can distinguish between Docker images with their tag names

&lt;ul&gt;
&lt;li&gt;Repository: It is stored in a Docker registry &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Registry: Docker also has its own default registry called Docker Hub

&lt;ul&gt;
&lt;li&gt;Repository: It has two types: public and private repositories&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  91. What are the cloud platforms that support Docker?
&lt;/h3&gt;

&lt;p&gt;The following are the cloud platforms that Docker runs on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.simplilearn.com/tutorials/aws-tutorial/what-is-aws" rel="noopener noreferrer"&gt;Amazon Web Services&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.simplilearn.com/tutorials/azure-tutorial/what-is-azure" rel="noopener noreferrer"&gt;Microsoft Azure&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Google Cloud Platform&lt;/li&gt;
&lt;li&gt;  Rackspace&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  92. What is the purpose of the expose and publish commands in Docker?
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Expose
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  Expose is an instruction used in Dockerfile.&lt;/li&gt;
&lt;li&gt;  It is used to expose ports within a Docker network.&lt;/li&gt;
&lt;li&gt;  It is a documenting instruction used at the time of building an image and running a container.&lt;/li&gt;
&lt;li&gt;  Expose is the command used in Docker.&lt;/li&gt;
&lt;li&gt;  Example: Expose 8080&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Publish
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  Publish is used in a Docker run command.&lt;/li&gt;
&lt;li&gt;  It can be used outside a Docker environment.&lt;/li&gt;
&lt;li&gt;  It is used to map a host port to a running container port.&lt;/li&gt;
&lt;li&gt;  --publish or –p is the command used in Docker.&lt;/li&gt;
&lt;li&gt;  Example: docker run –d –p 0.0.0.80:80&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, let's have a look at the DevOps interview questions for continuous monitoring.&lt;/p&gt;

&lt;h2&gt;
  
  
  DevOps Interview Questions for Continuous Monitoring
&lt;/h2&gt;

&lt;h3&gt;
  
  
  93. How does Nagios help in the continuous monitoring of systems, applications, and services?
&lt;/h3&gt;

&lt;p&gt;Nagios enables server monitoring and the ability to check if they are sufficiently utilized or if any task failures need to be addressed. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Verifies the status of the servers and services&lt;/li&gt;
&lt;li&gt;  Inspects the health of your infrastructure&lt;/li&gt;
&lt;li&gt;  Checks if applications are working correctly and web servers are reachable&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  94. How does Nagios help in the continuous monitoring of systems, applications, and services?
&lt;/h3&gt;

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

&lt;h3&gt;
  
  
  95. What do you mean by Nagios Remote Plugin Executor (NPRE) of Nagios?
&lt;/h3&gt;

&lt;p&gt;Nagios Remote Plugin Executor (NPRE) enables you to execute Nagios plugins on Linux/Unix machines. You can monitor remote machine metrics (disk usage, CPU load, etc.)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The check_npre plugin that resides on the local monitoring machine&lt;/li&gt;
&lt;li&gt;  The NPRE daemon that runs on the remote Linux/Unix machine&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;With diverse real-life projects and masterclasses from Caltech CTME faculty, this &lt;a href="https://www.simplilearn.com/pgp-devops-certification-training-course?source=GhPreviewCTAText" rel="noopener noreferrer"&gt;Post Graduate Program in DevOps&lt;/a&gt; can help you accelerate your DevOps career in just 9 months. Enroll today for a life-changing experience!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  96. What are the port numbers that Nagios uses for monitoring purposes?
&lt;/h3&gt;

&lt;p&gt;Usually, Nagios uses the following port numbers for monitoring:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  97. What are active and passive checks in Nagios?
&lt;/h3&gt;

&lt;p&gt;Nagios is capable of monitoring hosts and services in two ways:&lt;/p&gt;

&lt;h4&gt;
  
  
  Actively
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  Active checks are initiated as a result of the Nagios process&lt;/li&gt;
&lt;li&gt;  Active checks are regularly scheduled&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Passively
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  Passive checks are initiated and performed through external applications/processes&lt;/li&gt;
&lt;li&gt;  Passive checks results are submitted to Nagios for processing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  98. What are active and passive checks in Nagios?
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Active Checks:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  The check logic in the Nagios daemon initiates active checks.&lt;/li&gt;
&lt;li&gt;  Nagios will execute a plugin and pass the information on what needs to be checked.&lt;/li&gt;
&lt;li&gt;  The plugin will then check the operational state of the host or service, and report results back to the Nagios daemon.&lt;/li&gt;
&lt;li&gt;  It will process the results of the host or service check and send notifications.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h4&gt;
  
  
  Passive Checks:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  In passive checks, an external application checks the status of a host or service.&lt;/li&gt;
&lt;li&gt;  It writes the results of the check to the external command file.&lt;/li&gt;
&lt;li&gt;  Nagios reads the external command file and places the results of all passive checks into a queue for later processing.&lt;/li&gt;
&lt;li&gt;  Nagios may send out notifications, log alerts, etc. depending on the check result information.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  99. Explain the main configuration file and its location in Nagios.
&lt;/h3&gt;

&lt;p&gt;The main configuration file consists of several directives that affect how Nagios operates. The Nagios process and the CGIs read the config file.&lt;/p&gt;

&lt;p&gt;A sample main configuration file will be placed into your settings directory:&lt;/p&gt;

&lt;p&gt;/usr/local/Nagios/etc/resource.cfg&lt;/p&gt;

&lt;h3&gt;
  
  
  100. What is the Nagios Network Analyzer?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  It provides an in-depth look at all network traffic sources and security threats.&lt;/li&gt;
&lt;li&gt;  It provides a central view of your network traffic and bandwidth data.&lt;/li&gt;
&lt;li&gt;  It allows system admins to gather high-level information on the health of the network.&lt;/li&gt;
&lt;li&gt;  It enables you to be proactive in resolving outages, abnormal behavior, and threats before they affect critical business processes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  101. What are the benefits of HTTP and SSL certificate monitoring with Nagios?
&lt;/h3&gt;

&lt;h4&gt;
  
  
  HTTP Certificate Monitoring
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  Increased server, services, and application availability.&lt;/li&gt;
&lt;li&gt;  Fast detection of network outages and protocol failures.&lt;/li&gt;
&lt;li&gt;  Enables web transaction and web server performance monitoring.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  SSL Certificate Monitoring
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  Increased website availability.&lt;/li&gt;
&lt;li&gt;  Frequent application availability.&lt;/li&gt;
&lt;li&gt;  It provides increased security.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  102. Explain virtualization with Nagios.
&lt;/h3&gt;

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

&lt;p&gt;Nagios can run on different virtualization platforms, like VMware, Microsoft Visual PC, Xen, Amazon EC2, etc.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Provides the capability to monitor an assortment of metrics on different platforms&lt;/li&gt;
&lt;li&gt;  Ensures quick detection of service and application failures&lt;/li&gt;
&lt;li&gt;  Has the ability to monitor the following metrics:&lt;/li&gt;
&lt;li&gt;  CPU Usage&lt;/li&gt;
&lt;li&gt;  Memory&lt;/li&gt;
&lt;li&gt;  Networking&lt;/li&gt;
&lt;li&gt;  VM status&lt;/li&gt;
&lt;li&gt;  Reduced administrative overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  103. Name the three variables that affect recursion and inheritance in Nagios.
&lt;/h3&gt;

&lt;p&gt;Name: Template name that can be referenced in other object definitions so it can inherit the object's properties/variables.&lt;/p&gt;

&lt;p&gt;Use: Here, you specify the name of the template object that you&lt;/p&gt;

&lt;p&gt;want to inherit properties/variables from.&lt;/p&gt;

&lt;p&gt;register: This variable indicates whether or not the object definition&lt;/p&gt;

&lt;p&gt;should be registered with Nagios.&lt;/p&gt;

&lt;p&gt;define someobjecttype{&lt;/p&gt;

&lt;p&gt;              object-specific variables ….&lt;/p&gt;

&lt;p&gt;              name template_name&lt;/p&gt;

&lt;p&gt;              use name_of_template&lt;/p&gt;

&lt;p&gt;              register [0/1]&lt;/p&gt;

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

&lt;h3&gt;
  
  
  104. Why is Nagios said to be object-oriented?
&lt;/h3&gt;

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

&lt;p&gt;Using the object configuration format, you can create object definitions that inherit properties from other object definitions. Hence, Nagios is known as object-oriented.&lt;/p&gt;

&lt;p&gt;Types of Objects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Services&lt;/li&gt;
&lt;li&gt;  Hosts&lt;/li&gt;
&lt;li&gt;  Commands&lt;/li&gt;
&lt;li&gt;  Time Periods&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  105. Explain what state stalking is in Nagios.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  State stalking is used for logging purposes in Nagios.&lt;/li&gt;
&lt;li&gt;  When stalking is enabled for a particular host or service, Nagios will watch that host or service very carefully.&lt;/li&gt;
&lt;li&gt;  It will log any changes it sees in the output of check results.&lt;/li&gt;
&lt;li&gt;  This helps in the analysis of log files.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Version Control System Interview Questions
&lt;/h2&gt;

&lt;p&gt;Here are some common interview questions and answers related to version control systems:&lt;/p&gt;

&lt;h3&gt;
  
  
  106. What is a version control system (VCS)?
&lt;/h3&gt;

&lt;p&gt;A &lt;a href="https://www.simplilearn.com/tutorials/devops-tutorial/version-control" rel="noopener noreferrer"&gt;VCS&lt;/a&gt; is a software tool that allows developers to manage changes to the source code of a software project. It enables developers to track and manage different versions of code files, collaborate with others, and revert to earlier versions if necessary.&lt;/p&gt;

&lt;h3&gt;
  
  
  107. What are the benefits of using a VCS?
&lt;/h3&gt;

&lt;p&gt;There are several benefits to using a VCS, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The ability to track changes to code over time&lt;/li&gt;
&lt;li&gt;  The ability to collaborate with other developers and share code&lt;/li&gt;
&lt;li&gt;  The ability to revert to earlier versions of code if necessary&lt;/li&gt;
&lt;li&gt;  The ability to branch code and work on different features or fixes simultaneously&lt;/li&gt;
&lt;li&gt;  The ability to merge changes from other branches or contributors&lt;/li&gt;
&lt;li&gt;  Increased confidence and control over code changes and deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  108. What are the types of VCS?
&lt;/h3&gt;

&lt;p&gt;There are two main types of VCS: centralized and distributed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Centralized VCS: A centralized VCS has a single central repository that stores all versions of the code files. Developers check out files from the central repository, make changes, and then commit the changes back to the warehouse.&lt;/li&gt;
&lt;li&gt;  Distributed VCS: A distributed VCS allows developers to create their local repositories of code changes. Developers can work on code changes locally, commit changes to their local storage, and then push changes to a central repository or pull changes from other contributors.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  109. What is the difference between Git and SVN?
&lt;/h3&gt;

&lt;p&gt;Git and SVN are both popular VCS tools, but they have some key differences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Git is a distributed VCS, while SVN is a centralized VCS.&lt;/li&gt;
&lt;li&gt;  Git is more flexible and allows easier branching and merging of code changes.&lt;/li&gt;
&lt;li&gt;  SVN has better support for handling binary files.&lt;/li&gt;
&lt;li&gt;  Git is generally considered faster than SVN.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Virtualization Interview Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  110. What is virtualization?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.simplilearn.com/virtualization-in-cloud-computing-article" rel="noopener noreferrer"&gt;Virtualization&lt;/a&gt; is a technology that allows multiple operating systems or applications to run on a single physical server or computer. It creates virtual instances of hardware resources such as CPU, memory, and storage, which can be allocated to different virtual machines.&lt;/p&gt;

&lt;h3&gt;
  
  
  111. What are the benefits of virtualization?
&lt;/h3&gt;

&lt;p&gt;There are several benefits of virtualization, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Reduced hardware costs&lt;/li&gt;
&lt;li&gt;  Increased efficiency and utilization of resources&lt;/li&gt;
&lt;li&gt;  Improved scalability and flexibility&lt;/li&gt;
&lt;li&gt;  Increased reliability and availability of applications&lt;/li&gt;
&lt;li&gt;  Simplified management and administration of IT infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  112. What are the different types of virtualization?
&lt;/h3&gt;

&lt;p&gt;There are several types of virtualization, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Server virtualization: Running multiple operating systems on a single physical server.&lt;/li&gt;
&lt;li&gt;  Network virtualization: Creating virtual networks that operate independently of physical network infrastructure.&lt;/li&gt;
&lt;li&gt;  Storage virtualization: Combining physical storage resources into a single virtual storage pool.&lt;/li&gt;
&lt;li&gt;  Desktop virtualization: Running multiple desktop environments on a single physical machine.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  113. What is a hypervisor?
&lt;/h3&gt;

&lt;p&gt;A hypervisor is a layer of software that enables virtualization by allowing multiple virtual machines to share a single physical server or computer. It manages the allocation of hardware resources to each virtual machine and isolates each virtual machine from the others.&lt;/p&gt;

&lt;h2&gt;
  
  
  Most Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;There are some frequently asked questions related to DevOps virtualization:&lt;/p&gt;

&lt;h3&gt;
  
  
  114. What is virtualization, and how does it connect to DevOps?
&lt;/h3&gt;

&lt;p&gt;Virtualization is creating a virtual version of something, such as a server, storage device, or network. In &lt;a href="https://www.simplilearn.com/tutorials/devops-tutorial/what-is-devops" rel="noopener noreferrer"&gt;DevOps&lt;/a&gt;, virtualization allows teams to create and manage virtual environments that can be used for development, testing, and deployment. This can help improve efficiency, reduce costs, and enable greater flexibility and scalability.&lt;/p&gt;

&lt;h3&gt;
  
  
  115. What are the benefits of using virtualization in DevOps?
&lt;/h3&gt;

&lt;p&gt;Virtualization offers several benefits in a DevOps environment, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Improved efficiency: Virtualization allows for faster creation, deployment, and management of development and testing environments.&lt;/li&gt;
&lt;li&gt;  Greater scalability: Virtualization enables teams to quickly scale up or down their infrastructure as needed without requiring additional physical hardware.&lt;/li&gt;
&lt;li&gt;  Increased flexibility: Virtualization allows the creation of custom environments that can be easily modified and adapted to meet changing requirements.&lt;/li&gt;
&lt;li&gt;  Reduced costs: Virtualization can help reduce hardware costs and increase resource utilization, leading to lower overall infrastructure costs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  116. What are some standard virtualization technologies used in DevOps?
&lt;/h3&gt;

&lt;p&gt;Several virtualization technologies are commonly used in DevOps, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Virtual machines (VMs): VMs are created using virtualization software such as VMware or VirtualBox, which enables the creation of multiple virtual instances of an operating system on a single physical machine.&lt;/li&gt;
&lt;li&gt;  Containers: &lt;a href="https://www.simplilearn.com/tutorials/docker-tutorial/containers-in-devops" rel="noopener noreferrer"&gt;Containers&lt;/a&gt; are lightweight, portable virtual environments created using containerization software such as Docker or Kubernetes. Containers enable the creation of custom application environments that can be easily shared and deployed across different systems.&lt;/li&gt;
&lt;li&gt;  Cloud computing: Cloud computing providers such as Amazon Web Services (AWS), Microsoft Azure, and the Google Cloud Platform (GCP) offer virtualized infrastructure and services that can be easily managed and scaled using DevOps tools and practices.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;There you go; these are some of the most common DevOps interview questions you might encounter while attending an interview. As a DevOps Engineer, in-depth knowledge of processes, tools, and relevant technology is essential. These DevOps interview questions and answers will help you learn about some of these aspects. In addition, you must also have a holistic understanding of the products, services, and systems in place.&lt;/p&gt;

&lt;p&gt;As you can see, there is a lot to learn to be able to land a rewarding job in the field of DevOps—Git, Jenkins, Selenium, Chef, Puppet, Ansible, Docker, Nagios, and more. While this comprehensive DevOps interview question guide is designed to help you ace your next interview, you would undoubtedly perform better if you enroll in our comprehensive DevOps Engineer Training Course today. You can even check out our &lt;a href="https://www.simplilearn.com/pgp-devops-certification-training-course?source=GhPreviewCoursepages" rel="noopener noreferrer"&gt;Post Graduate Program in DevOps&lt;/a&gt; designed in collaboration with Caltech CTME that enables you to prepare for a DevOps career.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>webdev</category>
      <category>interview</category>
    </item>
    <item>
      <title>Mom, I'm scared ...</title>
      <dc:creator>Hoang Guruu</dc:creator>
      <pubDate>Wed, 05 Mar 2025 04:54:23 +0000</pubDate>
      <link>https://dev.to/aws-builders/mom-im-scared-192f</link>
      <guid>https://dev.to/aws-builders/mom-im-scared-192f</guid>
      <description>&lt;p&gt;&lt;strong&gt;Mom, I’m scared…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mom, I don’t know how to say this, but lately, I’ve been really worried. AI is getting so advanced. It can do almost everything—write, draw, code, and even create things that I once thought only humans could do.&lt;/p&gt;

&lt;p&gt;What I used to see only in sci-fi movies is now happening right in front of me. With just a few commands, AI can generate images that look completely real, write entire articles in seconds. It never gets tired, never complains, never makes mistakes, and works much faster than any human.&lt;/p&gt;

&lt;p&gt;Mom, do you remember when I used to joke that “robots only exist in movies” and that humans are irreplaceable? Now, I’m not so sure anymore. People are using AI to replace human jobs, and many careers might disappear. Not just physical labor, but even creative work is being taken over.&lt;/p&gt;

&lt;p&gt;I feel scared, confused, and uncertain about the future. What will happen next? Will I be left behind? Will there come a day when humans are no longer needed?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mom, I’m scared…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But then I remember… Is this the same feeling you had when you first used a smartphone?&lt;/p&gt;

&lt;p&gt;I remember how you used to say you didn’t know how to use it, that everything felt too complicated. You were afraid of pressing the wrong button, accidentally deleting a message, or getting lost in all the new apps while I kept explaining everything so quickly. You even said that back then, a simple phone with buttons was enough—why did things have to get so complicated now?&lt;/p&gt;

&lt;p&gt;But then, little by little, you learned. First, it was just making calls and sending texts. Then, you figured out how to send pictures, make video calls, even shop online and book rides. You took your time, but you didn’t reject it. Now, even though you still say you’re not great with technology, you’ve adapted because you see how useful it is.&lt;/p&gt;

&lt;p&gt;Mom, is my fear of AI the same as your fear of smartphones back then?&lt;/p&gt;

&lt;p&gt;AI can do so many things now that I’m afraid it might replace humans. But maybe, instead of being scared, I should approach it the way you approached your phone—slowly learning, figuring out how to control and use it.&lt;/p&gt;

&lt;p&gt;Maybe AI is just another tool, like all the tools that came before. People once feared that machines would take away jobs, but they learned how to work with them instead. Just like you no longer fear using a smartphone, I need to learn how to stop fearing AI.&lt;/p&gt;

&lt;p&gt;But Mom, if one day I get too overwhelmed by all this, will you be patient and explain things to me—just like I once did for you? Because no matter how advanced technology becomes, love and human understanding are things that AI will never replace.&lt;/p&gt;

&lt;p&gt;Your child.&lt;/p&gt;

</description>
      <category>futurechallenge</category>
      <category>ai</category>
    </item>
    <item>
      <title>MASTERING VIM – A DEVOPS ESSENTIAL!</title>
      <dc:creator>Hoang Guruu</dc:creator>
      <pubDate>Tue, 04 Mar 2025 02:56:56 +0000</pubDate>
      <link>https://dev.to/aws-builders/mastering-vim-a-devops-essential-5409</link>
      <guid>https://dev.to/aws-builders/mastering-vim-a-devops-essential-5409</guid>
      <description>&lt;p&gt;【 &lt;a href="https://www.youtube.com/@HoangGuruu" rel="noopener noreferrer"&gt;👨🏻‍💻 YouTube&lt;/a&gt; 】&lt;br&gt;
Watch more other contents related DevOps - AWS&lt;/p&gt;
&lt;h1&gt;
  
  
  Vim Cheat Sheet &amp;amp; Quick Reference
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Motion Diagrams
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;▼/▶ Cursor   ▽/▷ Target

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

&lt;/div&gt;

&lt;h4&gt;
  
  
  Left-right motions
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌───────────── |      
├───────────── 0      $ ──────────────┐ 
│  ┌────────── ^      fe ────────┐    │
│  │  ┌─────── Fo     te ───────┐│    │
│  │  │┌────── To     30| ───┐  ││    │
│  │  ││ ┌──── ge     w ───┐ │  ││    │
│  │  ││ │ ┌── b      e ─┐ │ │  ││    │
│  │  ││ │ │  ┌h      l┐ │ │ │  ││    │
▽  ▽  ▽▽ ▽ ▽  ▽▼      ▼▽ ▽ ▽ ▽  ▽▽    ▽
   echo "A cheatsheet from quickref.me"

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

&lt;/div&gt;

&lt;h4&gt;
  
  
  Up-down motions
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 - SCREEN 1 START
   ┌─┬─────────▷ #!/usr/bin/python
   │ │     ┌───▷     
   │ │     │     print("Hello")
   │ │     { } ▶ print("Vim")
   │ │       │   print("!")
   │ │       └─▷    
   │ │ ┌───┬───▷ print("Welcome")
G gg H M L k j ▶ print("to")
│        │   └─▷ print("quickref.me")
│        │       print("/vim")
│        │     
│        └─────▷ 
│                - SCREEN 1 END
└──────────────▷ print("SCREEN 2")

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

&lt;/div&gt;

&lt;h3&gt;
  
  
  Motions
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;h&lt;/td&gt;
&lt;td&gt;j&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; / &lt;/td&gt;
&lt;td&gt;Half-page up/down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; / &lt;/td&gt;
&lt;td&gt;Page up/down&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Words
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;b / w&lt;/td&gt;
&lt;td&gt;Previous/Next word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ge / e&lt;/td&gt;
&lt;td&gt;Previous/Next end of word&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Line
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0 (zero) / $&lt;/td&gt;
&lt;td&gt;Start/End of line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;^&lt;/td&gt;
&lt;td&gt;Start of line (non-blank)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Character
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fe / fe&lt;/td&gt;
&lt;td&gt;Move to previous/next e&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;To / to&lt;/td&gt;
&lt;td&gt;Move before/after previous/next o&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;/ n&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Document
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;gg / G&lt;/td&gt;
&lt;td&gt;First/Last line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:n&lt;/td&gt;
&lt;td&gt;nG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;} / {&lt;/td&gt;
&lt;td&gt;Next/Previous empty line&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Window
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;H / M / L&lt;/td&gt;
&lt;td&gt;Top/Middle/Bottom screen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zt / zz /  zb&lt;/td&gt;
&lt;td&gt;Top/Center/Bottom this line&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Insert Mode
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;i / a&lt;/td&gt;
&lt;td&gt;Insert before/after cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I / A&lt;/td&gt;
&lt;td&gt;Insert start/end of line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;o / O (letter)&lt;/td&gt;
&lt;td&gt;Insert new line below/above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;s / S&lt;/td&gt;
&lt;td&gt;Delete char/line and insert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C / cc&lt;/td&gt;
&lt;td&gt;Change to end of/current line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gi&lt;/td&gt;
&lt;td&gt;Insert at last insert point&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Esc&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Saving and Exiting
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;:w&lt;/td&gt;
&lt;td&gt;Save&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:q&lt;/td&gt;
&lt;td&gt;Close file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:wq&lt;/td&gt;
&lt;td&gt;:x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:wqa&lt;/td&gt;
&lt;td&gt;Save and quit all files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:q!&lt;/td&gt;
&lt;td&gt;ZQ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:qa&lt;/td&gt;
&lt;td&gt;Close all files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:qa!&lt;/td&gt;
&lt;td&gt;Force quit all files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:w now.txt&lt;/td&gt;
&lt;td&gt;Write to now.txt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:sav new.txt&lt;/td&gt;
&lt;td&gt;Save and edit new.txt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:w !sudo tee %&lt;/td&gt;
&lt;td&gt;Write to readonly file&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Normal Mode
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;r&lt;/td&gt;
&lt;td&gt;Replace one character&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;td&gt;Enter Replace mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;u / 3u&lt;/td&gt;
&lt;td&gt;Undo changes 1 / 3 times&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;U&lt;/td&gt;
&lt;td&gt;Undo changes on one line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;J&lt;/td&gt;
&lt;td&gt;Join with next line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; / 5 &lt;/td&gt;
&lt;td&gt;Redo changes 1 / 5 times&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Cut and paste
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;x&lt;/td&gt;
&lt;td&gt;Delete character (Cut)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;p / P&lt;/td&gt;
&lt;td&gt;Paste after/before&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;xp&lt;/td&gt;
&lt;td&gt;Swap two characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;Delete to end of line (Cut)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dw&lt;/td&gt;
&lt;td&gt;Delete word (Cut)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dd&lt;/td&gt;
&lt;td&gt;Delete line (Cut)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ddp&lt;/td&gt;
&lt;td&gt;Swap two lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;yy&lt;/td&gt;
&lt;td&gt;Yank line (Copy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"*p&lt;/td&gt;
&lt;td&gt;"+p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"*y&lt;/td&gt;
&lt;td&gt;"+y&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  In visual mode
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;s&lt;/td&gt;
&lt;td&gt;Replace selection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;y&lt;/td&gt;
&lt;td&gt;Yank selection (Copy)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Repeating
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;.&lt;/td&gt;
&lt;td&gt;Repeat last command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;;&lt;/td&gt;
&lt;td&gt;Repeat latest f, t, F or T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;,&lt;/td&gt;
&lt;td&gt;Repeat latest f, t, F or T reversed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;amp;&lt;/td&gt;
&lt;td&gt;Repeat last :s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;@:&lt;/td&gt;
&lt;td&gt;Repeat a command-line command&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Visual mode
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;v&lt;/td&gt;
&lt;td&gt;Enter visual mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V&lt;/td&gt;
&lt;td&gt;Enter visual line mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Enter visual block mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ggVG&lt;/td&gt;
&lt;td&gt;Select all text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt; / &amp;lt;&lt;/td&gt;
&lt;td&gt;Shift text right/left&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Macros
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;qi&lt;/td&gt;
&lt;td&gt;Record macro i&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;/td&gt;
&lt;td&gt;Stop recording macro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;@i&lt;/td&gt;
&lt;td&gt;Run macro i&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7@i&lt;/td&gt;
&lt;td&gt;Run macro i 7 times&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;@@&lt;/td&gt;
&lt;td&gt;Repeat last macro&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can save macro for any letters not just &lt;code&gt;i&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Vim Operators
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;w&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operator&lt;/td&gt;
&lt;td&gt;Motion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Combine operators with motions to use them&lt;/p&gt;
&lt;h3&gt;
  
  
  Available Operators
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;y&lt;/td&gt;
&lt;td&gt;Yank (copy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;Change (delete then insert)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;p&lt;/td&gt;
&lt;td&gt;Paste&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;=&lt;/td&gt;
&lt;td&gt;Formats code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;g~&lt;/td&gt;
&lt;td&gt;Toggle case&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gU&lt;/td&gt;
&lt;td&gt;Uppercase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gu&lt;/td&gt;
&lt;td&gt;Lowercase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt;&lt;/td&gt;
&lt;td&gt;Indent right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;&lt;/td&gt;
&lt;td&gt;Indent left&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;!&lt;/td&gt;
&lt;td&gt;Filter through external program&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Examples
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Combination&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;dd&lt;/td&gt;
&lt;td&gt;Delete current line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dj&lt;/td&gt;
&lt;td&gt;Delete two lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dw&lt;/td&gt;
&lt;td&gt;Delete to next word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;db&lt;/td&gt;
&lt;td&gt;Delete to beginning of word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dfa&lt;/td&gt;
&lt;td&gt;Delete until a char&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;d/hello&lt;/td&gt;
&lt;td&gt;Delete until hello&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cc&lt;/td&gt;
&lt;td&gt;Change current line, synonym with S&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;yy&lt;/td&gt;
&lt;td&gt;Copy current line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt;j&lt;/td&gt;
&lt;td&gt;Indent 2 lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ggdG&lt;/td&gt;
&lt;td&gt;Delete a complete document&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gg=G&lt;/td&gt;
&lt;td&gt;Indent a complete document&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ggyG&lt;/td&gt;
&lt;td&gt;Copy a whole document&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Counts
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[count] &amp;lt;operator&amp;gt; &amp;lt;motion&amp;gt;
&amp;lt;operator&amp;gt; [count] &amp;lt;motion&amp;gt;

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

&lt;/div&gt;




&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Combination&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2dd&lt;/td&gt;
&lt;td&gt;Delete 2 lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6yy&lt;/td&gt;
&lt;td&gt;Copy 6 lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;d3w&lt;/td&gt;
&lt;td&gt;Delete 3 words&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;d5j&lt;/td&gt;
&lt;td&gt;Delete 5 lines downwards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt;4k&lt;/td&gt;
&lt;td&gt;Indent 4 lines upwards&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Vim Text objects
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;v&lt;/td&gt;
&lt;td&gt;        i / a&lt;/td&gt;
&lt;td&gt;p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operator&lt;/td&gt;
&lt;td&gt;inner / around&lt;/td&gt;
&lt;td&gt;Text object&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Operate with an operator inner or around text blocks&lt;/p&gt;
&lt;h3&gt;
  
  
  Text objects
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;p&lt;/td&gt;
&lt;td&gt;Paragraph&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;w&lt;/td&gt;
&lt;td&gt;Word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;W&lt;/td&gt;
&lt;td&gt;WORD (surrounded by whitespace)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;s&lt;/td&gt;
&lt;td&gt;Sentence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[ ( { &amp;lt;&lt;/td&gt;
&lt;td&gt;A [], (), or {} block&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;] ) } &amp;gt;&lt;/td&gt;
&lt;td&gt;A [], (), or {} block&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;' " `&lt;/td&gt;
&lt;td&gt;A quoted string&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;A block [(&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;A block in [{&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;t&lt;/td&gt;
&lt;td&gt;A HTML tag block&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;See &lt;code&gt;:help text-objects&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Delete
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;diw&lt;/td&gt;
&lt;td&gt;Delete inner word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dis&lt;/td&gt;
&lt;td&gt;Delete inner sentence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;di"&lt;/td&gt;
&lt;td&gt;Delete in quotes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;da"&lt;/td&gt;
&lt;td&gt;Delete in quotes (including quotes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dip&lt;/td&gt;
&lt;td&gt;Delete a paragraph&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Selections
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;vi"&lt;/td&gt;
&lt;td&gt;Select inner quotes "..."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;va"&lt;/td&gt;
&lt;td&gt;Select quotes "..."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vi[&lt;/td&gt;
&lt;td&gt;Select inner brackets [...]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;va[&lt;/td&gt;
&lt;td&gt;Select brackets [...]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;viw&lt;/td&gt;
&lt;td&gt;Select inner word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vip&lt;/td&gt;
&lt;td&gt;Select inner paragraph&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vipip&lt;/td&gt;
&lt;td&gt;Select more paragraph&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Misc
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ciw&lt;/td&gt;
&lt;td&gt;Change inner word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ci"&lt;/td&gt;
&lt;td&gt;Change inner quotes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cit&lt;/td&gt;
&lt;td&gt;Change inner tags (HTML)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cip&lt;/td&gt;
&lt;td&gt;Change inner paragraph&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;yip&lt;/td&gt;
&lt;td&gt;Yank inner paragraph&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;yap&lt;/td&gt;
&lt;td&gt;Yank paragraph (including newline)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Vim Multiple files
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Buffers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;:e file&lt;/td&gt;
&lt;td&gt;Edit a file in a new buffer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:bn&lt;/td&gt;
&lt;td&gt;Go to the next buffer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:bp&lt;/td&gt;
&lt;td&gt;Go to the previous buffer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:bd&lt;/td&gt;
&lt;td&gt;Remove file from buffer list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:b 5&lt;/td&gt;
&lt;td&gt;Open buffer #5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:b file&lt;/td&gt;
&lt;td&gt;Go to a buffer by file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:ls&lt;/td&gt;
&lt;td&gt;List all open buffers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:sp file&lt;/td&gt;
&lt;td&gt;Open and split window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:vs file&lt;/td&gt;
&lt;td&gt;Open and vertically split window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:hid&lt;/td&gt;
&lt;td&gt;Hide this buffer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:wn&lt;/td&gt;
&lt;td&gt;Write file and move to next&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:tab ba&lt;/td&gt;
&lt;td&gt;Edit all buffers as tabs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Windows
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt; s&lt;/td&gt;
&lt;td&gt;Split window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; v&lt;/td&gt;
&lt;td&gt;Split window vertically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; w&lt;/td&gt;
&lt;td&gt;Switch windows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; q&lt;/td&gt;
&lt;td&gt;Quit a window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; T&lt;/td&gt;
&lt;td&gt;Break out into a new tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; x&lt;/td&gt;
&lt;td&gt;Swap current with next&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; -  / +&lt;/td&gt;
&lt;td&gt;Decrease/Increase height&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &amp;lt;  / &amp;gt;&lt;/td&gt;
&lt;td&gt;Decrease/Increase width&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; =&lt;/td&gt;
&lt;td&gt;Equally high and wide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; h / l&lt;/td&gt;
&lt;td&gt;Go to the left/right window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; j / k&lt;/td&gt;
&lt;td&gt;Go to the up/down window&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Tabs
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;:tabe [file]&lt;/td&gt;
&lt;td&gt;Edit file in a new tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:tabf [file]&lt;/td&gt;
&lt;td&gt;Open if exists in new tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:tabc&lt;/td&gt;
&lt;td&gt;Close current tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:tabo&lt;/td&gt;
&lt;td&gt;Close other tabs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:tabs&lt;/td&gt;
&lt;td&gt;List all tabs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:tabr&lt;/td&gt;
&lt;td&gt;Go to first tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:tabl&lt;/td&gt;
&lt;td&gt;Go to last tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:tabm 0&lt;/td&gt;
&lt;td&gt;Move to position 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:tabn&lt;/td&gt;
&lt;td&gt;Go to next tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:tabp&lt;/td&gt;
&lt;td&gt;Go to previous tab&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Normal mode
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;gt&lt;/td&gt;
&lt;td&gt;Go to next tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gT&lt;/td&gt;
&lt;td&gt;Go to previous tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2gt&lt;/td&gt;
&lt;td&gt;Go to tab number 2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Vim Search and Replace
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Search
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/foo&lt;/td&gt;
&lt;td&gt;Search forward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/foo\c&lt;/td&gt;
&lt;td&gt;Search forward (case insensitive)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;?foo&lt;/td&gt;
&lt;td&gt;Search backward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/\v\d+&lt;/td&gt;
&lt;td&gt;Search with regex&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;Next matching search pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;td&gt;Previous match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;Search for current word forward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;Search for current word backward&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Replace LINE
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
:[range]s/{pattern}/{str}/[flags]&lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;:s/old/new&lt;/td&gt;
&lt;td&gt;Replace first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:s/old/new/g&lt;/td&gt;
&lt;td&gt;Replace all&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:s/\vold/new/g&lt;/td&gt;
&lt;td&gt;Replace all with regex&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:s/old/new/gc&lt;/td&gt;
&lt;td&gt;replace all (Confirm)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:s/old/new/i&lt;/td&gt;
&lt;td&gt;Ignore case replace first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:2,6s/old/new/g&lt;/td&gt;
&lt;td&gt;Replace between lines 2-6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Replace FILE
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
:%s/{pattern}/{str}/[flags]&lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;:%s/old/new&lt;/td&gt;
&lt;td&gt;Replace first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:%s/old/new/g&lt;/td&gt;
&lt;td&gt;Replace all&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:%s/old/new/gc&lt;/td&gt;
&lt;td&gt;Replace all (Confirm)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:%s/old/new/gi&lt;/td&gt;
&lt;td&gt;Replace all (ignore case)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:%s/\vold/new/g&lt;/td&gt;
&lt;td&gt;Replace all with regex&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Ranges
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;%&lt;/td&gt;
&lt;td&gt;Entire file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;’&amp;lt;,’&amp;gt;&lt;/td&gt;
&lt;td&gt;Current selection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Line 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5,10&lt;/td&gt;
&lt;td&gt;Lines 5 to 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$&lt;/td&gt;
&lt;td&gt;Last line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2,$&lt;/td&gt;
&lt;td&gt;Lines 2 to Last&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.&lt;/td&gt;
&lt;td&gt;Current line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;,3&lt;/td&gt;
&lt;td&gt;Next 3 lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-3,&lt;/td&gt;
&lt;td&gt;Forward 3 lines&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Global command
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
:[range]g/{pattern}/[command]&lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;:g/foo/d&lt;/td&gt;
&lt;td&gt;Delete lines containing foo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:g!/foo/d&lt;/td&gt;
&lt;td&gt;Delete lines not containing foo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:g/^\s*$/d&lt;/td&gt;
&lt;td&gt;Delete all blank lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:g/foo/t$&lt;/td&gt;
&lt;td&gt;Copy lines containing foo to EOF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:g/foo/m$&lt;/td&gt;
&lt;td&gt;Move lines containing foo to EOF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:g/^/m0&lt;/td&gt;
&lt;td&gt;Reverse a file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:g/^/t.&lt;/td&gt;
&lt;td&gt;Duplicate every line&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Inverse :g
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
:[range]v/{pattern}/[command]&lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;:v/foo/d&lt;/td&gt;
&lt;td&gt;Delete lines not containing foo(also :g!/foo/d)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Flags
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;g&lt;/td&gt;
&lt;td&gt;Replace all occurrences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;i&lt;/td&gt;
&lt;td&gt;Ignore case&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;Don't ignore case&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;Confirm each substitution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Substitute expression (magic)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;amp;&lt;/td&gt;
&lt;td&gt;\0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\1...\9&lt;/td&gt;
&lt;td&gt;Replace with the group 0-9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\u&lt;/td&gt;
&lt;td&gt;Uppercase next letter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\U&lt;/td&gt;
&lt;td&gt;Uppercase following characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\l&lt;/td&gt;
&lt;td&gt;Lowercase next letter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\L&lt;/td&gt;
&lt;td&gt;Lowercase following characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\e&lt;/td&gt;
&lt;td&gt;End of \u, \U, \l and \L&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\E&lt;/td&gt;
&lt;td&gt;End of \u, \U, \l and \L&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Examples
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
:s/a|b/xxx\0xxx/g               # Modifies "a b"      to "xxxaxxx xxxbxxx"&lt;br&gt;
:s/test/\U&amp;amp; file/                # Modifies "test"     to "TEST FILE"&lt;br&gt;
:s/(test)/\U\1\e file/         # Modifies "test"     to "TEST file"&lt;br&gt;
:s/\v([abc])([efg])/\2\1/g       # Modifies "af fa bg" to "fa fa gb"&lt;br&gt;
:s/\v\w+/\u\0/g                  # Modifies "bla bla"  to "Bla Bla"&lt;br&gt;
:s/\v([ab])|([cd])/\1x/g         # Modifies "a b c d"  to "ax bx x x"&lt;br&gt;
:%s/.&lt;em&gt;/\L&amp;amp;/                      # Modifies "HTML"     to "html"&lt;br&gt;
:s/\v&amp;lt;(.)(\w&lt;/em&gt;)/\u\1\L\2/g        # Make every first letter of a word uppercase&lt;br&gt;
:%s/^(.&lt;em&gt;)\n\1/\1/              # Remove duplicate lines&lt;br&gt;
:%s/&amp;lt;\/=(\w+)&amp;gt;/\U&amp;amp;/g        # Convert HTML-Tags to uppercase&lt;br&gt;
:g/^pattern/s/$/mytext           # Find and append text to the end&lt;br&gt;
:g/pattern/norm! @i              # Run a macro on matching lines&lt;br&gt;
/^(.&lt;/em&gt;)(\r\?\n\1)+$          # View the duplicates lines&lt;br&gt;
/\v^(.*)(\r?\n\1)+$              # View the duplicates lines (very magic)&lt;br&gt;
:v/./,/./-j                      # Compress blank lines into a blank line&lt;br&gt;
:g//,//d                 # Delete inclusively from  to &lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Vimdiff
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;$ vimdiff file1 file2 [file3]&lt;br&gt;
$ vim -d file1 file2 [file3]&lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Editing
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
:[range]diffget [bufspec]&lt;br&gt;
:[range]diffput [bufspec]&lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;do / :diffget&lt;/td&gt;
&lt;td&gt;Obtain (get) difference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dp / :diffput&lt;/td&gt;
&lt;td&gt;Put difference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:dif&lt;/td&gt;
&lt;td&gt;Re-scan differences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:diffo&lt;/td&gt;
&lt;td&gt;Switch off diff mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:1,$+1diffget&lt;/td&gt;
&lt;td&gt;Get all differences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ZQ&lt;/td&gt;
&lt;td&gt;Quit without changes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;See: Ranges&lt;/p&gt;
&lt;h3&gt;
  
  
  Folds
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;zo / zO&lt;/td&gt;
&lt;td&gt;Open&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zc / zC&lt;/td&gt;
&lt;td&gt;Close&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;za / zA&lt;/td&gt;
&lt;td&gt;Toggle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zv&lt;/td&gt;
&lt;td&gt;Open folds for this line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zM&lt;/td&gt;
&lt;td&gt;Close all&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zR&lt;/td&gt;
&lt;td&gt;Open all&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zm&lt;/td&gt;
&lt;td&gt;Fold more (foldlevel += 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zr&lt;/td&gt;
&lt;td&gt;Fold less (foldlevel -= 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zx&lt;/td&gt;
&lt;td&gt;Update folds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Jumping
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;]c&lt;/td&gt;
&lt;td&gt;Next difference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[c&lt;/td&gt;
&lt;td&gt;Previous difference&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Miscellaneous
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Case
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;vU&lt;/td&gt;
&lt;td&gt;Uppercase character&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vu&lt;/td&gt;
&lt;td&gt;Lowercase character&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;~&lt;/td&gt;
&lt;td&gt;Toggle case character&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;viw U&lt;/td&gt;
&lt;td&gt;Uppercase word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;viw u&lt;/td&gt;
&lt;td&gt;Lowercase word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;viw ~&lt;/td&gt;
&lt;td&gt;Toggle case word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VU / gUU&lt;/td&gt;
&lt;td&gt;Uppercase line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vu / guu&lt;/td&gt;
&lt;td&gt;Lowercase line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V~ / g~~&lt;/td&gt;
&lt;td&gt;Toggle case line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gggUG&lt;/td&gt;
&lt;td&gt;Uppercase all text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ggguG&lt;/td&gt;
&lt;td&gt;Lowercase all text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ggg~G&lt;/td&gt;
&lt;td&gt;Toggle case  all text&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Jumping
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Go back to previous&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Go forward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gf&lt;/td&gt;
&lt;td&gt;Go to file in cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ga&lt;/td&gt;
&lt;td&gt;Display hex, ascii value&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Misc command-lines
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;:h&lt;/td&gt;
&lt;td&gt;Help open help view&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:edit!&lt;/td&gt;
&lt;td&gt;Reload current file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:2,8m0&lt;/td&gt;
&lt;td&gt;Move lines 2-8 to 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:noh&lt;/td&gt;
&lt;td&gt;Clear search highlights&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:sort&lt;/td&gt;
&lt;td&gt;Sort lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:ter&lt;/td&gt;
&lt;td&gt;Open a terminal window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:set paste&lt;/td&gt;
&lt;td&gt;Enable Insert Paste sub-mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:set nopaste&lt;/td&gt;
&lt;td&gt;disable Insert Paste sub-mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:cq&lt;/td&gt;
&lt;td&gt;Exiting with an error(aborting Git)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Navigating
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;%&lt;/td&gt;
&lt;td&gt;Nearest/matching {[()]}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[(&lt;/td&gt;
&lt;td&gt;[{&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;])&lt;/td&gt;
&lt;td&gt;]{&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[m&lt;/td&gt;
&lt;td&gt;Previous method start&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[M&lt;/td&gt;
&lt;td&gt;Previous method end&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Counters
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Increase number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Decrease number&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Tags
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;:tag Classname&lt;/td&gt;
&lt;td&gt;Jump to first definition of Classname&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Jump to definition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;g]&lt;/td&gt;
&lt;td&gt;See all definitions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Go back to last tag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;Back/forward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:tselect Classname&lt;/td&gt;
&lt;td&gt;Find definitions of Classname&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:tjump Classname&lt;/td&gt;
&lt;td&gt;Find definitions of Classname (auto-select 1st)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Formatting
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;:ce 8&lt;/td&gt;
&lt;td&gt;Center lines between 8 columns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:ri 4&lt;/td&gt;
&lt;td&gt;Right-align lines at 4 columns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:le&lt;/td&gt;
&lt;td&gt;Left-align lines&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;See &lt;code&gt;:help formatting&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Marks
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;`^&lt;/td&gt;
&lt;td&gt;Last position of cursor in insert mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`.&lt;/td&gt;
&lt;td&gt;Last change in current buffer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`"&lt;/td&gt;
&lt;td&gt;Last exited current buffer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`0&lt;/td&gt;
&lt;td&gt;In last file edited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;''&lt;/td&gt;
&lt;td&gt;Back to line in current buffer where jumped from&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Back to position in current buffer where jumped from&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`[&lt;/td&gt;
&lt;td&gt;To beginning of previously changed or yanked text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`]&lt;/td&gt;
&lt;td&gt;To end of previously changed or yanked text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`&amp;lt;&lt;/td&gt;
&lt;td&gt;To beginning of last visual selection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`&amp;gt;&lt;/td&gt;
&lt;td&gt;To end of last visual selection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ma&lt;/td&gt;
&lt;td&gt;Mark this cursor position as a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`a&lt;/td&gt;
&lt;td&gt;Jump to the cursor position a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'a&lt;/td&gt;
&lt;td&gt;Jump to the beginning of the line with position a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;d'a&lt;/td&gt;
&lt;td&gt;Delete from current line to line of mark a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;d`a&lt;/td&gt;
&lt;td&gt;Delete from current position to position of mark a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;c'a&lt;/td&gt;
&lt;td&gt;Change text from current line to line of a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;y`a&lt;/td&gt;
&lt;td&gt;Yank text from current position to position of a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:marks&lt;/td&gt;
&lt;td&gt;List all current marks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:delm a&lt;/td&gt;
&lt;td&gt;Delete mark a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:delm a-d&lt;/td&gt;
&lt;td&gt;Delete marks a, b, c, d&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:delm abc&lt;/td&gt;
&lt;td&gt;Delete marks a, b, c&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Calculator
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt; = 7*7&lt;/td&gt;
&lt;td&gt;Shows the result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; = 10/2&lt;/td&gt;
&lt;td&gt;Shows the result&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Do this in INSERT mode&lt;/p&gt;
&lt;h3&gt;
  
  
  Shell
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;:!&lt;/td&gt;
&lt;td&gt;Interpret Shell Command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:r!&lt;/td&gt;
&lt;td&gt;Read in output of shell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:r!date&lt;/td&gt;
&lt;td&gt;Insert date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:!!date&lt;/td&gt;
&lt;td&gt;Replace current line with date&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Command line
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Insert current word into the command line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"&lt;/td&gt;
&lt;td&gt;Paste from " register&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Auto-completion of path in insert mode&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Tricks
&lt;/h3&gt;

&lt;p&gt;Remove duplicate lines&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:sort | %!uniq -u

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

&lt;/div&gt;



&lt;p&gt;To number the lines in the file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:%!cat -n

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

&lt;/div&gt;



&lt;p&gt;Copy whole doc to clipboard&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:%w !pbcopy            # Mac OS X
:%w !xclip -i -sel c   # GNU/Linux
:%w !xsel -i -b        # GNU/Linux

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Also see
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://devhints.io/vim" rel="noopener noreferrer"&gt;Devhints&lt;/a&gt; &lt;em&gt;(devhints.io)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://vim.rtorr.com/" rel="noopener noreferrer"&gt;Vim cheatsheet&lt;/a&gt; &lt;em&gt;(vim.rotrr.com)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://vimdoc.sourceforge.net/htmldoc/" rel="noopener noreferrer"&gt;Vim documentation&lt;/a&gt; &lt;em&gt;(vimdoc.sourceforge.net)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://openvim.com/" rel="noopener noreferrer"&gt;Interactive Vim tutorial&lt;/a&gt; &lt;em&gt;(openvim.com)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>linux</category>
      <category>vim</category>
    </item>
    <item>
      <title>Do DevOps Need to Know Databases? Absolutely! MongoDB, PostgreSQL, MySQL, and Redis</title>
      <dc:creator>Hoang Guruu</dc:creator>
      <pubDate>Mon, 03 Mar 2025 08:52:35 +0000</pubDate>
      <link>https://dev.to/aws-builders/do-devops-need-to-know-databases-absolutely-heres-everything-you-need-to-master-mongodb-128e</link>
      <guid>https://dev.to/aws-builders/do-devops-need-to-know-databases-absolutely-heres-everything-you-need-to-master-mongodb-128e</guid>
      <description>&lt;p&gt;【 &lt;a href="https://www.youtube.com/@HoangGuruu" rel="noopener noreferrer"&gt;👨🏻‍💻 YouTube&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/nguyen-tan-hoang-64070a284/" rel="noopener noreferrer"&gt;🕵️ LinkedIn&lt;/a&gt;】&lt;br&gt;
Watch more other contents related DevOps - AWS&lt;/p&gt;
&lt;h2&gt;
  
  
  📜 Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;MongoDB&lt;/li&gt;
&lt;li&gt;Postgres&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  📌 &lt;a id="mongodb"&gt;&lt;/a&gt; MongoDB
&lt;/h2&gt;
&lt;h1&gt;
  
  
  MongoDB Cheat Sheet &amp;amp; Quick Reference
&lt;/h1&gt;
&lt;h2&gt;
  
  
  MongoDB
&lt;/h2&gt;

&lt;p&gt;The MongoDB cheat sheet provides you with the most commonly used MongoDB commands and queries for your reference. the cheatsheet is from mongodb developers website&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Connect MongoDB Shell
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mongo # connects to mongodb://127.0.0.1:27017 by default

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

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mongo --host &amp;lt;host&amp;gt; --port &amp;lt;port&amp;gt; -u &amp;lt;user&amp;gt; -p &amp;lt;pwd&amp;gt; # omit the password if you want a prompt

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

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mongo "mongodb://192.168.1.1:27017"

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

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mongo "mongodb+srv://cluster-name.abcde.mongodb.net/&amp;lt;dbname&amp;gt;" --username &amp;lt;username&amp;gt; # MongoDB Atlas

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

&lt;/div&gt;

&lt;h3&gt;
  
  
  Helpers
&lt;/h3&gt;

&lt;p&gt;show dbs :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db // prints the current database

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

&lt;/div&gt;



&lt;p&gt;Switch database :&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Show collections :&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Run JavaScript file :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;load("myScript.js")

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  Crud
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.insertOne({name: "Max"})
db.coll.insert([{name: "Max"}, {name:"Alex"}]) // ordered bulk insert
db.coll.insert([{name: "Max"}, {name:"Alex"}], {ordered: false}) // unordered bulk insert
db.coll.insert({date: ISODate()})
db.coll.insert({name: "Max"}, {"writeConcern": {"w": "majority", "wtimeout": 5000}})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Delete
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.remove({name: "Max"})
db.coll.remove({name: "Max"}, {justOne: true})
db.coll.remove({}) // WARNING! Deletes all the docs but not the collection itself and its index definitions
db.coll.remove({name: "Max"}, {"writeConcern": {"w": "majority", "wtimeout": 5000}})
db.coll.findOneAndDelete({"name": "Max"})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Update
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.update({"_id": 1}, {"year": 2016}) // WARNING! Replaces the entire document
db.coll.update({"_id": 1}, {$set: {"year": 2016, name: "Max"}})
db.coll.update({"_id": 1}, {$unset: {"year": 1}})
db.coll.update({"_id": 1}, {$rename: {"year": "date"} })
db.coll.update({"_id": 1}, {$inc: {"year": 5}})
db.coll.update({"_id": 1}, {$mul: {price: NumberDecimal("1.25"), qty: 2}})
db.coll.update({"_id": 1}, {$min: {"imdb": 5}})
db.coll.update({"_id": 1}, {$max: {"imdb": 8}})
db.coll.update({"_id": 1}, {$currentDate: {"lastModified": true}})
db.coll.update({"_id": 1}, {$currentDate: {"lastModified": {$type: "timestamp"}}})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Array
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.update({"_id": 1}, {$push :{"array": 1}})
db.coll.update({"_id": 1}, {$pull :{"array": 1}})
db.coll.update({"_id": 1}, {$addToSet :{"array": 2}})
db.coll.update({"_id": 1}, {$pop: {"array": 1}})  // last element
db.coll.update({"_id": 1}, {$pop: {"array": -1}}) // first element
db.coll.update({"_id": 1}, {$pullAll: {"array" :[3, 4, 5]}})
db.coll.update({"_id": 1}, {$push: {scores: {$each: [90, 92, 85]}}})
db.coll.updateOne({"_id": 1, "grades": 80}, {$set: {"grades.$": 82}})
db.coll.updateMany({}, {$inc: {"grades.$[]": 10}})
db.coll.update({}, {$set: {"grades.$[element]": 100}}, {multi: true, arrayFilters: [{"element": {$gte: 100}}]})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Update many
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.update({"year": 1999}, {$set: {"decade": "90's"}}, {"multi":true})
db.coll.updateMany({"year": 1999}, {$set: {"decade": "90's"}})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  FindOneAndUpdate
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.findOneAndUpdate({"name": "Max"}, {$inc: {"points": 5}}, {returnNewDocument: true})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Upsert
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.update({"_id": 1}, {$set: {item: "apple"}, $setOnInsert: {defaultQty: 100}}, {upsert: true})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Replace
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.replaceOne({"name": "Max"}, {"firstname": "Maxime", "surname": "Beugnet"})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Save
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.save({"item": "book", "qty": 40})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Write concern
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.update({}, {$set: {"x": 1}}, {"writeConcern": {"w": "majority", "wtimeout": 5000}})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Find
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.findOne() // returns a single document
db.coll.find()    // returns a cursor - show 20 results - "it" to display more
db.coll.find().pretty()
db.coll.find({name: "Max", age: 32}) // implicit logical "AND".
db.coll.find({date: ISODate("2020-09-25T13:57:17.180Z")})
db.coll.find({name: "Max", age: 32}).explain("executionStats") // or "queryPlanner" or "allPlansExecution"
db.coll.distinct("name")

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Count
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.count({age: 32})          // estimation based on collection metadata
db.coll.estimatedDocumentCount()  // estimation based on collection metadata
db.coll.countDocuments({age: 32}) // alias for an aggregation pipeline - accurate count

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Comparison
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.find({"year": {$gt: 1970}})
db.coll.find({"year": {$gte: 1970}})
db.coll.find({"year": {$lt: 1970}})
db.coll.find({"year": {$lte: 1970}})
db.coll.find({"year": {$ne: 1970}})
db.coll.find({"year": {$in: [1958, 1959]}})
db.coll.find({"year": {$nin: [1958, 1959]}})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Logical
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.find({name:{$not: {$eq: "Max"}}})
db.coll.find({$or: [{"year" : 1958}, {"year" : 1959}]})
db.coll.find({$nor: [{price: 1.99}, {sale: true}]})
db.coll.find({
$and: [
    {$or: [{qty: {$lt :10}}, {qty :{$gt: 50}}]},
{$or: [{sale: true}, {price: {$lt: 5 }}]}
]
})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Element
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.find({name: {$exists: true}})
db.coll.find({"zipCode": {$type: 2 }})
db.coll.find({"zipCode": {$type: "string"}})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Aggregation Pipeline
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.aggregate([
{$match: {status: "A"}},
{$group: {_id: "$cust_id", total: {$sum: "$amount"}}},
{$sort: {total: -1}}
])

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Text search with a "text" index
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.find({$text: {$search: "cake"}}, {score: {$meta: "textScore"}}).sort({score: {$meta: "textScore"}})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Regex
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.find({name: /^Max/}) // regex: starts by letter "M"
db.coll.find({name: /^Max$/i}) // regex case insensitive

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Array
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.find({tags: {$all: ["Realm", "Charts"]}})
db.coll.find({field: {$size: 2}}) // impossible to index - prefer storing the size of the array &amp;amp; update it
db.coll.find({results: {$elemMatch: {product: "xyz", score: {$gte: 8}}}})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Projections
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.find({"x": 1}, {"actors": 1}) // actors + \_id
db.coll.find({"x": 1}, {"actors": 1, "\_id": 0}) // actors
db.coll.find({"x": 1}, {"actors": 0, "summary": 0}) // all but "actors" and "summary"

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sort, skip, limit
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.find({}).sort({"year": 1, "rating": -1}).skip(10).limit(3)

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Read Concern
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.find().readConcern("majority")

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Databases and Collections
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Drop
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.drop()    // removes the collection and its index definitions
db.dropDatabase() // double check that you are *NOT* on the PROD cluster... :-)

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create Collection
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.createCollection("contacts", {
   validator: {$jsonSchema: {
      bsonType: "object",
      required: ["phone"],
      properties: {
         phone: {
            bsonType: "string",
            description: "must be a string and is required"
         },
         email: {
            bsonType: "string",
            pattern: "@mongodb\.com$",
            description: "must be a string and match the regular expression pattern"
         },
         status: {
            enum: [ "Unknown", "Incomplete" ],
            description: "can only be one of the enum values"
         }
      }
   }}
})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Other Collection Functions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.stats()
db.coll.storageSize()
db.coll.totalIndexSize()
db.coll.totalSize()
db.coll.validate({full: true})
db.coll.renameCollection("new_coll", true) // 2nd parameter to drop the target collection if exists

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Indexes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Basics
&lt;/h3&gt;

&lt;h4&gt;
  
  
  List
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.getIndexes()
db.coll.getIndexKeys()

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Drop Indexes
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.dropIndex("name_1")

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Hide/Unhide Indexes
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.coll.hideIndex("name_1")
db.coll.unhideIndex("name_1")

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create Indexes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Index Types
db.coll.createIndex({"name": 1})                // single field index
db.coll.createIndex({"name": 1, "date": 1})     // compound index
db.coll.createIndex({foo: "text", bar: "text"}) // text index
db.coll.createIndex({"$**": "text"})            // wildcard text index
db.coll.createIndex({"userMetadata.$**": 1})    // wildcard index
db.coll.createIndex({"loc": "2d"})              // 2d index
db.coll.createIndex({"loc": "2dsphere"})        // 2dsphere index
db.coll.createIndex({"_id": "hashed"})          // hashed index

// Index Options
db.coll.createIndex({"lastModifiedDate": 1}, {expireAfterSeconds: 3600})      // TTL index
db.coll.createIndex({"name": 1}, {unique: true})
db.coll.createIndex({"name": 1}, {partialFilterExpression: {age: {$gt: 18}}}) // partial index
db.coll.createIndex({"name": 1}, {collation: {locale: 'en', strength: 1}})    // case insensitive index with strength = 1 or 2
db.coll.createIndex({"name": 1 }, {sparse: true})

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Others
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Handy commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use admin
db.createUser({"user": "root", "pwd": passwordPrompt(), "roles": ["root"]})
db.dropUser("root")
db.auth( "user", passwordPrompt() )

use test
db.getSiblingDB("dbname")
db.currentOp()
db.killOp(123) // opid

db.fsyncLock()
db.fsyncUnlock()

db.getCollectionNames()
db.getCollectionInfos()
db.printCollectionStats()
db.stats()

db.getReplicationInfo()
db.printReplicationInfo()
db.isMaster()
db.hostInfo()
db.printShardingStatus()
db.shutdownServer()
db.serverStatus()

db.setSlaveOk()
db.getSlaveOk()

db.getProfilingLevel()
db.getProfilingStatus()
db.setProfilingLevel(1, 200) // 0 == OFF, 1 == ON with slowms, 2 == ON

db.enableFreeMonitoring()
db.disableFreeMonitoring()
db.getFreeMonitoringStatus()

db.createView("viewName", "sourceColl", [{$project:{department: 1}}])

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Replica Set
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rs.status()
rs.initiate({"_id": "replicaTest",
  members: [
    { _id: 0, host: "127.0.0.1:27017" },
    { _id: 1, host: "127.0.0.1:27018" },
    { _id: 2, host: "127.0.0.1:27019", arbiterOnly:true }]
})
rs.add("mongodbd1.example.net:27017")
rs.addArb("mongodbd2.example.net:27017")
rs.remove("mongodbd1.example.net:27017")
rs.conf()
rs.isMaster()
rs.printReplicationInfo()
rs.printSlaveReplicationInfo()
rs.reconfig(&amp;lt;valid_conf&amp;gt;)
rs.slaveOk()
rs.stepDown(20, 5) // (stepDownSecs, secondaryCatchUpPeriodSecs)

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sharded Cluster
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sh.status()
sh.addShard("rs1/mongodbd1.example.net:27017")
sh.shardCollection("mydb.coll", {zipcode: 1})

sh.moveChunk("mydb.coll", { zipcode: "53187" }, "shard0019")
sh.splitAt("mydb.coll", {x: 70})
sh.splitFind("mydb.coll", {x: 70})
sh.disableAutoSplit()
sh.enableAutoSplit()

sh.startBalancer()
sh.stopBalancer()
sh.disableBalancing("mydb.coll")
sh.enableBalancing("mydb.coll")
sh.getBalancerState()
sh.setBalancerState(true/false)
sh.isBalancerRunning()

sh.addTagRange("mydb.coll", {state: "NY", zip: MinKey }, { state: "NY", zip: MaxKey }, "NY")
sh.removeTagRange("mydb.coll", {state: "NY", zip: MinKey }, { state: "NY", zip: MaxKey }, "NY")
sh.addShardTag("shard0000", "NYC")
sh.removeShardTag("shard0000", "NYC")

sh.addShardToZone("shard0000", "JFK")
sh.removeShardFromZone("shard0000", "NYC")
sh.removeRangeFromZone("mydb.coll", {a: 1, b: 1}, {a: 10, b: 10})

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Change Streams
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;watchCursor = db.coll.watch( [ { $match : {"operationType" : "insert" } } ] )

while (!watchCursor.isExhausted()){
   if (watchCursor.hasNext()){
      print(tojson(watchCursor.next()));
   }
}

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  📌 &lt;a id="postgres"&gt;&lt;/a&gt; Postgres
&lt;/h2&gt;

&lt;h1&gt;
  
  
  PostgreSQL Cheat Sheet &amp;amp; Quick Reference
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Recon
&lt;/h3&gt;

&lt;p&gt;Show version&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Show system status&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Show environmental variables&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;List users&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT rolname FROM pg_roles;

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

&lt;/div&gt;



&lt;p&gt;Show current user&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Show current user's permissions&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Show current database&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT current_database();

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

&lt;/div&gt;



&lt;p&gt;Show all tables in database&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;List functions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\df &amp;lt;schema&amp;gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Databases
&lt;/h3&gt;

&lt;p&gt;List databases&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Connect to database&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\c &amp;lt;database_name&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;Show current database&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT current_database();

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://www.postgresql.org/docs/current/static/sql-createdatabase.html" rel="noopener noreferrer"&gt;Create database&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE DATABASE &amp;lt;database_name&amp;gt; WITH OWNER &amp;lt;username&amp;gt;;

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://www.postgresql.org/docs/current/static/sql-dropdatabase.html" rel="noopener noreferrer"&gt;Drop database&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DROP DATABASE IF EXISTS &amp;lt;database_name&amp;gt;;

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://www.postgresql.org/docs/current/static/sql-alterdatabase.html" rel="noopener noreferrer"&gt;Rename database&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER DATABASE &amp;lt;old_name&amp;gt; RENAME TO &amp;lt;new_name&amp;gt;;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tables
&lt;/h3&gt;

&lt;p&gt;List tables, in current db&lt;br&gt;
&lt;/p&gt;

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

SELECT table_schema,table_name FROM information_schema.tables ORDER BY table_schema,table_name;

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

&lt;/div&gt;



&lt;p&gt;List tables, globally&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\dt *.*.

SELECT * FROM pg_catalog.pg_tables

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

&lt;/div&gt;



&lt;p&gt;List table schema&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\d &amp;lt;table_name&amp;gt;
\d+ &amp;lt;table_name&amp;gt;

SELECT column_name, data_type, character_maximum_length
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = '&amp;lt;table_name&amp;gt;';

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://www.postgresql.org/docs/current/static/sql-createtable.html" rel="noopener noreferrer"&gt;Create table&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE &amp;lt;table_name&amp;gt;(
  &amp;lt;column_name&amp;gt; &amp;lt;column_type&amp;gt;,
  &amp;lt;column_name&amp;gt; &amp;lt;column_type&amp;gt;
);

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

&lt;/div&gt;



&lt;p&gt;Create table, with an auto-incrementing primary key&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE &amp;lt;table_name&amp;gt; (
  &amp;lt;column_name&amp;gt; SERIAL PRIMARY KEY
);

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://www.postgresql.org/docs/current/static/sql-droptable.html" rel="noopener noreferrer"&gt;Delete table&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DROP TABLE IF EXISTS &amp;lt;table_name&amp;gt; CASCADE;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Permissions
&lt;/h3&gt;

&lt;p&gt;Become the postgres user, if you have permission errors&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo su - postgres
psql

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://www.postgresql.org/docs/current/static/sql-grant.html" rel="noopener noreferrer"&gt;Grant&lt;/a&gt; all permissions on database&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GRANT ALL PRIVILEGES ON DATABASE &amp;lt;db_name&amp;gt; TO &amp;lt;user_name&amp;gt;;

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

&lt;/div&gt;



&lt;p&gt;Grant connection permissions on database&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GRANT CONNECT ON DATABASE &amp;lt;db_name&amp;gt; TO &amp;lt;user_name&amp;gt;;

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

&lt;/div&gt;



&lt;p&gt;Grant permissions on schema&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GRANT USAGE ON SCHEMA public TO &amp;lt;user_name&amp;gt;;

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

&lt;/div&gt;



&lt;p&gt;Grant permissions to functions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO &amp;lt;user_name&amp;gt;;

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

&lt;/div&gt;



&lt;p&gt;Grant permissions to select, update, insert, delete, on a all tables&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GRANT SELECT, UPDATE, INSERT ON ALL TABLES IN SCHEMA public TO &amp;lt;user_name&amp;gt;;

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

&lt;/div&gt;



&lt;p&gt;Grant permissions, on a table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GRANT SELECT, UPDATE, INSERT ON &amp;lt;table_name&amp;gt; TO &amp;lt;user_name&amp;gt;;

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

&lt;/div&gt;



&lt;p&gt;Grant permissions, to select, on a table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GRANT SELECT ON ALL TABLES IN SCHEMA public TO &amp;lt;user_name&amp;gt;;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Columns
&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://www.postgresql.org/docs/current/static/sql-altertable.html" rel="noopener noreferrer"&gt;Add column&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER TABLE &amp;lt;table_name&amp;gt; IF EXISTS
ADD &amp;lt;column_name&amp;gt; &amp;lt;data_type&amp;gt; [&amp;lt;constraints&amp;gt;];

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

&lt;/div&gt;



&lt;p&gt;Update column&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER TABLE &amp;lt;table_name&amp;gt; IF EXISTS
ALTER &amp;lt;column_name&amp;gt; TYPE &amp;lt;data_type&amp;gt; [&amp;lt;constraints&amp;gt;];

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

&lt;/div&gt;



&lt;p&gt;Delete column&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER TABLE &amp;lt;table_name&amp;gt; IF EXISTS
DROP &amp;lt;column_name&amp;gt;;

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

&lt;/div&gt;



&lt;p&gt;Update column to be an auto-incrementing primary key&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER TABLE &amp;lt;table_name&amp;gt;
ADD COLUMN &amp;lt;column_name&amp;gt; SERIAL PRIMARY KEY;

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

&lt;/div&gt;



&lt;p&gt;Insert into a table, with an auto-incrementing primary key&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INSERT INTO &amp;lt;table_name&amp;gt;
VALUES (DEFAULT, &amp;lt;value1&amp;gt;);


INSERT INTO &amp;lt;table_name&amp;gt; (&amp;lt;column1_name&amp;gt;,&amp;lt;column2_name&amp;gt;)
VALUES ( &amp;lt;value1&amp;gt;,&amp;lt;value2&amp;gt; );

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Data
&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://www.postgresql.org/docs/current/static/sql-select.html" rel="noopener noreferrer"&gt;Select&lt;/a&gt; all data&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM &amp;lt;table_name&amp;gt;;

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

&lt;/div&gt;



&lt;p&gt;Read one row of data&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM &amp;lt;table_name&amp;gt; LIMIT 1;

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

&lt;/div&gt;



&lt;p&gt;Search for data&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM &amp;lt;table_name&amp;gt; WHERE &amp;lt;column_name&amp;gt; = &amp;lt;value&amp;gt;;

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://www.postgresql.org/docs/current/static/sql-insert.html" rel="noopener noreferrer"&gt;Insert&lt;/a&gt; data&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INSERT INTO &amp;lt;table_name&amp;gt; VALUES( &amp;lt;value_1&amp;gt;, &amp;lt;value_2&amp;gt; );

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://www.postgresql.org/docs/current/static/sql-update.html" rel="noopener noreferrer"&gt;Update&lt;/a&gt; data&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UPDATE &amp;lt;table_name&amp;gt;
SET &amp;lt;column_1&amp;gt; = &amp;lt;value_1&amp;gt;, &amp;lt;column_2&amp;gt; = &amp;lt;value_2&amp;gt;
WHERE &amp;lt;column_1&amp;gt; = &amp;lt;value&amp;gt;;

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://www.postgresql.org/docs/current/static/sql-delete.html" rel="noopener noreferrer"&gt;Delete&lt;/a&gt; all data&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DELETE FROM &amp;lt;table_name&amp;gt;;

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

&lt;/div&gt;



&lt;p&gt;Delete specific data&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DELETE FROM &amp;lt;table_name&amp;gt;
WHERE &amp;lt;column_name&amp;gt; = &amp;lt;value&amp;gt;;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Users
&lt;/h3&gt;

&lt;p&gt;List roles&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT rolname FROM pg_roles;

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://www.postgresql.org/docs/current/static/sql-createuser.html" rel="noopener noreferrer"&gt;Create user&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE USER &amp;lt;user_name&amp;gt; WITH PASSWORD '&amp;lt;password&amp;gt;';

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://www.postgresql.org/docs/current/static/sql-dropuser.html" rel="noopener noreferrer"&gt;Drop user&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DROP USER IF EXISTS &amp;lt;user_name&amp;gt;;

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://www.postgresql.org/docs/current/static/sql-alterrole.html" rel="noopener noreferrer"&gt;Alter&lt;/a&gt; user password&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER ROLE &amp;lt;user_name&amp;gt; WITH PASSWORD '&amp;lt;password&amp;gt;';

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Schema
&lt;/h3&gt;

&lt;p&gt;List schemas&lt;br&gt;
&lt;/p&gt;

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

SELECT schema_name FROM information_schema.schemata;

SELECT nspname FROM pg_catalog.pg_namespace;

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://www.postgresql.org/docs/current/static/sql-createschema.html" rel="noopener noreferrer"&gt;Create schema&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE SCHEMA IF NOT EXISTS &amp;lt;schema_name&amp;gt;;

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://www.postgresql.org/docs/current/static/sql-dropschema.html" rel="noopener noreferrer"&gt;Drop schema&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DROP SCHEMA IF EXISTS &amp;lt;schema_name&amp;gt; CASCADE;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dates
&lt;/h3&gt;

&lt;p&gt;Show &lt;a href="https://www.postgresql.org/docs/15/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT" rel="noopener noreferrer"&gt;current date&lt;/a&gt; YYYY-MM-DD&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Calculate &lt;a href="https://www.postgresql.org/docs/15/functions-datetime.html#:~:text=age%20(%20timestamp%2C%20timestamp%20)%20%E2%86%92%20interval" rel="noopener noreferrer"&gt;age&lt;/a&gt; between two dates&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT age(timestamp, timestamp);

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

&lt;/div&gt;



&lt;p&gt;Show &lt;a href="https://www.postgresql.org/docs/15/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT" rel="noopener noreferrer"&gt;current time&lt;/a&gt; with time zone&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.postgresql.org/docs/15/functions-datetime.html#:~:text=make_date%20(%20year%20int%2C%20month%20int%2C%20day%20int%20)%20%E2%86%92%20date" rel="noopener noreferrer"&gt;Make&lt;/a&gt; dates using integers&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT make_date(2021,03,25);

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  📌 &lt;a id="mysql"&gt;&lt;/a&gt; MySQL
&lt;/h2&gt;

&lt;h1&gt;
  
  
  MySQL Cheat Sheet &amp;amp; Quick Reference
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Managing tables
&lt;/h3&gt;

&lt;p&gt;Create a new table with three columns&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE t (
     id    INT,
     name  VARCHAR DEFAULT NOT NULL,
     price INT DEFAULT 0
     PRIMARY KEY(id)
);

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

&lt;/div&gt;



&lt;p&gt;Delete the table from the database&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Add a new column to the table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER TABLE t ADD column;

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

&lt;/div&gt;



&lt;p&gt;Drop column c from the table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER TABLE t DROP COLUMN c ;

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

&lt;/div&gt;



&lt;p&gt;Add a constraint&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER TABLE t ADD constraint;

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

&lt;/div&gt;



&lt;p&gt;Drop a constraint&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER TABLE t DROP constraint;

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

&lt;/div&gt;



&lt;p&gt;Rename a table from t1 to t2&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER TABLE t1 RENAME TO t2;

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

&lt;/div&gt;



&lt;p&gt;Rename column c1 to c2&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER TABLE t1 RENAME c1 TO c2 ;

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

&lt;/div&gt;



&lt;p&gt;Remove all data in a table&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Querying data from a table
&lt;/h3&gt;

&lt;p&gt;Query data in columns c1, c2 from a table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 FROM t

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

&lt;/div&gt;



&lt;p&gt;Query all rows and columns from a table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM t

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

&lt;/div&gt;



&lt;p&gt;Query data and filter rows with a condition&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 FROM t
WHERE condition

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

&lt;/div&gt;



&lt;p&gt;Query distinct rows from a table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT DISTINCT c1 FROM t
WHERE condition

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

&lt;/div&gt;



&lt;p&gt;Sort the result set in ascending or descending order&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 FROM t
ORDER BY c1 ASC [DESC]

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

&lt;/div&gt;



&lt;p&gt;Skip offset of rows and return the next n rows&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 FROM t
ORDER BY c1 
LIMIT n OFFSET offset

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

&lt;/div&gt;



&lt;p&gt;Group rows using an aggregate function&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, aggregate(c2)
FROM t
GROUP BY c1

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

&lt;/div&gt;



&lt;p&gt;Filter groups using HAVING clause&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, aggregate(c2)
FROM t
GROUP BY c1
HAVING condition

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Querying from multiple tables
&lt;/h3&gt;

&lt;p&gt;Inner join t1 and t2&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 
FROM t1
INNER JOIN t2 ON condition

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

&lt;/div&gt;



&lt;p&gt;Left join t1 and t1&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 
FROM t1
LEFT JOIN t2 ON condition

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

&lt;/div&gt;



&lt;p&gt;Right join t1 and t2&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 
FROM t1
RIGHT JOIN t2 ON condition

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

&lt;/div&gt;



&lt;p&gt;Perform full outer join&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 
FROM t1
FULL OUTER JOIN t2 ON condition

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

&lt;/div&gt;



&lt;p&gt;Produce a Cartesian product of rows in tables&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 
FROM t1
CROSS JOIN t2

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

&lt;/div&gt;



&lt;p&gt;Another way to perform cross join&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 
FROM t1, t2

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

&lt;/div&gt;



&lt;p&gt;Join t1 to itself using INNER JOIN clause&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2
FROM t1 A
INNER JOIN t1 B ON condition

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

&lt;/div&gt;



&lt;p&gt;Using SQL Operators Combine rows from two queries&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 FROM t1
UNION [ALL]
SELECT c1, c2 FROM t2

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

&lt;/div&gt;



&lt;p&gt;Return the intersection of two queries&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 FROM t1
INTERSECT
SELECT c1, c2 FROM t2

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

&lt;/div&gt;



&lt;p&gt;Subtract a result set from another result set&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 FROM t1
MINUS
SELECT c1, c2 FROM t2

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

&lt;/div&gt;



&lt;p&gt;Query rows using pattern matching %, _&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 FROM t1
WHERE c1 [NOT] LIKE pattern

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

&lt;/div&gt;



&lt;p&gt;Query rows in a list&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 FROM t
WHERE c1 [NOT] IN value_list

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

&lt;/div&gt;



&lt;p&gt;Query rows between two values&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 FROM t
WHERE  c1 BETWEEN low AND high

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

&lt;/div&gt;



&lt;p&gt;Check if values in a table is NULL or not&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c1, c2 FROM t
WHERE  c1 IS [NOT] NULL

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using SQL constraints
&lt;/h3&gt;

&lt;p&gt;Set c1 and c2 as a primary key&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE t(
    c1 INT, c2 INT, c3 VARCHAR,
    PRIMARY KEY (c1,c2)
);

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

&lt;/div&gt;



&lt;p&gt;Set c2 column as a foreign key&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE t1(
    c1 INT PRIMARY KEY,  
    c2 INT,
    FOREIGN KEY (c2) REFERENCES t2(c2)
);

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

&lt;/div&gt;



&lt;p&gt;Make the values in c1 and c2 unique&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE t(
    c1 INT, c1 INT,
    UNIQUE(c2,c3)
);

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

&lt;/div&gt;



&lt;p&gt;Ensure c1 &amp;gt; 0 and values in c1 &amp;gt;= c2&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE t(
  c1 INT, c2 INT,
  CHECK(c1&amp;gt; 0 AND c1 &amp;gt;= c2)
);

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

&lt;/div&gt;



&lt;p&gt;Set values in c2 column not NULL&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE t(
     c1 INT PRIMARY KEY,
     c2 VARCHAR NOT NULL
);

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Modifying Data
&lt;/h3&gt;

&lt;p&gt;Insert one row into a table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INSERT INTO t(column_list)
VALUES(value_list);

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

&lt;/div&gt;



&lt;p&gt;Insert multiple rows into a table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INSERT INTO t(column_list)
VALUES (value_list), 
       (value_list), …;

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

&lt;/div&gt;



&lt;p&gt;Insert rows from t2 into t1&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INSERT INTO t1(column_list)
SELECT column_list
FROM t2;

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

&lt;/div&gt;



&lt;p&gt;Update new value in the column c1 for all rows&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UPDATE t
SET c1 = new_value;

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

&lt;/div&gt;



&lt;p&gt;Update values in the column c1, c2 that match the condition&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UPDATE t
SET c1 = new_value, 
        c2 = new_value
WHERE condition;

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

&lt;/div&gt;



&lt;p&gt;Delete all data in a table&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Delete subset of rows in a table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DELETE FROM t
WHERE condition;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Managing Views
&lt;/h3&gt;

&lt;p&gt;Create a new view that consists of c1 and c2&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE VIEW v(c1,c2) 
AS
SELECT c1, c2
FROM t;

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

&lt;/div&gt;



&lt;p&gt;Create a new view with check option&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE VIEW v(c1,c2) 
AS
SELECT c1, c2
FROM t;
WITH [CASCADED | LOCAL] CHECK OPTION;

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

&lt;/div&gt;



&lt;p&gt;Create a recursive view&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE RECURSIVE VIEW v 
AS
select-statement -- anchor part
UNION [ALL]
select-statement; -- recursive part

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

&lt;/div&gt;



&lt;p&gt;Create a temporary view&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TEMPORARY VIEW v 
AS
SELECT c1, c2
FROM t;

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

&lt;/div&gt;



&lt;p&gt;Delete a view&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Managing triggers
&lt;/h3&gt;

&lt;p&gt;Create or modify a trigger&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE OR MODIFY TRIGGER trigger_name
WHEN EVENT
ON table_name TRIGGER_TYPE
EXECUTE stored_procedure;

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  WHEN
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BEFORE&lt;/td&gt;
&lt;td&gt;invoke before the event occurs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AFTER&lt;/td&gt;
&lt;td&gt;invoke after the event occurs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  EVENT
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;INSERT&lt;/td&gt;
&lt;td&gt;invoke for INSERT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;td&gt;invoke for UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;invoke for DELETE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  TRIGGER_TYPE
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FOR EACH ROW&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FOR EACH STATEMENT&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Managing indexes
&lt;/h3&gt;

&lt;p&gt;Create an index on c1 and c2 of the t table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE INDEX idx_name 
ON t(c1,c2);

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

&lt;/div&gt;



&lt;p&gt;Create a unique index on c3, c4 of the t table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE UNIQUE INDEX idx_name
ON t(c3,c4)

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

&lt;/div&gt;



&lt;p&gt;Drop an index&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  📌 &lt;a id="redis"&gt;&lt;/a&gt; Redis
&lt;/h2&gt;

&lt;h1&gt;
  
  
  Redis Cheat Sheet &amp;amp; Quick Reference
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Redis
&lt;/h2&gt;

&lt;p&gt;This is a &lt;a href="https://redis.io/" rel="noopener noreferrer"&gt;redis&lt;/a&gt; quick reference cheat sheet that lists examples of redis commands&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Getting started
&lt;/h3&gt;

&lt;p&gt;Start Redis&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Connect to redis (Redis CLI client)&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Connect to redis (telnet)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ telnet 127.0.0.1 6379

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Hello World
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Ping
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; PING
PONG

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Hello World
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "Hello world"
OK
redis&amp;gt; GET mykey
"Hello world"

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Basic Data types
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Strings
&lt;/li&gt;
&lt;li&gt;  Lists
&lt;/li&gt;
&lt;li&gt;  Hashes
&lt;/li&gt;
&lt;li&gt;  Sets
&lt;/li&gt;
&lt;li&gt;  Sorted Sets
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Redis supports 5 basic data types&lt;/p&gt;

&lt;h2&gt;
  
  
  Redis String command
&lt;/h2&gt;

&lt;h3&gt;
  
  
  APPEND
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; EXISTS mykey
(integer) 0
redis&amp;gt; APPEND mykey "Hello"
(integer) 5
redis&amp;gt; APPEND mykey " World"
(integer) 11
redis&amp;gt; GET mykey
"Hello World"

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

&lt;/div&gt;



&lt;p&gt;Append a value to a key&lt;/p&gt;

&lt;h3&gt;
  
  
  BITCOUNT
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BITCOUNT key [start end]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "foobar"
"OK"
redis&amp;gt; BITCOUNT mykey
(integer) 26
redis&amp;gt; BITCOUNT mykey 0 0
(integer) 4
redis&amp;gt; BITCOUNT mykey 1 1
(integer) 6

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

&lt;/div&gt;



&lt;p&gt;Count set bits in a string&lt;/p&gt;

&lt;h3&gt;
  
  
  BITFIELD
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; BITFIELD mykey INCRBY i5 100 1 GET u4 0
1) (integer) 1
2) (integer) 0

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

&lt;/div&gt;



&lt;p&gt;Perform arbitrary bitfield integer operations on strings&lt;/p&gt;

&lt;h3&gt;
  
  
  BITOP
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BITOP operation destkey key [key ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET key1 "foobar"
"OK"
redis&amp;gt; SET key2 "abcdef"
"OK"
redis&amp;gt; BITOP AND dest key1 key2
(integer) 6
redis&amp;gt; GET dest
"`bc`ab"

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

&lt;/div&gt;



&lt;p&gt;Perform bitwise operations between strings&lt;/p&gt;

&lt;h3&gt;
  
  
  BITPOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BITPOS key bit [start] [end]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "\xff\xf0\x00"
"OK"
redis&amp;gt; BITPOS mykey 0
(integer) 12
redis&amp;gt; SET mykey "\x00\xff\xf0"
"OK"
redis&amp;gt; BITPOS mykey 1 0
(integer) 8
redis&amp;gt; BITPOS mykey 1 2
(integer) 16
redis&amp;gt; set mykey "\x00\x00\x00"
"OK"
redis&amp;gt; BITPOS mykey 1
(integer) -1

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

&lt;/div&gt;



&lt;p&gt;Find first bit set or clear in a string&lt;/p&gt;

&lt;h3&gt;
  
  
  DECR
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "10"
"OK"
redis&amp;gt; DECR mykey
(integer) 9
redis&amp;gt; SET mykey "234293482390480948029348230948"
"OK"
redis&amp;gt; DECR mykey
ERR ERR value is not an integer or out of range

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

&lt;/div&gt;



&lt;p&gt;Decrement the integer value of a key by one&lt;/p&gt;

&lt;h3&gt;
  
  
  DECRBY
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "10"
"OK"
redis&amp;gt; DECRBY mykey 3
(integer) 7

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

&lt;/div&gt;



&lt;p&gt;Decrement the integer value of a key by the given number&lt;/p&gt;

&lt;h3&gt;
  
  
  GET
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; GET nonexisting
(nil)
redis&amp;gt; SET mykey "Hello"
"OK"
redis&amp;gt; GET mykey
"Hello"

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

&lt;/div&gt;



&lt;p&gt;Get the value of a key&lt;/p&gt;

&lt;h3&gt;
  
  
  GETBIT
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SETBIT mykey 7 1
(integer) 0
redis&amp;gt; GETBIT mykey 0
(integer) 0
redis&amp;gt; GETBIT mykey 7
(integer) 1
redis&amp;gt; GETBIT mykey 100
(integer) 0

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

&lt;/div&gt;



&lt;p&gt;Returns the bit value at offset in the string value stored at key&lt;/p&gt;

&lt;h3&gt;
  
  
  GETRANGE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GETRANGE key start end

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "This is a string"
"OK"
redis&amp;gt; GETRANGE mykey 0 3
"This"
redis&amp;gt; GETRANGE mykey -3 -1
"ing"
redis&amp;gt; GETRANGE mykey 0 -1
"This is a string"
redis&amp;gt; GETRANGE mykey 10 100
"string"

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

&lt;/div&gt;



&lt;p&gt;Get a substring of the string stored at a key&lt;/p&gt;

&lt;h3&gt;
  
  
  GETSET
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; INCR mycounter
(integer) 1
redis&amp;gt; GETSET mycounter "0"
"1"
redis&amp;gt; GET mycounter
"0"

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

&lt;/div&gt;



&lt;p&gt;Set the string value of a key and return its old value&lt;/p&gt;

&lt;h3&gt;
  
  
  INCR
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "10"
"OK"
redis&amp;gt; INCR mykey
(integer) 11
redis&amp;gt; GET mykey
"11"

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

&lt;/div&gt;



&lt;p&gt;Increment the integer value of a key by one&lt;/p&gt;

&lt;h3&gt;
  
  
  MSETNX
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MSETNX key value [key value ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; MSETNX key1 "Hello" key2 "there"
(integer) 1
redis&amp;gt; MSETNX key2 "new" key3 "world"
(integer) 0
redis&amp;gt; MGET key1 key2 key3
1) "Hello"
2) "there"
3) (nil)

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

&lt;/div&gt;



&lt;p&gt;Set multiple keys to multiple values, only if none of the keys exist&lt;/p&gt;

&lt;h3&gt;
  
  
  INCRBYFLOAT
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey 10.50
"OK"
redis&amp;gt; INCRBYFLOAT mykey 0.1
"10.6"
redis&amp;gt; INCRBYFLOAT mykey -5
"5.6"
redis&amp;gt; SET mykey 5.0e3
"OK"
redis&amp;gt; INCRBYFLOAT mykey 2.0e2
"5200"

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

&lt;/div&gt;



&lt;p&gt;Increment the float value of a key by the given amount&lt;/p&gt;

&lt;h3&gt;
  
  
  MGET
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MGET key [key ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET key1 "Hello"
"OK"
redis&amp;gt; SET key2 "World"
"OK"
redis&amp;gt; MGET key1 key2 nonexisting
1) "Hello"
2) "World"
3) (nil)

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

&lt;/div&gt;



&lt;p&gt;Get the values of all the given keys&lt;/p&gt;

&lt;h3&gt;
  
  
  MSET
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MSET key value [key value ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; MSET key1 "Hello" key2 "World"
"OK"
redis&amp;gt; GET key1
"Hello"
redis&amp;gt; GET key2
"World"

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

&lt;/div&gt;



&lt;p&gt;Set multiple keys to multiple values&lt;/p&gt;

&lt;h3&gt;
  
  
  INCRBY
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "10"
"OK"
redis&amp;gt; INCRBY mykey 5
(integer) 15

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

&lt;/div&gt;



&lt;p&gt;Increment the integer value of a key by the given amount&lt;/p&gt;

&lt;h3&gt;
  
  
  PSETEX
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PSETEX key milliseconds value

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; PSETEX mykey 1000 "Hello"
"OK"
redis&amp;gt; PTTL mykey
(integer) 1000
redis&amp;gt; GET mykey
"Hello"

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

&lt;/div&gt;



&lt;p&gt;Set the value and expiration in milliseconds of a key&lt;/p&gt;

&lt;h3&gt;
  
  
  SET
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SET key value [EX seconds|PX milliseconds|KEEPTTL] [NX|XX] [GET]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "Hello"
"OK"
redis&amp;gt; GET mykey
"Hello"
redis&amp;gt; SET anotherkey "will expire in a minute" EX 60
"OK"

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

&lt;/div&gt;



&lt;p&gt;Set the string value of a key&lt;/p&gt;

&lt;h3&gt;
  
  
  SETBIT
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SETBIT key offset value

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SETBIT mykey 7 1
(integer) 0
redis&amp;gt; SETBIT mykey 7 0
(integer) 1
redis&amp;gt; GET mykey
"\u0000"

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

&lt;/div&gt;



&lt;p&gt;Sets or clears the bit at offset in the string value stored at key&lt;/p&gt;

&lt;h3&gt;
  
  
  SETEX
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SETEX key seconds value

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SETEX mykey 10 "Hello"
"OK"
redis&amp;gt; TTL mykey
(integer) 10
redis&amp;gt; GET mykey
"Hello"

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

&lt;/div&gt;



&lt;p&gt;Set the value and expiration of a key&lt;/p&gt;

&lt;h3&gt;
  
  
  SETNX
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SETNX mykey "Hello"
(integer) 1
redis&amp;gt; SETNX mykey "World"
(integer) 0
redis&amp;gt; GET mykey
"Hello"

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

&lt;/div&gt;



&lt;p&gt;Set the value of a key, only if the key does not exist&lt;/p&gt;

&lt;h3&gt;
  
  
  SETRANGE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SETRANGE key offset value

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET key1 "Hello World"
"OK"
redis&amp;gt; SETRANGE key1 6 "Redis"
(integer) 11
redis&amp;gt; GET key1
"Hello Redis"

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

&lt;/div&gt;



&lt;p&gt;Overwrite part of a string at key starting at the specified offset&lt;/p&gt;

&lt;h3&gt;
  
  
  STRLEN
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "Hello world"
"OK"
redis&amp;gt; STRLEN mykey
(integer) 11
redis&amp;gt; STRLEN nonexisting
(integer) 0

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

&lt;/div&gt;



&lt;p&gt;Get the length of the value stored in a key&lt;/p&gt;

&lt;h3&gt;
  
  
  STRALGO
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;STRALGO LCS algo-specific-argument [algo-specific-argument ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; STRALGO LCS KEYS key1 key2 IDX
1) "matches"
2) 1) 1) 1) (integer) 4
         2) (integer) 7
      2) 1) (integer) 5
         2) (integer) 8
   2) 1) 1) (integer) 2
         2) (integer) 3
      2) 1) (integer) 0
         2) (integer) 1
3) "len"
4) (integer) 6

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

&lt;/div&gt;



&lt;p&gt;Run algorithms (currently LCS) against strings&lt;/p&gt;

&lt;h2&gt;
  
  
  Redis Set command
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SADD
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SADD key member [member ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SADD myset "Hello"
(integer) 1
redis&amp;gt; SADD myset "World"
(integer) 1
redis&amp;gt; SADD myset "World"
(integer) 0
redis&amp;gt; SMEMBERS myset
1) "Hello"
2) "World"

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

&lt;/div&gt;



&lt;p&gt;Add one or more members to a set&lt;/p&gt;

&lt;h3&gt;
  
  
  SCARD
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SADD myset "Hello"
(integer) 1
redis&amp;gt; SADD myset "World"
(integer) 1
redis&amp;gt; SCARD myset
(integer) 2

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

&lt;/div&gt;



&lt;p&gt;Get the number of members in a set&lt;/p&gt;

&lt;h3&gt;
  
  
  SDIFF
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SDIFF key [key ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SADD key1 "a"
(integer) 1
redis&amp;gt; SADD key1 "b"
(integer) 1
redis&amp;gt; SADD key1 "c"
(integer) 1
redis&amp;gt; SADD key2 "c"
(integer) 1
redis&amp;gt; SADD key2 "d"
(integer) 1
redis&amp;gt; SADD key2 "e"
(integer) 1
redis&amp;gt; SDIFF key1 key2
1) "a"
2) "b"

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

&lt;/div&gt;



&lt;p&gt;Subtract multiple sets&lt;/p&gt;

&lt;h3&gt;
  
  
  SDIFFSTORE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SDIFFSTORE destination key [key ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SADD key1 "a"
(integer) 1
redis&amp;gt; SADD key1 "b"
(integer) 1
redis&amp;gt; SADD key1 "c"
(integer) 1
redis&amp;gt; SADD key2 "c"
(integer) 1
redis&amp;gt; SADD key2 "d"
(integer) 1
redis&amp;gt; SADD key2 "e"
(integer) 1
redis&amp;gt; SDIFFSTORE key key1 key2
(integer) 2
redis&amp;gt; SMEMBERS key
1) "a"
2) "b"

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

&lt;/div&gt;



&lt;p&gt;Subtract multiple sets and store the resulting set in a key&lt;/p&gt;

&lt;h3&gt;
  
  
  SINTER
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SINTER key [key ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SADD key1 "a"
(integer) 1
redis&amp;gt; SADD key1 "b"
(integer) 1
redis&amp;gt; SADD key1 "c"
(integer) 1
redis&amp;gt; SADD key2 "c"
(integer) 1
redis&amp;gt; SADD key2 "d"
(integer) 1
redis&amp;gt; SADD key2 "e"
(integer) 1
redis&amp;gt; SINTER key1 key2
1) "c"

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

&lt;/div&gt;



&lt;p&gt;Intersect multiple sets&lt;/p&gt;

&lt;h3&gt;
  
  
  SINTERSTORE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SINTERSTORE destination key [key ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SADD key1 "a"
(integer) 1
redis&amp;gt; SADD key1 "b"
(integer) 1
redis&amp;gt; SADD key1 "c"
(integer) 1
redis&amp;gt; SADD key2 "c"
(integer) 1
redis&amp;gt; SADD key2 "d"
(integer) 1
redis&amp;gt; SADD key2 "e"
(integer) 1
redis&amp;gt; SINTERSTORE key key1 key2
(integer) 1
redis&amp;gt; SMEMBERS key
1) "c"

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

&lt;/div&gt;



&lt;p&gt;Intersect multiple sets and store the resulting set in a key&lt;/p&gt;

&lt;h3&gt;
  
  
  SISMEMBER
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SADD myset "one"
(integer) 1
redis&amp;gt; SISMEMBER myset "one"
(integer) 1
redis&amp;gt; SISMEMBER myset "two"
(integer) 0

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

&lt;/div&gt;



&lt;p&gt;Determine if a given value is a member of a set&lt;/p&gt;

&lt;h3&gt;
  
  
  SMISMEMBER
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SMISMEMBER key member [member ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SADD myset "one"
(integer) 1
redis&amp;gt; SADD myset "one"
(integer) 0
redis&amp;gt; SMISMEMBER myset "one" "notamember"
1) (integer) 1
2) (integer) 0

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

&lt;/div&gt;



&lt;p&gt;Returns the membership associated with the given elements for a set&lt;/p&gt;

&lt;h3&gt;
  
  
  SMEMBERS
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SADD myset "Hello"
(integer) 1
redis&amp;gt; SADD myset "World"
(integer) 1
redis&amp;gt; SMEMBERS myset
1) "Hello"
2) "World"

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

&lt;/div&gt;



&lt;p&gt;Get all the members in a set&lt;/p&gt;

&lt;h3&gt;
  
  
  SMOVE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SMOVE source destination member

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SADD myset "one"
(integer) 1
redis&amp;gt; SADD myset "two"
(integer) 1
redis&amp;gt; SADD myotherset "three"
(integer) 1
redis&amp;gt; SMOVE myset myotherset "two"
(integer) 1
redis&amp;gt; SMEMBERS myset
1) "one"
redis&amp;gt; SMEMBERS myotherset
1) "two"
2) "three"

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

&lt;/div&gt;



&lt;p&gt;Move a member from one set to another&lt;/p&gt;

&lt;h3&gt;
  
  
  SPOP
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SPOP key [count]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SADD myset "one"
(integer) 1
redis&amp;gt; SADD myset "two"
(integer) 1
redis&amp;gt; SADD myset "three"
(integer) 1
redis&amp;gt; SPOP myset
"two"
redis&amp;gt; SMEMBERS myset
1) "one"
2) "three"
redis&amp;gt; SADD myset "four"
(integer) 1
redis&amp;gt; SADD myset "five"
(integer) 1
redis&amp;gt; SPOP myset 3
1) "four"
2) "five"
3) "three"
redis&amp;gt; SMEMBERS myset
1) "one"

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

&lt;/div&gt;



&lt;p&gt;Remove and return one or multiple random members from a set&lt;/p&gt;

&lt;h3&gt;
  
  
  SRANDMEMBER
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SRANDMEMBER key [count]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SADD myset one two three
(integer) 3
redis&amp;gt; SRANDMEMBER myset
"three"
redis&amp;gt; SRANDMEMBER myset 2
1) "two"
2) "three"
redis&amp;gt; SRANDMEMBER myset -5
1) "one"
2) "two"
3) "three"
4) "three"
5) "one"

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

&lt;/div&gt;



&lt;p&gt;Get one or multiple random members from a set&lt;/p&gt;

&lt;h3&gt;
  
  
  SREM
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SREM key member [member ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SADD myset "one"
(integer) 1
redis&amp;gt; SADD myset "two"
(integer) 1
redis&amp;gt; SADD myset "three"
(integer) 1
redis&amp;gt; SREM myset "one"
(integer) 1
redis&amp;gt; SREM myset "four"
(integer) 0
redis&amp;gt; SMEMBERS myset
1) "two"
2) "three"

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

&lt;/div&gt;



&lt;p&gt;Remove one or more members from a set&lt;/p&gt;

&lt;h3&gt;
  
  
  SUNION
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SUNION key [key ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SADD key1 "a"
(integer) 1
redis&amp;gt; SADD key1 "b"
(integer) 1
redis&amp;gt; SADD key1 "c"
(integer) 1
redis&amp;gt; SADD key2 "c"
(integer) 1
redis&amp;gt; SADD key2 "d"
(integer) 1
redis&amp;gt; SADD key2 "e"
(integer) 1
redis&amp;gt; SUNION key1 key2
1) "a"
2) "c"
3) "e"
4) "b"
5) "d"

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

&lt;/div&gt;



&lt;p&gt;Add multiple sets&lt;/p&gt;

&lt;h3&gt;
  
  
  SUNIONSTORE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SUNIONSTORE destination key [key ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SADD key1 "a"
(integer) 1
redis&amp;gt; SADD key1 "b"
(integer) 1
redis&amp;gt; SADD key1 "c"
(integer) 1
redis&amp;gt; SADD key2 "c"
(integer) 1
redis&amp;gt; SADD key2 "d"
(integer) 1
redis&amp;gt; SADD key2 "e"
(integer) 1
redis&amp;gt; SUNIONSTORE key key1 key2
(integer) 5
redis&amp;gt; SMEMBERS key
1) "a"
2) "c"
3) "e"
4) "b"
5) "d"

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

&lt;/div&gt;



&lt;p&gt;Add multiple sets and store the resulting set in a key&lt;/p&gt;

&lt;h2&gt;
  
  
  Redis List command
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Misc
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;-: BRPOPLPUSH 

&lt;ul&gt;
&lt;li&gt;-: Pop an element from a list, push it to another list and return it; or block until one is available&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: BLMOVE 

&lt;ul&gt;
&lt;li&gt;-: Pop an element from a list, push it to another list and return it; or block until one is available&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  BLPOP
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BLPOP key [key ...] timeout

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; DEL list1 list2
(integer) 0
redis&amp;gt; RPUSH list1 a b c
(integer) 3
redis&amp;gt; BLPOP list1 list2 0
1) "list1"
2) "a"

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

&lt;/div&gt;



&lt;p&gt;Remove and get the first element in a list, or block until one is available |&lt;/p&gt;

&lt;h3&gt;
  
  
  BRPOP
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BRPOP key [key ...] timeout

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; DEL list1 list2
(integer) 0
redis&amp;gt; RPUSH list1 a b c
(integer) 3
redis&amp;gt; BRPOP list1 list2 0
1) "list1"
2) "c"

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

&lt;/div&gt;



&lt;p&gt;Remove and get the last element in a list, or block until one is available |&lt;/p&gt;

&lt;h3&gt;
  
  
  LINDEX
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; LPUSH mylist "World"
(integer) 1
redis&amp;gt; LPUSH mylist "Hello"
(integer) 2
redis&amp;gt; LINDEX mylist 0
"Hello"
redis&amp;gt; LINDEX mylist -1
"World"
redis&amp;gt; LINDEX mylist 3
(nil)

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

&lt;/div&gt;



&lt;p&gt;Get an element from a list by its index&lt;/p&gt;

&lt;h3&gt;
  
  
  LINSERT
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LINSERT key BEFORE|AFTER pivot element

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; RPUSH mylist "Hello"
(integer) 1
redis&amp;gt; RPUSH mylist "World"
(integer) 2
redis&amp;gt; LINSERT mylist BEFORE "World" "There"
(integer) 3
redis&amp;gt; LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"

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

&lt;/div&gt;



&lt;p&gt;Insert an element before or after another element in a list&lt;/p&gt;

&lt;h3&gt;
  
  
  LLEN
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; LPUSH mylist "World"
(integer) 1
redis&amp;gt; LPUSH mylist "Hello"
(integer) 2
redis&amp;gt; LLEN mylist
(integer) 2

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

&lt;/div&gt;



&lt;p&gt;Get the length of a list&lt;/p&gt;

&lt;h3&gt;
  
  
  LPOP
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LPOP key [count]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; RPUSH mylist "one"
(integer) 1
redis&amp;gt; RPUSH mylist "two"
(integer) 2
redis&amp;gt; RPUSH mylist "three"
(integer) 3
redis&amp;gt; LPOP mylist
"one"
redis&amp;gt; LRANGE mylist 0 -1
1) "two"
2) "three"

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

&lt;/div&gt;



&lt;p&gt;Remove and get the first elements in a list&lt;/p&gt;

&lt;h3&gt;
  
  
  LPOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; RPUSH mylist a b c d 1 2 3 4 3 3 3
(integer) 11
redis&amp;gt; LPOS mylist 3
(integer) 6
redis&amp;gt; LPOS mylist 3 COUNT 0 RANK 2
1) (integer) 8
2) (integer) 9
3) (integer) 10

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

&lt;/div&gt;



&lt;p&gt;Return the index of matching elements on a list&lt;/p&gt;

&lt;h3&gt;
  
  
  LPUSH
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LPUSH key element [element ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; LPUSH mylist "world"
(integer) 1
redis&amp;gt; LPUSH mylist "hello"
(integer) 2
redis&amp;gt; LRANGE mylist 0 -1
1) "hello"
2) "world"

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

&lt;/div&gt;



&lt;p&gt;Prepend one or multiple elements to a list&lt;/p&gt;

&lt;h3&gt;
  
  
  LPUSHX
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LPUSHX key element [element ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; LPUSH mylist "World"
(integer) 1
redis&amp;gt; LPUSHX mylist "Hello"
(integer) 2
redis&amp;gt; LPUSHX myotherlist "Hello"
(integer) 0
redis&amp;gt; LRANGE mylist 0 -1
1) "Hello"
2) "World"
redis&amp;gt; LRANGE myotherlist 0 -1
(empty list or set)

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

&lt;/div&gt;



&lt;p&gt;Prepend an element to a list, only if the list exists&lt;/p&gt;

&lt;h3&gt;
  
  
  LRANGE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LRANGE key start stop

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; RPUSH mylist "one"
(integer) 1
redis&amp;gt; RPUSH mylist "two"
(integer) 2
redis&amp;gt; RPUSH mylist "three"
(integer) 3
redis&amp;gt; LRANGE mylist 0 0
1) "one"
redis&amp;gt; LRANGE mylist -3 2
1) "one"
2) "two"
3) "three"
redis&amp;gt; LRANGE mylist -100 100
1) "one"
2) "two"
3) "three"
redis&amp;gt; LRANGE mylist 5 10
(empty list or set)

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

&lt;/div&gt;



&lt;p&gt;Get a range of elements from a list&lt;/p&gt;

&lt;h3&gt;
  
  
  LREM
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LREM key count element

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; RPUSH mylist "hello"
(integer) 1
redis&amp;gt; RPUSH mylist "hello"
(integer) 2
redis&amp;gt; RPUSH mylist "foo"
(integer) 3
redis&amp;gt; RPUSH mylist "hello"
(integer) 4
redis&amp;gt; LREM mylist -2 "hello"
(integer) 2
redis&amp;gt; LRANGE mylist 0 -1
1) "hello"
2) "foo"

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

&lt;/div&gt;



&lt;p&gt;Remove elements from a list&lt;/p&gt;

&lt;h3&gt;
  
  
  LSET
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LSET key index element

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; RPUSH mylist "one"
(integer) 1
redis&amp;gt; RPUSH mylist "two"
(integer) 2
redis&amp;gt; RPUSH mylist "three"
(integer) 3
redis&amp;gt; LSET mylist 0 "four"
"OK"
redis&amp;gt; LSET mylist -2 "five"
"OK"
redis&amp;gt; LRANGE mylist 0 -1
1) "four"
2) "five"
3) "three"

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

&lt;/div&gt;



&lt;p&gt;Set the value of an element in a list by its index&lt;/p&gt;

&lt;h3&gt;
  
  
  LTRIM
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LTRIM key start stop

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; RPUSH mylist "one"
(integer) 1
redis&amp;gt; RPUSH mylist "two"
(integer) 2
redis&amp;gt; RPUSH mylist "three"
(integer) 3
redis&amp;gt; LTRIM mylist 1 -1
"OK"
redis&amp;gt; LRANGE mylist 0 -1
1) "two"
2) "three"

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

&lt;/div&gt;



&lt;p&gt;Trim a list to the specified range&lt;/p&gt;

&lt;h3&gt;
  
  
  RPOP
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RPOP key [count]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; RPUSH mylist "one"
(integer) 1
redis&amp;gt; RPUSH mylist "two"
(integer) 2
redis&amp;gt; RPUSH mylist "three"
(integer) 3
redis&amp;gt; RPOP mylist
"three"
redis&amp;gt; LRANGE mylist 0 -1
1) "one"
2) "two"

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

&lt;/div&gt;



&lt;p&gt;Remove and get the last elements in a list&lt;/p&gt;

&lt;h3&gt;
  
  
  RPOPLPUSH
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; RPUSH mylist "one"
(integer) 1
redis&amp;gt; RPUSH mylist "two"
(integer) 2
redis&amp;gt; RPUSH mylist "three"
(integer) 3
redis&amp;gt; RPOPLPUSH mylist myotherlist
"three"
redis&amp;gt; LRANGE mylist 0 -1
1) "one"
2) "two"
redis&amp;gt; LRANGE myotherlist 0 -1
1) "three"

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

&lt;/div&gt;



&lt;p&gt;Remove the last element in a list, prepend it to another list and return it&lt;/p&gt;

&lt;h3&gt;
  
  
  LMOVE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LMOVE source destination LEFT|RIGHT LEFT|RIGHT

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; RPUSH mylist "one"
(integer) 1
redis&amp;gt; RPUSH mylist "two"
(integer) 2
redis&amp;gt; RPUSH mylist "three"
(integer) 3
redis&amp;gt; LMOVE mylist myotherlist RIGHT LEFT
"three"
redis&amp;gt; LMOVE mylist myotherlist LEFT RIGHT
"one"
redis&amp;gt; LRANGE mylist 0 -1
1) "two"
redis&amp;gt; LRANGE myotherlist 0 -1
1) "three"
2) "one"

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

&lt;/div&gt;



&lt;p&gt;Pop an element from a list, push it to another list and return it&lt;/p&gt;

&lt;h3&gt;
  
  
  RPUSH
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RPUSH key element [element ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; RPUSH mylist "hello"
(integer) 1
redis&amp;gt; RPUSH mylist "world"
(integer) 2
redis&amp;gt; LRANGE mylist 0 -1
1) "hello"
2) "world"

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

&lt;/div&gt;



&lt;p&gt;Append one or multiple elements to a list&lt;/p&gt;

&lt;h3&gt;
  
  
  RPUSHX
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RPUSHX key element [element ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; RPUSH mylist "Hello"
(integer) 1
redis&amp;gt; RPUSHX mylist "World"
(integer) 2
redis&amp;gt; RPUSHX myotherlist "World"
(integer) 0
redis&amp;gt; LRANGE mylist 0 -1
1) "Hello"
2) "World"
redis&amp;gt; LRANGE myotherlist 0 -1
(empty list or set)

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

&lt;/div&gt;



&lt;p&gt;Append an element to a list, only if the list exists&lt;/p&gt;

&lt;h2&gt;
  
  
  Redis Hash command
&lt;/h2&gt;

&lt;h3&gt;
  
  
  HDEL
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HDEL key field [field ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; HSET myhash field1 "foo"
(integer) 1
redis&amp;gt; HDEL myhash field1
(integer) 1
redis&amp;gt; HDEL myhash field2
(integer) 0

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

&lt;/div&gt;



&lt;p&gt;Delete one or more hash fields&lt;/p&gt;

&lt;h3&gt;
  
  
  HEXISTS
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; HSET myhash field1 "foo"
(integer) 1
redis&amp;gt; HEXISTS myhash field1
(integer) 1
redis&amp;gt; HEXISTS myhash field2
(integer) 0

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

&lt;/div&gt;



&lt;p&gt;Determine if a hash field exists&lt;/p&gt;

&lt;h3&gt;
  
  
  HGET
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; HSET myhash field1 "foo"
(integer) 1
redis&amp;gt; HGET myhash field1
"foo"
redis&amp;gt; HGET myhash field2
(nil)

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

&lt;/div&gt;



&lt;p&gt;Get the value of a hash field&lt;/p&gt;

&lt;h3&gt;
  
  
  HGETALL
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; HSET myhash field1 "Hello"
(integer) 1
redis&amp;gt; HSET myhash field2 "World"
(integer) 1
redis&amp;gt; HGETALL myhash
1) "field1"
2) "Hello"
3) "field2"
4) "World"

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

&lt;/div&gt;



&lt;p&gt;Get all the fields and values in a hash&lt;/p&gt;

&lt;h3&gt;
  
  
  HINCRBY
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HINCRBY key field increment

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; HSET myhash field 5
(integer) 1
redis&amp;gt; HINCRBY myhash field 1
(integer) 6
redis&amp;gt; HINCRBY myhash field -1
(integer) 5
redis&amp;gt; HINCRBY myhash field -10
(integer) -5

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

&lt;/div&gt;



&lt;p&gt;Increment the integer value of a hash field by the given number&lt;/p&gt;

&lt;h3&gt;
  
  
  HINCRBYFLOAT
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HINCRBYFLOAT key field increment

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; HSET mykey field 10.50
(integer) 1
redis&amp;gt; HINCRBYFLOAT mykey field 0.1
"10.6"
redis&amp;gt; HINCRBYFLOAT mykey field -5
"5.6"
redis&amp;gt; HSET mykey field 5.0e3
(integer) 0
redis&amp;gt; HINCRBYFLOAT mykey field 2.0e2
"5200"

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

&lt;/div&gt;



&lt;p&gt;Increment the float value of a hash field by the given amount&lt;/p&gt;

&lt;h3&gt;
  
  
  HKEYS
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; HSET myhash field1 "Hello"
(integer) 1
redis&amp;gt; HSET myhash field2 "World"
(integer) 1
redis&amp;gt; HKEYS myhash
1) "field1"
2) "field2"

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

&lt;/div&gt;



&lt;p&gt;Get all the fields in a hash&lt;/p&gt;

&lt;h3&gt;
  
  
  HLEN
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; HSET myhash field1 "Hello"
(integer) 1
redis&amp;gt; HSET myhash field2 "World"
(integer) 1
redis&amp;gt; HLEN myhash
(integer) 2

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

&lt;/div&gt;



&lt;p&gt;Get the number of fields in a hash&lt;/p&gt;

&lt;h3&gt;
  
  
  HMGET
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HMGET key field [field ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; HSET myhash field1 "Hello"
(integer) 1
redis&amp;gt; HSET myhash field2 "World"
(integer) 1
redis&amp;gt; HMGET myhash field1 field2 nofield
1) "Hello"
2) "World"
3) (nil)

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

&lt;/div&gt;



&lt;p&gt;Get the values of all the given hash fields&lt;/p&gt;

&lt;h3&gt;
  
  
  HMSET
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HMSET key field value [field value ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; HMSET myhash field1 "Hello" field2 "World"
"OK"
redis&amp;gt; HGET myhash field1
"Hello"
redis&amp;gt; HGET myhash field2
"World"

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

&lt;/div&gt;



&lt;p&gt;Set multiple hash fields to multiple values&lt;/p&gt;

&lt;h3&gt;
  
  
  HSET
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HSET key field value [field value ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; HSET myhash field1 "Hello"
(integer) 1
redis&amp;gt; HGET myhash field1
"Hello"

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

&lt;/div&gt;



&lt;p&gt;Set the string value of a hash field&lt;/p&gt;

&lt;h3&gt;
  
  
  HSETNX
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HSETNX key field value

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; HSETNX myhash field "Hello"
(integer) 1
redis&amp;gt; HSETNX myhash field "World"
(integer) 0
redis&amp;gt; HGET myhash field
"Hello"

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

&lt;/div&gt;



&lt;p&gt;Set the value of a hash field, only if the field does not exist&lt;/p&gt;

&lt;h3&gt;
  
  
  HSTRLEN
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; HMSET myhash f1 HelloWorld f2 99 f3 -256
"OK"
redis&amp;gt; HSTRLEN myhash f1
(integer) 10
redis&amp;gt; HSTRLEN myhash f2
(integer) 2
redis&amp;gt; HSTRLEN myhash f3
(integer) 4

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

&lt;/div&gt;



&lt;p&gt;Get the length of the value of a hash field&lt;/p&gt;

&lt;h3&gt;
  
  
  HVALS
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; HSET myhash field1 "Hello"
(integer) 1
redis&amp;gt; HSET myhash field2 "World"
(integer) 1
redis&amp;gt; HVALS myhash
1) "Hello"
2) "World"

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

&lt;/div&gt;



&lt;p&gt;Get all the values in a hash&lt;/p&gt;

&lt;h2&gt;
  
  
  Redis Sorted set command
&lt;/h2&gt;

&lt;h3&gt;
  
  
  BZPOPMIN
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BZPOPMIN key [key ...] timeout

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; DEL zset1 zset2
(integer) 0
redis&amp;gt; ZADD zset1 0 a 1 b 2 c
(integer) 3
redis&amp;gt; BZPOPMIN zset1 zset2 0
1) "zset1"
2) "a"
3) "0"

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

&lt;/div&gt;



&lt;p&gt;Remove and return the member with the lowest score from one or more sorted sets, or block until one is available&lt;/p&gt;

&lt;h3&gt;
  
  
  BZPOPMAX
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BZPOPMAX key [key ...] timeout

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; DEL zset1 zset2
(integer) 0
redis&amp;gt; ZADD zset1 0 a 1 b 2 c
(integer) 3
redis&amp;gt; BZPOPMAX zset1 zset2 0
1) "zset1"
2) "c"
3) "2"

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

&lt;/div&gt;



&lt;p&gt;Remove and return the member with the highest score from one or more sorted sets, or block until one is available&lt;/p&gt;

&lt;h3&gt;
  
  
  ZADD
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZADD myzset 1 "uno"
(integer) 1
redis&amp;gt; ZADD myzset 2 "two" 3 "three"
(integer) 2
redis&amp;gt; ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "uno"
4) "1"
5) "two"
6) "2"
7) "three"
8) "3"

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

&lt;/div&gt;



&lt;p&gt;Add one or more members to a sorted set, or update its score if it already exists&lt;/p&gt;

&lt;h3&gt;
  
  
  ZCARD
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZADD myzset 2 "two"
(integer) 1
redis&amp;gt; ZCARD myzset
(integer) 2

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

&lt;/div&gt;



&lt;p&gt;Get the number of members in a sorted set&lt;/p&gt;

&lt;h3&gt;
  
  
  ZSCORE
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZSCORE myzset "one"
"1"

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

&lt;/div&gt;



&lt;p&gt;Get the score associated with the given member in a sorted set&lt;/p&gt;

&lt;h3&gt;
  
  
  ZCOUNT
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZCOUNT key min max

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZADD myzset 2 "two"
(integer) 1
redis&amp;gt; ZADD myzset 3 "three"
(integer) 1
redis&amp;gt; ZCOUNT myzset -inf +inf
(integer) 3
redis&amp;gt; ZCOUNT myzset (1 3
(integer) 2

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

&lt;/div&gt;



&lt;p&gt;Count the members in a sorted set with scores within the given values&lt;/p&gt;

&lt;h3&gt;
  
  
  ZDIFF
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZDIFF numkeys key [key ...] [WITHSCORES]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD zset1 1 "one"
(integer) 1
redis&amp;gt; ZADD zset1 2 "two"
(integer) 1
redis&amp;gt; ZADD zset1 3 "three"
(integer) 1
redis&amp;gt; ZADD zset2 1 "one"
(integer) 1
redis&amp;gt; ZADD zset2 2 "two"
(integer) 1
redis&amp;gt; ZDIFF 2 zset1 zset2
1) "three"
redis&amp;gt; ZDIFF 2 zset1 zset2 WITHSCORES
1) "three"
2) "3"

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

&lt;/div&gt;



&lt;p&gt;Subtract multiple sorted sets&lt;/p&gt;

&lt;h3&gt;
  
  
  ZDIFFSTORE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZDIFFSTORE destination numkeys key [key ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD zset1 1 "one"
(integer) 1
redis&amp;gt; ZADD zset1 2 "two"
(integer) 1
redis&amp;gt; ZADD zset1 3 "three"
(integer) 1
redis&amp;gt; ZADD zset2 1 "one"
(integer) 1
redis&amp;gt; ZADD zset2 2 "two"
(integer) 1
redis&amp;gt; ZDIFFSTORE out 2 zset1 zset2
(integer) 1
redis&amp;gt; ZRANGE out 0 -1 WITHSCORES
1) "three"
2) "3"

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

&lt;/div&gt;



&lt;p&gt;Subtract multiple sorted sets and store the resulting sorted set in a new key&lt;/p&gt;

&lt;h3&gt;
  
  
  ZINCRBY
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZINCRBY key increment member

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZADD myzset 2 "two"
(integer) 1
redis&amp;gt; ZINCRBY myzset 2 "one"
"3"
redis&amp;gt; ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "one"
4) "3"

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

&lt;/div&gt;



&lt;p&gt;Increment the score of a member in a sorted set&lt;/p&gt;

&lt;h3&gt;
  
  
  ZINTER
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZINTER numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD zset1 1 "one"
(integer) 1
redis&amp;gt; ZADD zset1 2 "two"
(integer) 1
redis&amp;gt; ZADD zset2 1 "one"
(integer) 1
redis&amp;gt; ZADD zset2 2 "two"
(integer) 1
redis&amp;gt; ZADD zset2 3 "three"
(integer) 1
redis&amp;gt; ZINTER 2 zset1 zset2
1) "one"
2) "two"
redis&amp;gt; ZINTER 2 zset1 zset2 WITHSCORES
1) "one"
2) "2"
3) "two"
4) "4"

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

&lt;/div&gt;



&lt;p&gt;Intersect multiple sorted sets&lt;/p&gt;

&lt;h3&gt;
  
  
  ZINTERSTORE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD zset1 1 "one"
(integer) 1
redis&amp;gt; ZADD zset1 2 "two"
(integer) 1
redis&amp;gt; ZADD zset2 1 "one"
(integer) 1
redis&amp;gt; ZADD zset2 2 "two"
(integer) 1
redis&amp;gt; ZADD zset2 3 "three"
(integer) 1
redis&amp;gt; ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3
(integer) 2
redis&amp;gt; ZRANGE out 0 -1 WITHSCORES
1) "one"
2) "5"
3) "two"
4) "10"

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

&lt;/div&gt;



&lt;p&gt;Intersect multiple sorted sets and store the resulting sorted set in a new key&lt;/p&gt;

&lt;h3&gt;
  
  
  ZLEXCOUNT
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZLEXCOUNT key min max

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 0 a 0 b 0 c 0 d 0 e
(integer) 5
redis&amp;gt; ZADD myzset 0 f 0 g
(integer) 2
redis&amp;gt; ZLEXCOUNT myzset - +
(integer) 7
redis&amp;gt; ZLEXCOUNT myzset [b [f
(integer) 5

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

&lt;/div&gt;



&lt;p&gt;Count the number of members in a sorted set between a given lexicographical range&lt;/p&gt;

&lt;h3&gt;
  
  
  ZPOPMAX
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZPOPMAX key [count]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZADD myzset 2 "two"
(integer) 1
redis&amp;gt; ZADD myzset 3 "three"
(integer) 1
redis&amp;gt; ZPOPMAX myzset
1) "three"
2) "3"

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

&lt;/div&gt;



&lt;p&gt;Remove and return members with the highest scores in a sorted set&lt;/p&gt;

&lt;h3&gt;
  
  
  ZPOPMIN
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZPOPMIN key [count]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZADD myzset 2 "two"
(integer) 1
redis&amp;gt; ZADD myzset 3 "three"
(integer) 1
redis&amp;gt; ZPOPMIN myzset
1) "one"
2) "1"

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

&lt;/div&gt;



&lt;p&gt;Remove and return members with the lowest scores in a sorted set&lt;/p&gt;

&lt;h3&gt;
  
  
  ZRANGE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZRANGE key start stop [WITHSCORES]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZADD myzset 2 "two"
(integer) 1
redis&amp;gt; ZADD myzset 3 "three"
(integer) 1
redis&amp;gt; ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
redis&amp;gt; ZRANGE myzset 2 3
1) "three"
redis&amp;gt; ZRANGE myzset -2 -1
1) "two"
2) "three"

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

&lt;/div&gt;



&lt;p&gt;Return a range of members in a sorted set, by index&lt;/p&gt;

&lt;h3&gt;
  
  
  ZRANGEBYLEX
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZRANGEBYLEX key min max [LIMIT offset count]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g
(integer) 7
redis&amp;gt; ZRANGEBYLEX myzset - [c
1) "a"
2) "b"
3) "c"
redis&amp;gt; ZRANGEBYLEX myzset - (c
1) "a"
2) "b"
redis&amp;gt; ZRANGEBYLEX myzset [aaa (g
1) "b"
2) "c"
3) "d"
4) "e"
5) "f"

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

&lt;/div&gt;



&lt;p&gt;Return a range of members in a sorted set, by lexicographical range&lt;/p&gt;

&lt;h3&gt;
  
  
  ZREVRANGEBYLEX
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZREVRANGEBYLEX key max min [LIMIT offset count]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g
(integer) 7
redis&amp;gt; ZREVRANGEBYLEX myzset [c -
1) "c"
2) "b"
3) "a"
redis&amp;gt; ZREVRANGEBYLEX myzset (c -
1) "b"
2) "a"
redis&amp;gt; ZREVRANGEBYLEX myzset (g [aaa
1) "f"
2) "e"
3) "d"
4) "c"
5) "b"

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

&lt;/div&gt;



&lt;p&gt;Return a range of members in a sorted set, by lexicographical range, ordered from higher to lower strings.&lt;/p&gt;

&lt;h3&gt;
  
  
  ZRANGEBYSCORE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZADD myzset 2 "two"
(integer) 1
redis&amp;gt; ZADD myzset 3 "three"
(integer) 1
redis&amp;gt; ZRANGEBYSCORE myzset -inf +inf
1) "one"
2) "two"
3) "three"
redis&amp;gt; ZRANGEBYSCORE myzset 1 2
1) "one"
2) "two"
redis&amp;gt; ZRANGEBYSCORE myzset (1 2
1) "two"
redis&amp;gt; ZRANGEBYSCORE myzset (1 (2
(empty list or set)

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

&lt;/div&gt;



&lt;p&gt;Return a range of members in a sorted set, by score&lt;/p&gt;

&lt;h3&gt;
  
  
  ZRANK
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZADD myzset 2 "two"
(integer) 1
redis&amp;gt; ZADD myzset 3 "three"
(integer) 1
redis&amp;gt; ZRANK myzset "three"
(integer) 2
redis&amp;gt; ZRANK myzset "four"
(nil)

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

&lt;/div&gt;



&lt;p&gt;Determine the index of a member in a sorted set&lt;/p&gt;

&lt;h3&gt;
  
  
  ZREM
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZREM key member [member ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZADD myzset 2 "two"
(integer) 1
redis&amp;gt; ZADD myzset 3 "three"
(integer) 1
redis&amp;gt; ZREM myzset "two"
(integer) 1
redis&amp;gt; ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "three"
4) "3"

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

&lt;/div&gt;



&lt;p&gt;Remove one or more members from a sorted set&lt;/p&gt;

&lt;h3&gt;
  
  
  ZREMRANGEBYLEX
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZREMRANGEBYLEX key min max

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 0 aaaa 0 b 0 c 0 d 0 e
(integer) 5
redis&amp;gt; ZADD myzset 0 foo 0 zap 0 zip 0 ALPHA 0 alpha
(integer) 5
redis&amp;gt; ZRANGE myzset 0 -1
1) "ALPHA"
 2) "aaaa"
 3) "alpha"
 4) "b"
 5) "c"
 6) "d"
 7) "e"
 8) "foo"
 9) "zap"
10) "zip"
redis&amp;gt; ZREMRANGEBYLEX myzset [alpha [omega
(integer) 6
redis&amp;gt; ZRANGE myzset 0 -1
1) "ALPHA"
2) "aaaa"
3) "zap"
4) "zip"

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

&lt;/div&gt;



&lt;p&gt;Remove all members in a sorted set between the given lexicographical range&lt;/p&gt;

&lt;h3&gt;
  
  
  ZREMRANGEBYRANK
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZREMRANGEBYRANK key start stop

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZADD myzset 2 "two"
(integer) 1
redis&amp;gt; ZADD myzset 3 "three"
(integer) 1
redis&amp;gt; ZREMRANGEBYRANK myzset 0 1
(integer) 2
redis&amp;gt; ZRANGE myzset 0 -1 WITHSCORES
1) "three"
2) "3"

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

&lt;/div&gt;



&lt;p&gt;Remove all members in a sorted set within the given indexes&lt;/p&gt;

&lt;h3&gt;
  
  
  ZREMRANGEBYSCORE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZREMRANGEBYSCORE key min max

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZADD myzset 2 "two"
(integer) 1
redis&amp;gt; ZADD myzset 3 "three"
(integer) 1
redis&amp;gt; ZREMRANGEBYSCORE myzset -inf (2
(integer) 1
redis&amp;gt; ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "three"
4) "3"

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

&lt;/div&gt;



&lt;p&gt;Remove all members in a sorted set within the given scores&lt;/p&gt;

&lt;h3&gt;
  
  
  ZREVRANGE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZREVRANGE key start stop [WITHSCORES]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZADD myzset 2 "two"
(integer) 1
redis&amp;gt; ZADD myzset 3 "three"
(integer) 1
redis&amp;gt; ZREVRANGE myzset 0 -1
1) "three"
2) "two"
3) "one"
redis&amp;gt; ZREVRANGE myzset 2 3
1) "one"
redis&amp;gt; ZREVRANGE myzset -2 -1
1) "two"
2) "one"

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

&lt;/div&gt;



&lt;p&gt;Return a range of members in a sorted set, by index, with scores ordered from high to low&lt;/p&gt;

&lt;h3&gt;
  
  
  ZREVRANGEBYSCORE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZADD myzset 2 "two"
(integer) 1
redis&amp;gt; ZADD myzset 3 "three"
(integer) 1
redis&amp;gt; ZREVRANGEBYSCORE myzset +inf -inf
1) "three"
2) "two"
3) "one"
redis&amp;gt; ZREVRANGEBYSCORE myzset 2 1
1) "two"
2) "one"
redis&amp;gt; ZREVRANGEBYSCORE myzset 2 (1
1) "two"
redis&amp;gt; ZREVRANGEBYSCORE myzset (2 (1
(empty list or set)

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

&lt;/div&gt;



&lt;p&gt;Return a range of members in a sorted set, by score, with scores ordered from high to low&lt;/p&gt;

&lt;h3&gt;
  
  
  ZREVRANK
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZADD myzset 2 "two"
(integer) 1
redis&amp;gt; ZADD myzset 3 "three"
(integer) 1
redis&amp;gt; ZREVRANK myzset "one"
(integer) 2
redis&amp;gt; ZREVRANK myzset "four"
(nil)

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

&lt;/div&gt;



&lt;p&gt;Determine the index of a member in a sorted set, with scores ordered from high to low&lt;/p&gt;

&lt;h3&gt;
  
  
  ZUNION
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZUNION numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD zset1 1 "one"
(integer) 1
redis&amp;gt; ZADD zset1 2 "two"
(integer) 1
redis&amp;gt; ZADD zset2 1 "one"
(integer) 1
redis&amp;gt; ZADD zset2 2 "two"
(integer) 1
redis&amp;gt; ZADD zset2 3 "three"
(integer) 1
redis&amp;gt; ZUNION 2 zset1 zset2
1) "one"
2) "three"
3) "two"
redis&amp;gt; ZUNION 2 zset1 zset2 WITHSCORES
1) "one"
2) "2"
3) "three"
4) "3"
5) "two"
6) "4"

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

&lt;/div&gt;



&lt;p&gt;Add multiple sorted sets&lt;/p&gt;

&lt;h3&gt;
  
  
  ZMSCORE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZMSCORE key member [member ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD myzset 1 "one"
(integer) 1
redis&amp;gt; ZADD myzset 2 "two"
(integer) 1
redis&amp;gt; ZMSCORE myzset "one" "two" "nofield"
1) "1"
2) "2"
3) (nil)

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

&lt;/div&gt;



&lt;p&gt;Get the score associated with the given members in a sorted set&lt;/p&gt;

&lt;h3&gt;
  
  
  ZUNIONSTORE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ZADD zset1 1 "one"
(integer) 1
redis&amp;gt; ZADD zset1 2 "two"
(integer) 1
redis&amp;gt; ZADD zset2 1 "one"
(integer) 1
redis&amp;gt; ZADD zset2 2 "two"
(integer) 1
redis&amp;gt; ZADD zset2 3 "three"
(integer) 1
redis&amp;gt; ZUNIONSTORE out 2 zset1 zset2 WEIGHTS 2 3
(integer) 3
redis&amp;gt; ZRANGE out 0 -1 WITHSCORES
1) "one"
2) "5"
3) "three"
4) "9"
5) "two"
6) "10"

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

&lt;/div&gt;



&lt;p&gt;Add multiple sorted sets and store the resulting sorted set in a new key&lt;/p&gt;

&lt;h2&gt;
  
  
  Redis Geo command
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GEOADD
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GEOADD key longitude latitude member [longitude latitude member ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis&amp;gt; GEODIST Sicily Palermo Catania
"166274.1516"
redis&amp;gt; GEORADIUS Sicily 15 37 100 km
1) "Catania"
redis&amp;gt; GEORADIUS Sicily 15 37 200 km
1) "Palermo"
2) "Catania"

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

&lt;/div&gt;



&lt;p&gt;Add one or more geospatial items in the geospatial index represented using a sorted set&lt;/p&gt;

&lt;h3&gt;
  
  
  GEOHASH
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GEOHASH key member [member ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis&amp;gt; GEOHASH Sicily Palermo Catania
1) "sqc8b49rny0"
2) "sqdtr74hyu0"

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

&lt;/div&gt;



&lt;p&gt;Returns members of a geospatial index as standard geohash strings&lt;/p&gt;

&lt;h3&gt;
  
  
  GEOPOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GEOPOS key member [member ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis&amp;gt; GEOPOS Sicily Palermo Catania NonExisting
1) 1) "13.36138933897018433"
   2) "38.11555639549629859"
2) 1) "15.08726745843887329"
   2) "37.50266842333162032"
3) (nil)

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

&lt;/div&gt;



&lt;p&gt;Returns longitude and latitude of members of a geospatial index&lt;/p&gt;

&lt;h3&gt;
  
  
  GEODIST
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GEODIST key member1 member2 [m|km|ft|mi]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis&amp;gt; GEODIST Sicily Palermo Catania
"166274.1516"
redis&amp;gt; GEODIST Sicily Palermo Catania km
"166.2742"
redis&amp;gt; GEODIST Sicily Palermo Catania mi
"103.3182"
redis&amp;gt; GEODIST Sicily Foo Bar
(nil)

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

&lt;/div&gt;



&lt;p&gt;Returns the distance between two members of a geospatial index&lt;/p&gt;

&lt;h3&gt;
  
  
  GEORADIUS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis&amp;gt; GEORADIUS Sicily 15 37 200 km WITHDIST
1) 1) "Palermo"
   2) "190.4424"
2) 1) "Catania"
   2) "56.4413"
redis&amp;gt; GEORADIUS Sicily 15 37 200 km WITHCOORD
1) 1) "Palermo"
   2) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Catania"
   2) 1) "15.08726745843887329"
      2) "37.50266842333162032"
redis&amp;gt; GEORADIUS Sicily 15 37 200 km WITHDIST WITHCOORD
1) 1) "Palermo"
   2) "190.4424"
   3) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Catania"
   2) "56.4413"
   3) 1) "15.08726745843887329"
      2) "37.50266842333162032"

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

&lt;/div&gt;



&lt;p&gt;Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a point&lt;/p&gt;

&lt;h3&gt;
  
  
  GEORADIUSBYMEMBER
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; GEOADD Sicily 13.583333 37.316667 "Agrigento"
(integer) 1
redis&amp;gt; GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis&amp;gt; GEORADIUSBYMEMBER Sicily Agrigento 100 km
1) "Agrigento"
2) "Palermo"

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

&lt;/div&gt;



&lt;p&gt;Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a member&lt;/p&gt;

&lt;h3&gt;
  
  
  GEOSEARCH
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GEOSEARCH key [FROMMEMBER member] [FROMLONLAT longitude latitude] [BYRADIUS radius m|km|ft|mi] [BYBOX width height m|km|ft|mi] [ASC|DESC] [COUNT count] [WITHCOORD] [WITHDIST] [WITHHASH]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis&amp;gt; GEOADD Sicily 12.758489 38.788135 "edge1"   17.241510 38.788135 "edge2"
(integer) 2
redis&amp;gt; GEOSEARCH Sicily FROMLONLAT 15 37 BYRADIUS 200 km ASC
1) "Catania"
2) "Palermo"
redis&amp;gt; GEOSEARCH Sicily FROMLONLAT 15 37 BYBOX 400 400 km ASC
1) "Catania"
2) "Palermo"
3) "edge2"
4) "edge1"

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

&lt;/div&gt;



&lt;p&gt;Query a sorted set representing a geospatial index to fetch members inside an area of a box or a circle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Misc
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;-: GEOSEARCHSTORE 

&lt;ul&gt;
&lt;li&gt;-: Query a sorted set representing a geospatial index to fetch members inside an area of a box or a circle, and store the result in another key.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Redis Hyperloglog command
&lt;/h2&gt;

&lt;h3&gt;
  
  
  PFADD
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PFADD key element [element ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; PFADD hll a b c d e f g
(integer) 1
redis&amp;gt; PFCOUNT hll
(integer) 7

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

&lt;/div&gt;



&lt;p&gt;Adds the specified elements to the specified HyperLogLog.&lt;/p&gt;

&lt;h3&gt;
  
  
  PFCOUNT
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PFCOUNT key [key ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; PFADD hll foo bar zap
(integer) 1
redis&amp;gt; PFADD hll zap zap zap
(integer) 0
redis&amp;gt; PFADD hll foo bar
(integer) 0
redis&amp;gt; PFCOUNT hll
(integer) 3
redis&amp;gt; PFADD some-other-hll 1 2 3
(integer) 1
redis&amp;gt; PFCOUNT hll some-other-hll
(integer) 6

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

&lt;/div&gt;



&lt;p&gt;Return the approximated cardinality of the set(s) observed by the HyperLogLog at key(s).&lt;/p&gt;

&lt;h3&gt;
  
  
  PFMERGE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PFMERGE destkey sourcekey [sourcekey ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; PFADD hll1 foo bar zap a
(integer) 1
redis&amp;gt; PFADD hll2 a b c foo
(integer) 1
redis&amp;gt; PFMERGE hll3 hll1 hll2
"OK"
redis&amp;gt; PFCOUNT hll3
(integer) 6

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

&lt;/div&gt;



&lt;p&gt;Merge N different HyperLogLogs into a single one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Redis Server command
&lt;/h2&gt;

&lt;h3&gt;
  
  
  COMMAND
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; COMMAND
1) 1) "georadius_ro"
     2) (integer) -6
     3) 1) "readonly"
        2) "movablekeys"
     4) (integer) 1
     5) (integer) 1
     6) (integer) 1
     7) 1) "@read"
        2) "@geo"
        3) "@slow"
  2) 1) "zpopmin"
     2) (integer) -2
     3) 1) "write"
        2) "fast"
  ........

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

&lt;/div&gt;



&lt;p&gt;Get array of Redis command details&lt;/p&gt;

&lt;h3&gt;
  
  
  Misc
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;-: ACL LOAD

&lt;ul&gt;
&lt;li&gt;-: Reload the ACLs from the configured ACL file&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: ACL SAVE

&lt;ul&gt;
&lt;li&gt;-: Save the current ACL rules in the configured ACL file&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: ACL LIST

&lt;ul&gt;
&lt;li&gt;-: List the current ACL rules in ACL config file format&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: ACL USERS

&lt;ul&gt;
&lt;li&gt;-: List the username of all the configured ACL rules&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: ACL GETUSER 

&lt;ul&gt;
&lt;li&gt;-: Get the rules for a specific ACL user&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: ACL SETUSER 

&lt;ul&gt;
&lt;li&gt;-: Modify or create the rules for a specific ACL user&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: ACL DELUSER 

&lt;ul&gt;
&lt;li&gt;-: Remove the specified ACL users and the associated rules&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: ACL CAT 

&lt;ul&gt;
&lt;li&gt;-: List the ACL categories or the commands inside a category&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: ACL GENPASS 

&lt;ul&gt;
&lt;li&gt;-: Generate a pseudorandom secure password to use for ACL users&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: ACL WHOAMI

&lt;ul&gt;
&lt;li&gt;-: Return the name of the user associated to the current connection&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: ACL LOG 

&lt;ul&gt;
&lt;li&gt;-: List latest events denied because of ACLs in place&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: ACL HELP

&lt;ul&gt;
&lt;li&gt;-: Show helpful text about the different subcommands&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: BGREWRITEAOF

&lt;ul&gt;
&lt;li&gt;-: Asynchronously rewrite the append-only file&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: BGSAVE 

&lt;ul&gt;
&lt;li&gt;-: Asynchronously save the dataset to disk&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: CONFIG GET 

&lt;ul&gt;
&lt;li&gt;-: Get the value of a configuration parameter&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: CONFIG REWRITE

&lt;ul&gt;
&lt;li&gt;-: Rewrite the configuration file with the in memory configuration&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: CONFIG SET 

&lt;ul&gt;
&lt;li&gt;-: Set a configuration parameter to the given value&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: CONFIG RESETSTAT

&lt;ul&gt;
&lt;li&gt;-: Reset the stats returned by INFO&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: DBSIZE

&lt;ul&gt;
&lt;li&gt;-: Return the number of keys in the selected database&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: DEBUG OBJECT 

&lt;ul&gt;
&lt;li&gt;-: Get debugging information about a key&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: DEBUG SEGFAULT

&lt;ul&gt;
&lt;li&gt;-: Make the server crash&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: FLUSHALL 

&lt;ul&gt;
&lt;li&gt;-: Remove all keys from all databases&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: FLUSHDB 

&lt;ul&gt;
&lt;li&gt;-: Remove all keys from the current database&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: LOLWUT 

&lt;ul&gt;
&lt;li&gt;-: Display some computer art and the Redis version&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: LASTSAVE

&lt;ul&gt;
&lt;li&gt;-: Get the UNIX time stamp of the last successful save to disk&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: MEMORY DOCTOR

&lt;ul&gt;
&lt;li&gt;-: Outputs memory problems report&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: MEMORY HELP

&lt;ul&gt;
&lt;li&gt;-: Show helpful text about the different subcommands&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: MEMORY MALLOC-STATS

&lt;ul&gt;
&lt;li&gt;-: Show allocator internal stats&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: MEMORY PURGE

&lt;ul&gt;
&lt;li&gt;-: Ask the allocator to release memory&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: MEMORY STATS

&lt;ul&gt;
&lt;li&gt;-: Show memory usage details&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: MEMORY USAGE 

&lt;ul&gt;
&lt;li&gt;-: Estimate the memory usage of a key&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: MODULE LIST

&lt;ul&gt;
&lt;li&gt;-: List all modules loaded by the server&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: MODULE LOAD 

&lt;ul&gt;
&lt;li&gt;-: Load a module&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: MODULE UNLOAD 

&lt;ul&gt;
&lt;li&gt;-: Unload a module&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: MONITOR

&lt;ul&gt;
&lt;li&gt;-: Listen for all requests received by the server in real time&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: SAVE

&lt;ul&gt;
&lt;li&gt;-: Synchronously save the dataset to disk&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: SHUTDOWN 

&lt;ul&gt;
&lt;li&gt;-: Synchronously save the dataset to disk and then shut down the server&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: SLAVEOF 

&lt;ul&gt;
&lt;li&gt;-: Make the server a replica of another instance, or promote it as master. Deprecated starting with Redis 5. Use REPLICAOF instead.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: REPLICAOF 

&lt;ul&gt;
&lt;li&gt;-: Make the server a replica of another instance, or promote it as master.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: SLOWLOG 

&lt;ul&gt;
&lt;li&gt;-: Manages the Redis slow queries log&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: SWAPDB 

&lt;ul&gt;
&lt;li&gt;-: Swaps two Redis databases&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: SYNC

&lt;ul&gt;
&lt;li&gt;-: Internal command used for replication&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: PSYNC 

&lt;ul&gt;
&lt;li&gt;-: Internal command used for replication&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: LATENCY DOCTOR

&lt;ul&gt;
&lt;li&gt;-: Return a human readable latency analysis report.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: LATENCY GRAPH 

&lt;ul&gt;
&lt;li&gt;-: Return a latency graph for the event.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: LATENCY HISTORY 

&lt;ul&gt;
&lt;li&gt;-: Return timestamp-latency samples for the event.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: LATENCY LATEST

&lt;ul&gt;
&lt;li&gt;-: Return the latest latency samples for all events.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: LATENCY RESET 

&lt;ul&gt;
&lt;li&gt;-: Reset latency data for one or more events.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: LATENCY HELP

&lt;ul&gt;
&lt;li&gt;-: Show helpful text about the different subcommands.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  COMMAND COUNT
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; COMMAND COUNT
(integer) 217

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

&lt;/div&gt;



&lt;p&gt;Get total number of Redis commands&lt;/p&gt;

&lt;h3&gt;
  
  
  COMMAND GETKEYS
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; COMMAND GETKEYS MSET a b c d e f
1) "a"
2) "c"
3) "e"
redis&amp;gt; COMMAND GETKEYS EVAL "not consulted" 3 key1 key2 key3 arg1 arg2 arg3 argN
1) "key1"
2) "key2"
3) "key3"
redis&amp;gt; COMMAND GETKEYS SORT mylist ALPHA STORE outlist
1) "mylist"
2) "outlist"

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

&lt;/div&gt;



&lt;p&gt;Extract keys given a full Redis command&lt;/p&gt;

&lt;h3&gt;
  
  
  COMMAND INFO
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;COMMAND INFO command-name [command-name ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; COMMAND INFO get set eval
1) 1) "get"
   2) (integer) 2
   3) 1) "readonly"
      2) "fast"
   4) (integer) 1
   5) (integer) 1
   6) (integer) 1
   7) 1) "@read"
      2) "@string"
      3) "@fast"
2) 1) "set"
   2) (integer) -3
   3) 1) "write"
      2) "denyoom"
   4) (integer) 1
   5) (integer) 1
   6) (integer) 1
   7) 1) "@write"
      2) "@string"
      3) "@slow"
3) 1) "eval"
   2) (integer) -3
   3) 1) "noscript"
      2) "movablekeys"
   4) (integer) 0
   5) (integer) 0
   6) (integer) 0
   7) 1) "@slow"
      2) "@scripting"

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

&lt;/div&gt;



&lt;p&gt;Get array of specific Redis command details&lt;/p&gt;

&lt;h3&gt;
  
  
  INFO
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INFO [section]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; INFO
# Server
redis_version:6.1.240
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:a26db646ea64a07c
redis_mode:standalone
os:Linux 5.4.0-1017-aws x86_64
......

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

&lt;/div&gt;



&lt;p&gt;Get information and statistics about the server&lt;/p&gt;

&lt;h3&gt;
  
  
  ROLE
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ROLE
1) "master"
2) (integer) 0
3) (empty list or set)

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

&lt;/div&gt;



&lt;p&gt;Return the role of the instance in the context of replication&lt;/p&gt;

&lt;h3&gt;
  
  
  TIME
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; TIME
1) "1609040690"
2) "558952"
redis&amp;gt; TIME
1) "1609040690"
2) "559206"

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

&lt;/div&gt;



&lt;p&gt;Return the current server time&lt;/p&gt;

&lt;h2&gt;
  
  
  Redis Generic command
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Misc
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;-: COPY 

&lt;ul&gt;
&lt;li&gt;-: Copy a key&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: MIGRATE 

&lt;ul&gt;
&lt;li&gt;-: Atomically transfer a key from a Redis instance to another one.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: MOVE 

&lt;ul&gt;
&lt;li&gt;-: Move a key to another database&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: OBJECT 

&lt;ul&gt;
&lt;li&gt;-: Inspect the internals of Redis objects&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: RESTORE 

&lt;ul&gt;
&lt;li&gt;-: Create a key using the provided serialized value, previously obtained using DUMP.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: SORT 

&lt;ul&gt;
&lt;li&gt;-: Sort the elements in a list, set or sorted set&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: WAIT 

&lt;ul&gt;
&lt;li&gt;-: Wait for the synchronous replication of all the write commands sent in the context of the current connection&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: SCAN 

&lt;ul&gt;
&lt;li&gt;-: Incrementally iterate the keys space&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  DEL
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DEL key [key ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET key1 "Hello"
"OK"
redis&amp;gt; SET key2 "World"
"OK"
redis&amp;gt; DEL key1 key2 key3
(integer) 2

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

&lt;/div&gt;



&lt;p&gt;Delete a key&lt;/p&gt;

&lt;h3&gt;
  
  
  DUMP
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey 10
"OK"
redis&amp;gt; DUMP mykey
"\u0000\xC0\n\t\u0000\xBEm\u0006\x89Z(\u0000\n"

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

&lt;/div&gt;



&lt;p&gt;Return a serialized version of the value stored at the specified key.&lt;/p&gt;

&lt;h3&gt;
  
  
  EXISTS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EXISTS key [key ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET key1 "Hello"
"OK"
redis&amp;gt; EXISTS key1
(integer) 1
redis&amp;gt; EXISTS nosuchkey
(integer) 0
redis&amp;gt; SET key2 "World"
"OK"
redis&amp;gt; EXISTS key1 key2 nosuchkey
(integer) 2

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

&lt;/div&gt;



&lt;p&gt;Determine if a key exists&lt;/p&gt;

&lt;h3&gt;
  
  
  EXPIRE
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "Hello"
"OK"
redis&amp;gt; EXPIRE mykey 10
(integer) 1
redis&amp;gt; TTL mykey
(integer) 10
redis&amp;gt; SET mykey "Hello World"
"OK"
redis&amp;gt; TTL mykey
(integer) -1

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

&lt;/div&gt;



&lt;p&gt;Set a key's time to live in seconds&lt;/p&gt;

&lt;h3&gt;
  
  
  EXPIREAT
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "Hello"
"OK"
redis&amp;gt; EXISTS mykey
(integer) 1
redis&amp;gt; EXPIREAT mykey 1293840000
(integer) 1
redis&amp;gt; EXISTS mykey
(integer) 0

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

&lt;/div&gt;



&lt;p&gt;Set the expiration for a key as a UNIX timestamp&lt;/p&gt;

&lt;h3&gt;
  
  
  KEYS
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; MSET firstname Jack lastname Stuntman age 35
"OK"
redis&amp;gt; KEYS *name*
1) "firstname"
2) "lastname"
redis&amp;gt; KEYS a??
1) "age"
redis&amp;gt; KEYS *
1) "firstname"
2) "age"
3) "lastname"

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

&lt;/div&gt;



&lt;p&gt;Find all keys matching the given pattern&lt;/p&gt;

&lt;h3&gt;
  
  
  PERSIST
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "Hello"
"OK"
redis&amp;gt; EXPIRE mykey 10
(integer) 1
redis&amp;gt; TTL mykey
(integer) 10
redis&amp;gt; PERSIST mykey
(integer) 1
redis&amp;gt; TTL mykey
(integer) -1

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

&lt;/div&gt;



&lt;p&gt;Remove the expiration from a key&lt;/p&gt;

&lt;h3&gt;
  
  
  PEXPIRE
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "Hello"
"OK"
redis&amp;gt; PEXPIRE mykey 1500
(integer) 1
redis&amp;gt; TTL mykey
(integer) 1
redis&amp;gt; PTTL mykey
(integer) 1499

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

&lt;/div&gt;



&lt;p&gt;Set a key's time to live in milliseconds&lt;/p&gt;

&lt;h3&gt;
  
  
  PEXPIREAT
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PEXPIREAT key milliseconds-timestamp

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "Hello"
"OK"
redis&amp;gt; PEXPIREAT mykey 1555555555005
(integer) 1
redis&amp;gt; TTL mykey
(integer) -2
redis&amp;gt; PTTL mykey
(integer) -2

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

&lt;/div&gt;



&lt;p&gt;Set the expiration for a key as a UNIX timestamp specified in milliseconds&lt;/p&gt;

&lt;h3&gt;
  
  
  PTTL
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "Hello"
"OK"
redis&amp;gt; EXPIRE mykey 1
(integer) 1
redis&amp;gt; PTTL mykey
(integer) 1000

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

&lt;/div&gt;



&lt;p&gt;Get the time to live for a key in milliseconds&lt;/p&gt;

&lt;h3&gt;
  
  
  RENAME
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "Hello"
"OK"
redis&amp;gt; RENAME mykey myotherkey
"OK"
redis&amp;gt; GET myotherkey
"Hello"

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

&lt;/div&gt;



&lt;p&gt;Rename a key&lt;/p&gt;

&lt;h3&gt;
  
  
  RENAMENX
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "Hello"
"OK"
redis&amp;gt; SET myotherkey "World"
"OK"
redis&amp;gt; RENAMENX mykey myotherkey
(integer) 0
redis&amp;gt; GET myotherkey
"World"

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

&lt;/div&gt;



&lt;p&gt;Rename a key, only if the new key does not exist&lt;/p&gt;

&lt;h3&gt;
  
  
  TOUCH
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TOUCH key [key ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET key1 "Hello"
"OK"
redis&amp;gt; SET key2 "World"
"OK"
redis&amp;gt; TOUCH key1 key2
(integer) 2

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

&lt;/div&gt;



&lt;p&gt;Alters the last access time of a key(s). Returns the number of existing keys specified.&lt;/p&gt;

&lt;h3&gt;
  
  
  TTL
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET mykey "Hello"
"OK"
redis&amp;gt; EXPIRE mykey 10
(integer) 1
redis&amp;gt; TTL mykey
(integer) 10

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

&lt;/div&gt;



&lt;p&gt;Get the time to live for a key&lt;/p&gt;

&lt;h3&gt;
  
  
  TYPE
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET key1 "value"
"OK"
redis&amp;gt; LPUSH key2 "value"
(integer) 1
redis&amp;gt; SADD key3 "value"
(integer) 1
redis&amp;gt; TYPE key1
"string"
redis&amp;gt; TYPE key2
"list"
redis&amp;gt; TYPE key3
"set"

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

&lt;/div&gt;



&lt;p&gt;Determine the type stored at key&lt;/p&gt;

&lt;h3&gt;
  
  
  UNLINK
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UNLINK key [key ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; SET key1 "Hello"
"OK"
redis&amp;gt; SET key2 "World"
"OK"
redis&amp;gt; UNLINK key1 key2 key3
(integer) 2

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

&lt;/div&gt;



&lt;p&gt;Delete a key asynchronously in another thread. Otherwise it is just as DEL, but non blocking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Redis Connection command
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Misc
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AUTH&lt;/td&gt;
&lt;td&gt;Authenticate to the server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLIENT CACHING&lt;/td&gt;
&lt;td&gt;Instruct the server about tracking or not keys in the next request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLIENT KILL&lt;/td&gt;
&lt;td&gt;Kill the connection of a client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLIENT LIST&lt;/td&gt;
&lt;td&gt;Get the list of client connections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLIENT GETNAME&lt;/td&gt;
&lt;td&gt;Get the current connection name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLIENT GETREDIR&lt;/td&gt;
&lt;td&gt;Get tracking notifications redirection client ID if any&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLIENT PAUSE&lt;/td&gt;
&lt;td&gt;Stop processing commands from clients for some time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLIENT REPLY&lt;/td&gt;
&lt;td&gt;Instruct the server whether to reply to commands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLIENT SETNAME&lt;/td&gt;
&lt;td&gt;Set the current connection name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLIENT TRACKING&lt;/td&gt;
&lt;td&gt;Enable or disable server assisted client side caching support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLIENT UNBLOCK&lt;/td&gt;
&lt;td&gt;Unblock a client blocked in a blocking command from a different connection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HELLO&lt;/td&gt;
&lt;td&gt;switch Redis protocol&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QUIT&lt;/td&gt;
&lt;td&gt;Close the connection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RESET&lt;/td&gt;
&lt;td&gt;Reset the connection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SELECT&lt;/td&gt;
&lt;td&gt;Change the selected database for the current connection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  CLIENT ID
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; CLIENT ID
ERR Unknown or disabled command 'CLIENT'

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

&lt;/div&gt;



&lt;p&gt;Returns the client ID for the current connection&lt;/p&gt;

&lt;h3&gt;
  
  
  CLIENT INFO
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; CLIENT INFO
"id=55542 addr=127.0.0.1:58710 laddr=127.0.0.1:6379 fd=8 name= age=114920 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=40928 argv-mem=10 obl=0 oll=0 omem=0 tot-mem=61466 events=r cmd=client user=default redir=-1\n"

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

&lt;/div&gt;



&lt;p&gt;Returns information about the current client connection.&lt;/p&gt;

&lt;h3&gt;
  
  
  ECHO
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; ECHO "Hello World!"
"Hello World!"

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

&lt;/div&gt;



&lt;p&gt;Echo the given string&lt;/p&gt;

&lt;h3&gt;
  
  
  PING
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PING [message]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; PING
"PONG"
redis&amp;gt; PING "hello world"
"hello world"

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

&lt;/div&gt;



&lt;p&gt;Ping the server&lt;/p&gt;

&lt;h2&gt;
  
  
  Redis Stream command
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Misc
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;-: XINFO 

&lt;ul&gt;
&lt;li&gt;-: Get information on streams and consumer groups&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: XDEL 

&lt;ul&gt;
&lt;li&gt;-: Removes the specified entries from the stream. Returns the number of items actually deleted, that may be different from the number of IDs passed in case certain IDs do not exist.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: XREAD 

&lt;ul&gt;
&lt;li&gt;-: Return never seen elements in multiple streams, with IDs greater than the ones reported by the caller for each stream. Can block.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: XGROUP 

&lt;ul&gt;
&lt;li&gt;-: Create, destroy, and manage consumer groups.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: XREADGROUP 

&lt;ul&gt;
&lt;li&gt;-: Return new entries from a stream using a consumer group, or access the history of the pending entries for a given consumer. Can block.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: XCLAIM 

&lt;ul&gt;
&lt;li&gt;-: Changes (or acquires) ownership of a message in a consumer group, as if the message was delivered to the specified consumer.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;-: XPENDING 

&lt;ul&gt;
&lt;li&gt;-: Return information and entries from a stream consumer group pending entries list, that are messages fetched but never acknowledged.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  XADD
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;XADD key [MAXLEN [=|~] length] [NOMKSTREAM] *|ID field value [field value ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; XADD mystream * name Sara surname OConnor
"1609040574632-0"
redis&amp;gt; XADD mystream * field1 value1 field2 value2 field3 value3
"1609040574632-1"
redis&amp;gt; XLEN mystream
(integer) 2
redis&amp;gt; XRANGE mystream - +
1) 1) "1609040574632-0"
   2) 1) "name"
      2) "Sara"
      3) "surname"
      4) "OConnor"
2) 1) "1609040574632-1"
   2) 1) "field1"
      2) "value1"
      3) "field2"
      4) "value2"
      5) "field3"
      6) "value3"

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

&lt;/div&gt;



&lt;p&gt;Appends a new entry to a stream&lt;/p&gt;

&lt;h3&gt;
  
  
  XTRIM
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;XTRIM key MAXLEN [=|~] length

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; XADD mystream * field1 A field2 B field3 C field4 D
"1609040575750-0"
redis&amp;gt; XTRIM mystream MAXLEN 2
(integer) 0
redis&amp;gt; XRANGE mystream - +
1) 1) "1609040575750-0"
   2) 1) "field1"
      2) "A"
      3) "field2"
      4) "B"
      5) "field3"
      6) "C"
      7) "field4"
      8) "D"

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

&lt;/div&gt;



&lt;p&gt;Trims the stream to (approximately if '~' is passed) a certain size&lt;/p&gt;

&lt;h3&gt;
  
  
  XRANGE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;XRANGE key start end [COUNT count]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; XADD writers * name Virginia surname Woolf
"1609040578002-0"
redis&amp;gt; XADD writers * name Jane surname Austen
"1609040578002-1"
redis&amp;gt; XADD writers * name Toni surname Morrison
"1609040578003-0"
redis&amp;gt; XADD writers * name Agatha surname Christie
"1609040578003-1"
redis&amp;gt; XADD writers * name Ngozi surname Adichie
"1609040578003-2"
redis&amp;gt; XLEN writers
(integer) 5
redis&amp;gt; XRANGE writers - + COUNT 2
1) 1) "1609040578002-0"
   2) 1) "name"
      2) "Virginia"
      3) "surname"
      4) "Woolf"
2) 1) "1609040578002-1"
   2) 1) "name"
      2) "Jane"
      3) "surname"
      4) "Austen"

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

&lt;/div&gt;



&lt;p&gt;Return a range of elements in a stream, with IDs matching the specified IDs interval&lt;/p&gt;

&lt;h3&gt;
  
  
  XREVRANGE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;XREVRANGE key end start [COUNT count]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; XADD writers * name Virginia surname Woolf
"1609040579130-0"
redis&amp;gt; XADD writers * name Jane surname Austen
"1609040579130-1"
redis&amp;gt; XADD writers * name Toni surname Morrison
"1609040579130-2"
redis&amp;gt; XADD writers * name Agatha surname Christie
"1609040579131-0"
redis&amp;gt; XADD writers * name Ngozi surname Adichie
"1609040579131-1"
redis&amp;gt; XLEN writers
(integer) 5
redis&amp;gt; XREVRANGE writers + - COUNT 1
1) 1) "1609040579131-1"
   2) 1) "name"
      2) "Ngozi"
      3) "surname"
      4) "Adichie"

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

&lt;/div&gt;



&lt;p&gt;Return a range of elements in a stream, with IDs matching the specified IDs interval, in reverse order (from greater to smaller IDs) compared to XRANGE&lt;/p&gt;

&lt;h3&gt;
  
  
  XLEN
&lt;/h3&gt;



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

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; XADD mystream * item 1
"1609040580250-0"
redis&amp;gt; XADD mystream * item 2
"1609040580250-1"
redis&amp;gt; XADD mystream * item 3
"1609040580251-0"
redis&amp;gt; XLEN mystream
(integer) 3

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

&lt;/div&gt;



&lt;p&gt;Return the number of entries in a stream&lt;/p&gt;

&lt;h3&gt;
  
  
  XACK
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;XACK key group ID [ID ...]

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis&amp;gt; XACK mystream mygroup 1526569495631-0
ERR Unknown or disabled command 'XACK'

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

&lt;/div&gt;



&lt;p&gt;Marks a pending message as correctly processed, effectively removing it from the pending entries list of the consumer group. Return value of the command is the number of messages successfully acknowledged, that is, the IDs we were actually able to resolve in the PEL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Miscellaneous
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cluster
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Transactions
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DISCARD&lt;/td&gt;
&lt;td&gt;Discard all commands issued after MULTI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EXEC&lt;/td&gt;
&lt;td&gt;Execute all commands issued after MULTI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MULTI&lt;/td&gt;
&lt;td&gt;Mark the start of a transaction block&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UNWATCH&lt;/td&gt;
&lt;td&gt;Forget about all watched keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WATCH&lt;/td&gt;
&lt;td&gt;Watch the given keys to determine execution of the MULTI/EXEC block&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Scripting
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EVAL&lt;/td&gt;
&lt;td&gt;Execute a Lua script server side&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EVALSHA&lt;/td&gt;
&lt;td&gt;Execute a Lua script server side&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCRIPT DEBUG&lt;/td&gt;
&lt;td&gt;Set the debug mode for executed scripts.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCRIPT EXISTS&lt;/td&gt;
&lt;td&gt;Check existence of scripts in the script cache.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCRIPT FLUSH&lt;/td&gt;
&lt;td&gt;Remove all the scripts from the script cache.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCRIPT KILL&lt;/td&gt;
&lt;td&gt;Kill the script currently in execution.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCRIPT LOAD&lt;/td&gt;
&lt;td&gt;Load the specified Lua script into the script cache.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Pubsub
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PSUBSCRIBE&lt;/td&gt;
&lt;td&gt;Listen for messages published to channels matching the given patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PUBSUB&lt;/td&gt;
&lt;td&gt;Inspect the state of the Pub/Sub subsystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PUBLISH&lt;/td&gt;
&lt;td&gt;Post a message to a channel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PUNSUBSCRIBE&lt;/td&gt;
&lt;td&gt;Stop listening for messages posted to channels matching the given patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SUBSCRIBE&lt;/td&gt;
&lt;td&gt;Listen for messages published to the given channels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UNSUBSCRIBE&lt;/td&gt;
&lt;td&gt;Stop listening for messages posted to the given channels&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>database</category>
    </item>
    <item>
      <title>Master DevOps If You Master it : System Design !!</title>
      <dc:creator>Hoang Guruu</dc:creator>
      <pubDate>Thu, 27 Feb 2025 05:46:57 +0000</pubDate>
      <link>https://dev.to/aws-builders/system-design-for-devops-engineers-45lh</link>
      <guid>https://dev.to/aws-builders/system-design-for-devops-engineers-45lh</guid>
      <description>&lt;p&gt;【 &lt;a href="https://www.youtube.com/@HoangGuruu" rel="noopener noreferrer"&gt;👨🏻‍💻 YouTube&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/nguyen-tan-hoang-64070a284/" rel="noopener noreferrer"&gt;🕵️ LinkedIn&lt;/a&gt;】&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.bytebytego.com/?utm_source=site" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1s20wyjoohxthz0cu7ac.jpg" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trendshift.io/repositories/3709" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dfcf9c66d01984eaaa1a8824bb3e612cade1a8efa474cf36063ccedc1928537f/68747470733a2f2f7472656e6473686966742e696f2f6170692f62616467652f7265706f7369746f726965732f33373039" alt="ByteByteGoHq%2Fsystem-design-101 | Trendshift" width="250" height="55"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  System Design 101
&lt;/h2&gt;

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

&lt;p&gt;Explain complex systems using visuals and simple terms.&lt;/p&gt;

&lt;p&gt;Whether you're preparing for a System Design Interview or you simply want to understand how systems work beneath the surface, we hope this repository will help you achieve that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;  Communication protocols

&lt;ul&gt;
&lt;li&gt;  REST API vs. GraphQL
&lt;/li&gt;
&lt;li&gt;  How does gRPC work?
&lt;/li&gt;
&lt;li&gt;  What is a webhook?
&lt;/li&gt;
&lt;li&gt;  How to improve API performance?
&lt;/li&gt;
&lt;li&gt;  HTTP 1.0 -&amp;gt; HTTP 1.1 -&amp;gt; HTTP 2.0 -&amp;gt; HTTP 3.0 (QUIC)
&lt;/li&gt;
&lt;li&gt;  SOAP vs REST vs GraphQL vs RPC
&lt;/li&gt;
&lt;li&gt;  Code First vs. API First
&lt;/li&gt;
&lt;li&gt;  HTTP status codes
&lt;/li&gt;
&lt;li&gt;  What does API gateway do?
&lt;/li&gt;
&lt;li&gt;  How do we design effective and safe APIs?
&lt;/li&gt;
&lt;li&gt;  TCP/IP encapsulation
&lt;/li&gt;
&lt;li&gt;  Why is Nginx called a “reverse” proxy?
&lt;/li&gt;
&lt;li&gt;  What are the common load-balancing algorithms?
&lt;/li&gt;
&lt;li&gt;  URL, URI, URN - Do you know the differences?
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  CI/CD

&lt;ul&gt;
&lt;li&gt;  CI/CD Pipeline Explained in Simple Terms
&lt;/li&gt;
&lt;li&gt;  Netflix Tech Stack (CI/CD Pipeline)
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Architecture patterns

&lt;ul&gt;
&lt;li&gt;  MVC, MVP, MVVM, MVVM-C, and VIPER
&lt;/li&gt;
&lt;li&gt;  18 Key Design Patterns Every Developer Should Know
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Database

&lt;ul&gt;
&lt;li&gt;  A nice cheat sheet of different databases in cloud services
&lt;/li&gt;
&lt;li&gt;  8 Data Structures That Power Your Databases
&lt;/li&gt;
&lt;li&gt;  How is an SQL statement executed in the database?
&lt;/li&gt;
&lt;li&gt;  CAP theorem
&lt;/li&gt;
&lt;li&gt;  Types of Memory and Storage
&lt;/li&gt;
&lt;li&gt;  Visualizing a SQL query
&lt;/li&gt;
&lt;li&gt;  SQL language
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Cache

&lt;ul&gt;
&lt;li&gt;  Data is cached everywhere
&lt;/li&gt;
&lt;li&gt;  Why is Redis so fast?
&lt;/li&gt;
&lt;li&gt;  How can Redis be used?
&lt;/li&gt;
&lt;li&gt;  Top caching strategies
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Microservice architecture

&lt;ul&gt;
&lt;li&gt;  What does a typical microservice architecture look like?
&lt;/li&gt;
&lt;li&gt;  Microservice Best Practices
&lt;/li&gt;
&lt;li&gt;  What tech stack is commonly used for microservices?
&lt;/li&gt;
&lt;li&gt;  Why is Kafka fast
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Payment systems

&lt;ul&gt;
&lt;li&gt;  How to learn payment systems?
&lt;/li&gt;
&lt;li&gt;  Why is the credit card called “the most profitable product in banks”? How does VISA/Mastercard make money?
&lt;/li&gt;
&lt;li&gt;  How does VISA work when we swipe a credit card at a merchant’s shop?
&lt;/li&gt;
&lt;li&gt;  Payment Systems Around The World Series (Part 1): Unified Payments Interface (UPI) in India
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  DevOps

&lt;ul&gt;
&lt;li&gt;  DevOps vs. SRE vs. Platform Engineering. What is the difference?
&lt;/li&gt;
&lt;li&gt;  What is k8s (Kubernetes)?
&lt;/li&gt;
&lt;li&gt;  Docker vs. Kubernetes. Which one should we use?
&lt;/li&gt;
&lt;li&gt;  How does Docker work?
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  GIT

&lt;ul&gt;
&lt;li&gt;  How Git Commands work
&lt;/li&gt;
&lt;li&gt;  How does Git Work?
&lt;/li&gt;
&lt;li&gt;  Git merge vs. Git rebase
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Cloud Services

&lt;ul&gt;
&lt;li&gt;  A nice cheat sheet of different cloud services (2023 edition)
&lt;/li&gt;
&lt;li&gt;  What is cloud native?
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Developer productivity tools

&lt;ul&gt;
&lt;li&gt;  Visualize JSON files
&lt;/li&gt;
&lt;li&gt;  Automatically turn code into architecture diagrams
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Linux

&lt;ul&gt;
&lt;li&gt;  Linux file system explained
&lt;/li&gt;
&lt;li&gt;  18 Most-used Linux Commands You Should Know
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Security

&lt;ul&gt;
&lt;li&gt;  How does HTTPS work?
&lt;/li&gt;
&lt;li&gt;  Oauth 2.0 Explained With Simple Terms.
&lt;/li&gt;
&lt;li&gt;  Top 4 Forms of Authentication Mechanisms
&lt;/li&gt;
&lt;li&gt;  Session, cookie, JWT, token, SSO, and OAuth 2.0 - what are they?
&lt;/li&gt;
&lt;li&gt;  How to store passwords safely in the database and how to validate a password?
&lt;/li&gt;
&lt;li&gt;  Explaining JSON Web Token (JWT) to a 10 year old Kid
&lt;/li&gt;
&lt;li&gt;  How does Google Authenticator (or other types of 2-factor authenticators) work?
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Real World Case Studies

&lt;ul&gt;
&lt;li&gt;  Netflix's Tech Stack
&lt;/li&gt;
&lt;li&gt;  Twitter Architecture 2022
&lt;/li&gt;
&lt;li&gt;  Evolution of Airbnb’s microservice architecture over the past 15 years
&lt;/li&gt;
&lt;li&gt;  Monorepo vs. Microrepo.
&lt;/li&gt;
&lt;li&gt;  How will you design the Stack Overflow website?
&lt;/li&gt;
&lt;li&gt;  Why did Amazon Prime Video monitoring move from serverless to monolithic? How can it save 90% cost?
&lt;/li&gt;
&lt;li&gt;  How does Disney Hotstar capture 5 Billion Emojis during a tournament?
&lt;/li&gt;
&lt;li&gt;  How Discord Stores Trillions Of Messages
&lt;/li&gt;
&lt;li&gt;  How do video live streamings work on YouTube, TikTok live, or Twitch?
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Communication protocols
&lt;/h2&gt;

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

&lt;p&gt;Architecture styles define how different components of an application programming interface (API) interact with one another. As a result, they ensure efficiency, reliability, and ease of integration with other systems by providing a standard approach to designing and building APIs. Here are the most used styles:&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/api-architecture-styles.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kkac0w37wljg8bllpfx.png" width="800" height="664"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SOAP: &lt;/p&gt;

&lt;p&gt;Mature, comprehensive, XML-based&lt;/p&gt;

&lt;p&gt;Best for enterprise applications &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RESTful: &lt;/p&gt;

&lt;p&gt;Popular, easy-to-implement, HTTP methods &lt;/p&gt;

&lt;p&gt;Ideal for web services &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GraphQL: &lt;/p&gt;

&lt;p&gt;Query language, request specific data &lt;/p&gt;

&lt;p&gt;Reduces network overhead, faster responses &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gRPC: &lt;/p&gt;

&lt;p&gt;Modern, high-performance, Protocol Buffers &lt;/p&gt;

&lt;p&gt;Suitable for microservices architectures &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WebSocket: &lt;/p&gt;

&lt;p&gt;Real-time, bidirectional, persistent connections &lt;/p&gt;

&lt;p&gt;Perfect for low-latency data exchange &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Webhook: &lt;/p&gt;

&lt;p&gt;Event-driven, HTTP callbacks, asynchronous &lt;/p&gt;

&lt;p&gt;Notifies systems when events occur&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  REST API vs. GraphQL
&lt;/h3&gt;

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

&lt;p&gt;When it comes to API design, REST and GraphQL each have their own strengths and weaknesses.&lt;/p&gt;

&lt;p&gt;The diagram below shows a quick comparison between REST and GraphQL.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/graphQL.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7im7ndp23aqwrxqfwn61.jpg" width="800" height="994"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;REST&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Uses standard HTTP methods like GET, POST, PUT, DELETE for CRUD operations.&lt;/li&gt;
&lt;li&gt;  Works well when you need simple, uniform interfaces between separate services/applications.&lt;/li&gt;
&lt;li&gt;  Caching strategies are straightforward to implement.&lt;/li&gt;
&lt;li&gt;  The downside is it may require multiple roundtrips to assemble related data from separate endpoints.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GraphQL&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Provides a single endpoint for clients to query for precisely the data they need.&lt;/li&gt;
&lt;li&gt;  Clients specify the exact fields required in nested queries, and the server returns optimized payloads containing just those fields.&lt;/li&gt;
&lt;li&gt;  Supports Mutations for modifying data and Subscriptions for real-time notifications.&lt;/li&gt;
&lt;li&gt;  Great for aggregating data from multiple sources and works well with rapidly evolving frontend requirements.&lt;/li&gt;
&lt;li&gt;  However, it shifts complexity to the client side and can allow abusive queries if not properly safeguarded&lt;/li&gt;
&lt;li&gt;  Caching strategies can be more complicated than REST.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best choice between REST and GraphQL depends on the specific requirements of the application and development team. GraphQL is a good fit for complex or frequently changing frontend needs, while REST suits applications where simple and consistent contracts are preferred.&lt;/p&gt;

&lt;p&gt;Neither API approach is a silver bullet. Carefully evaluating requirements and tradeoffs is important to pick the right style. Both REST and GraphQL are valid options for exposing data and powering modern applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does gRPC work?
&lt;/h3&gt;

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

&lt;p&gt;RPC (Remote Procedure Call) is called “&lt;strong&gt;remote&lt;/strong&gt;” because it enables communications between remote services when services are deployed to different servers under microservice architecture. From the user’s point of view, it acts like a local function call.&lt;/p&gt;

&lt;p&gt;The diagram below illustrates the overall data flow for &lt;strong&gt;gRPC&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/grpc.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fen0ruob4qssdvxcgsuwc.jpg" width="800" height="1012"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 1: A REST call is made from the client. The request body is usually in JSON format.&lt;/p&gt;

&lt;p&gt;Steps 2 - 4: The order service (gRPC client) receives the REST call, transforms it, and makes an RPC call to the payment service. gRPC encodes the &lt;strong&gt;client stub&lt;/strong&gt; into a binary format and sends it to the low-level transport layer.&lt;/p&gt;

&lt;p&gt;Step 5: gRPC sends the packets over the network via HTTP2. Because of binary encoding and network optimizations, gRPC is said to be 5X faster than JSON.&lt;/p&gt;

&lt;p&gt;Steps 6 - 8: The payment service (gRPC server) receives the packets from the network, decodes them, and invokes the server application.&lt;/p&gt;

&lt;p&gt;Steps 9 - 11: The result is returned from the server application, and gets encoded and sent to the transport layer.&lt;/p&gt;

&lt;p&gt;Steps 12 - 14: The order service receives the packets, decodes them, and sends the result to the client application.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is a webhook?
&lt;/h3&gt;

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

&lt;p&gt;The diagram below shows a comparison between polling and Webhook. &lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/webhook.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnp51flwp7neksu6wyv0d.jpeg" width="800" height="852"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Assume we run an eCommerce website. The clients send orders to the order service via the API gateway, which goes to the payment service for payment transactions. The payment service then talks to an external payment service provider (PSP) to complete the transactions. &lt;/p&gt;

&lt;p&gt;There are two ways to handle communications with the external PSP. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Short polling&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;After sending the payment request to the PSP, the payment service keeps asking the PSP about the payment status. After several rounds, the PSP finally returns with the status. &lt;/p&gt;

&lt;p&gt;Short polling has two drawbacks: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Constant polling of the status requires resources from the payment service. &lt;/li&gt;
&lt;li&gt;  The External service communicates directly with the payment service, creating security vulnerabilities. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Webhook&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;We can register a webhook with the external service. It means: call me back at a certain URL when you have updates on the request. When the PSP has completed the processing, it will invoke the HTTP request to update the payment status.&lt;/p&gt;

&lt;p&gt;In this way, the programming paradigm is changed, and the payment service doesn’t need to waste resources to poll the payment status anymore.&lt;/p&gt;

&lt;p&gt;What if the PSP never calls back? We can set up a housekeeping job to check payment status every hour.&lt;/p&gt;

&lt;p&gt;Webhooks are often referred to as reverse APIs or push APIs because the server sends HTTP requests to the client. We need to pay attention to 3 things when using a webhook:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; We need to design a proper API for the external service to call.&lt;/li&gt;
&lt;li&gt; We need to set up proper rules in the API gateway for security reasons.&lt;/li&gt;
&lt;li&gt; We need to register the correct URL at the external service.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How to improve API performance?
&lt;/h3&gt;

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

&lt;p&gt;The diagram below shows 5 common tricks to improve API performance.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/api-performance.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8uxcio3odkweo01j0x9f.jpg" width="800" height="825"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pagination&lt;/p&gt;

&lt;p&gt;This is a common optimization when the size of the result is large. The results are streaming back to the client to improve the service responsiveness.&lt;/p&gt;

&lt;p&gt;Asynchronous Logging&lt;/p&gt;

&lt;p&gt;Synchronous logging deals with the disk for every call and can slow down the system. Asynchronous logging sends logs to a lock-free buffer first and immediately returns. The logs will be flushed to the disk periodically. This significantly reduces the I/O overhead.&lt;/p&gt;

&lt;p&gt;Caching&lt;/p&gt;

&lt;p&gt;We can store frequently accessed data into a cache. The client can query the cache first instead of visiting the database directly. If there is a cache miss, the client can query from the database. Caches like Redis store data in memory, so the data access is much faster than the database.&lt;/p&gt;

&lt;p&gt;Payload Compression&lt;/p&gt;

&lt;p&gt;The requests and responses can be compressed using gzip etc so that the transmitted data size is much smaller. This speeds up the upload and download.&lt;/p&gt;

&lt;p&gt;Connection Pool&lt;/p&gt;

&lt;p&gt;When accessing resources, we often need to load data from the database. Opening the closing db connections adds significant overhead. So we should connect to the db via a pool of open connections. The connection pool is responsible for managing the connection lifecycle.&lt;/p&gt;

&lt;h3&gt;
  
  
  HTTP 1.0 -&amp;gt; HTTP 1.1 -&amp;gt; HTTP 2.0 -&amp;gt; HTTP 3.0 (QUIC)
&lt;/h3&gt;

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

&lt;p&gt;What problem does each generation of HTTP solve?&lt;/p&gt;

&lt;p&gt;The diagram below illustrates the key features.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/http3.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Febkmm1s7kxwcye8iaofo.jpg" width="800" height="654"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;HTTP 1.0 was finalized and fully documented in 1996. Every request to the same server requires a separate TCP connection.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HTTP 1.1 was published in 1997. A TCP connection can be left open for reuse (persistent connection), but it doesn’t solve the HOL (head-of-line) blocking issue.&lt;/p&gt;

&lt;p&gt;HOL blocking - when the number of allowed parallel requests in the browser is used up, subsequent requests need to wait for the former ones to complete.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HTTP 2.0 was published in 2015. It addresses HOL issue through request multiplexing, which eliminates HOL blocking at the application layer, but HOL still exists at the transport (TCP) layer.&lt;/p&gt;

&lt;p&gt;As you can see in the diagram, HTTP 2.0 introduced the concept of HTTP “streams”: an abstraction that allows multiplexing different HTTP exchanges onto the same TCP connection. Each stream doesn’t need to be sent in order.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HTTP 3.0 first draft was published in 2020. It is the proposed successor to HTTP 2.0. It uses QUIC instead of TCP for the underlying transport protocol, thus removing HOL blocking in the transport layer.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;QUIC is based on UDP. It introduces streams as first-class citizens at the transport layer. QUIC streams share the same QUIC connection, so no additional handshakes and slow starts are required to create new ones, but QUIC streams are delivered independently such that in most cases packet loss affecting one stream doesn't affect others.&lt;/p&gt;

&lt;h3&gt;
  
  
  SOAP vs REST vs GraphQL vs RPC
&lt;/h3&gt;

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

&lt;p&gt;The diagram below illustrates the API timeline and API styles comparison.&lt;/p&gt;

&lt;p&gt;Over time, different API architectural styles are released. Each of them has its own patterns of standardizing data exchange.&lt;/p&gt;

&lt;p&gt;You can check out the use cases of each style in the diagram.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/SOAP%20vs%20REST%20vs%20GraphQL%20vs%20RPC.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FByteByteGoHq%2Fsystem-design-101%2Fraw%2Fmain%2Fimages%2FSOAP%2520vs%2520REST%2520vs%2520GraphQL%2520vs%2520RPC.jpeg" width="800" height="704"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Code First vs. API First
&lt;/h3&gt;

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

&lt;p&gt;The diagram below shows the differences between code-first development and API-first development. Why do we want to consider API first design?&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/api_first.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6i8yhphom9ozbampyswy.jpg" width="800" height="804"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Microservices increase system complexity and we have separate services to serve different functions of the system. While this kind of architecture facilitates decoupling and segregation of duty, we need to handle the various communications among services.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is better to think through the system's complexity before writing the code and carefully defining the boundaries of the services.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Separate functional teams need to speak the same language and the dedicated functional teams are only responsible for their own components and services. It is recommended that the organization speak the same language via API design.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We can mock requests and responses to validate the API design before writing code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Improve software quality and developer productivity Since we have ironed out most of the uncertainties when the project starts, the overall development process is smoother, and the software quality is greatly improved.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developers are happy about the process as well because they can focus on functional development instead of negotiating sudden changes.&lt;/p&gt;

&lt;p&gt;The possibility of having surprises toward the end of the project lifecycle is reduced.&lt;/p&gt;

&lt;p&gt;Because we have designed the API first, the tests can be designed while the code is being developed. In a way, we also have TDD (Test Driven Design) when using API first development.&lt;/p&gt;

&lt;h3&gt;
  
  
  HTTP status codes
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/http-status-code.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy4nk3t8k8vqcpddfeb9l.jpg" width="800" height="773"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The response codes for HTTP are divided into five categories:&lt;/p&gt;

&lt;p&gt;Informational (100-199) Success (200-299) Redirection (300-399) Client Error (400-499) Server Error (500-599)&lt;/p&gt;

&lt;h3&gt;
  
  
  What does API gateway do?
&lt;/h3&gt;

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

&lt;p&gt;The diagram below shows the details.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/api_gateway.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw48hafx6xy3qwwu3azzn.jpg" width="800" height="1183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 1 - The client sends an HTTP request to the API gateway.&lt;/p&gt;

&lt;p&gt;Step 2 - The API gateway parses and validates the attributes in the HTTP request.&lt;/p&gt;

&lt;p&gt;Step 3 - The API gateway performs allow-list/deny-list checks.&lt;/p&gt;

&lt;p&gt;Step 4 - The API gateway talks to an identity provider for authentication and authorization.&lt;/p&gt;

&lt;p&gt;Step 5 - The rate limiting rules are applied to the request. If it is over the limit, the request is rejected.&lt;/p&gt;

&lt;p&gt;Steps 6 and 7 - Now that the request has passed basic checks, the API gateway finds the relevant service to route to by path matching.&lt;/p&gt;

&lt;p&gt;Step 8 - The API gateway transforms the request into the appropriate protocol and sends it to backend microservices.&lt;/p&gt;

&lt;p&gt;Steps 9-12: The API gateway can handle errors properly, and deals with faults if the error takes a longer time to recover (circuit break). It can also leverage ELK (Elastic-Logstash-Kibana) stack for logging and monitoring. We sometimes cache data in the API gateway.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do we design effective and safe APIs?
&lt;/h3&gt;

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

&lt;p&gt;The diagram below shows typical API designs with a shopping cart example.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/safe-apis.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdpdb7u78v48kfdci2vnx.jpg" width="800" height="920"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note that API design is not just URL path design. Most of the time, we need to choose the proper resource names, identifiers, and path patterns. It is equally important to design proper HTTP header fields or to design effective rate-limiting rules within the API gateway.&lt;/p&gt;

&lt;h3&gt;
  
  
  TCP/IP encapsulation
&lt;/h3&gt;

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

&lt;p&gt;How is data sent over the network? Why do we need so many layers in the OSI model?&lt;/p&gt;

&lt;p&gt;The diagram below shows how data is encapsulated and de-encapsulated when transmitting over the network.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/osi%20model.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FByteByteGoHq%2Fsystem-design-101%2Fraw%2Fmain%2Fimages%2Fosi%2520model.jpeg" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 1: When Device A sends data to Device B over the network via the HTTP protocol, it is first added an HTTP header at the application layer.&lt;/p&gt;

&lt;p&gt;Step 2: Then a TCP or a UDP header is added to the data. It is encapsulated into TCP segments at the transport layer. The header contains the source port, destination port, and sequence number.&lt;/p&gt;

&lt;p&gt;Step 3: The segments are then encapsulated with an IP header at the network layer. The IP header contains the source/destination IP addresses.&lt;/p&gt;

&lt;p&gt;Step 4: The IP datagram is added a MAC header at the data link layer, with source/destination MAC addresses.&lt;/p&gt;

&lt;p&gt;Step 5: The encapsulated frames are sent to the physical layer and sent over the network in binary bits.&lt;/p&gt;

&lt;p&gt;Steps 6-10: When Device B receives the bits from the network, it performs the de-encapsulation process, which is a reverse processing of the encapsulation process. The headers are removed layer by layer, and eventually, Device B can read the data.&lt;/p&gt;

&lt;p&gt;We need layers in the network model because each layer focuses on its own responsibilities. Each layer can rely on the headers for processing instructions and does not need to know the meaning of the data from the last layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is Nginx called a “reverse” proxy?
&lt;/h3&gt;

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

&lt;p&gt;The diagram below shows the differences between a ���𝐨𝐫𝐰𝐚𝐫𝐝 𝐩𝐫𝐨𝐱𝐲 and a 𝐫𝐞𝐯𝐞𝐫𝐬𝐞 𝐩𝐫𝐨𝐱𝐲.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/Forward%20Proxy%20v.s.%20Reverse%20Proxy2x.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FByteByteGoHq%2Fsystem-design-101%2Fraw%2Fmain%2Fimages%2FForward%2520Proxy%2520v.s.%2520Reverse%2520Proxy2x.jpg" width="800" height="849"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A forward proxy is a server that sits between user devices and the internet.&lt;/p&gt;

&lt;p&gt;A forward proxy is commonly used for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Protecting clients&lt;/li&gt;
&lt;li&gt; Circumventing browsing restrictions&lt;/li&gt;
&lt;li&gt; Blocking access to certain content&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A reverse proxy is a server that accepts a request from the client, forwards the request to web servers, and returns the results to the client as if the proxy server had processed the request.&lt;/p&gt;

&lt;p&gt;A reverse proxy is good for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Protecting servers&lt;/li&gt;
&lt;li&gt; Load balancing&lt;/li&gt;
&lt;li&gt; Caching static contents&lt;/li&gt;
&lt;li&gt; Encrypting and decrypting SSL communications&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What are the common load-balancing algorithms?
&lt;/h3&gt;

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

&lt;p&gt;The diagram below shows 6 common algorithms.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/lb-algorithms.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frgi92xtcr39e5flej4ky.jpg" width="800" height="765"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Static Algorithms&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Round robin&lt;/p&gt;

&lt;p&gt;The client requests are sent to different service instances in sequential order. The services are usually required to be stateless.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sticky round-robin&lt;/p&gt;

&lt;p&gt;This is an improvement of the round-robin algorithm. If Alice’s first request goes to service A, the following requests go to service A as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Weighted round-robin&lt;/p&gt;

&lt;p&gt;The admin can specify the weight for each service. The ones with a higher weight handle more requests than others.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hash&lt;/p&gt;

&lt;p&gt;This algorithm applies a hash function on the incoming requests’ IP or URL. The requests are routed to relevant instances based on the hash function result.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;  Dynamic Algorithms&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Least connections&lt;/p&gt;

&lt;p&gt;A new request is sent to the service instance with the least concurrent connections.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Least response time&lt;/p&gt;

&lt;p&gt;A new request is sent to the service instance with the fastest response time.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  URL, URI, URN - Do you know the differences?
&lt;/h3&gt;

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

&lt;p&gt;The diagram below shows a comparison of URL, URI, and URN.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/url-uri-urn.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5zarmm9uiotwuw5s4j8q.jpg" width="800" height="798"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  URI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;URI stands for Uniform Resource Identifier. It identifies a logical or physical resource on the web. URL and URN are subtypes of URI. URL locates a resource, while URN names a resource.&lt;/p&gt;

&lt;p&gt;A URI is composed of the following parts: scheme:[//authority]path[?query][#fragment]&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  URL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;URL stands for Uniform Resource Locator, the key concept of HTTP. It is the address of a unique resource on the web. It can be used with other protocols like FTP and JDBC.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  URN&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;URN stands for Uniform Resource Name. It uses the urn scheme. URNs cannot be used to locate a resource. A simple example given in the diagram is composed of a namespace and a namespace-specific string.&lt;/p&gt;

&lt;p&gt;If you would like to learn more detail on the subject, I would recommend &lt;a href="https://www.w3.org/TR/uri-clarification/" rel="noopener noreferrer"&gt;W3C’s clarification&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  CI/CD
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  CI/CD Pipeline Explained in Simple Terms
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/ci-cd-pipeline.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwyqhaewun5477k6hsehg.jpg" width="800" height="1049"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Section 1 - SDLC with CI/CD&lt;/p&gt;

&lt;p&gt;The software development life cycle (SDLC) consists of several key stages: development, testing, deployment, and maintenance. CI/CD automates and integrates these stages to enable faster and more reliable releases.&lt;/p&gt;

&lt;p&gt;When code is pushed to a git repository, it triggers an automated build and test process. End-to-end (e2e) test cases are run to validate the code. If tests pass, the code can be automatically deployed to staging/production. If issues are found, the code is sent back to development for bug fixing. This automation provides fast feedback to developers and reduces the risk of bugs in production.&lt;/p&gt;

&lt;p&gt;Section 2 - Difference between CI and CD&lt;/p&gt;

&lt;p&gt;Continuous Integration (CI) automates the build, test, and merge process. It runs tests whenever code is committed to detect integration issues early. This encourages frequent code commits and rapid feedback.&lt;/p&gt;

&lt;p&gt;Continuous Delivery (CD) automates release processes like infrastructure changes and deployment. It ensures software can be released reliably at any time through automated workflows. CD may also automate the manual testing and approval steps required before production deployment.&lt;/p&gt;

&lt;p&gt;Section 3 - CI/CD Pipeline&lt;/p&gt;

&lt;p&gt;A typical CI/CD pipeline has several connected stages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The developer commits code changes to the source control&lt;/li&gt;
&lt;li&gt;  CI server detects changes and triggers the build&lt;/li&gt;
&lt;li&gt;  Code is compiled, and tested (unit, integration tests)&lt;/li&gt;
&lt;li&gt;  Test results reported to the developer&lt;/li&gt;
&lt;li&gt;  On success, artifacts are deployed to staging environments&lt;/li&gt;
&lt;li&gt;  Further testing may be done on staging before release&lt;/li&gt;
&lt;li&gt;  CD system deploys approved changes to production&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Netflix Tech Stack (CI/CD Pipeline)
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/netflix-ci-cd.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzwxi3i2wt0ztwnwoy2zw.jpg" width="800" height="685"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Planning: Netflix Engineering uses JIRA for planning and Confluence for documentation.&lt;/p&gt;

&lt;p&gt;Coding: Java is the primary programming language for the backend service, while other languages are used for different use cases.&lt;/p&gt;

&lt;p&gt;Build: Gradle is mainly used for building, and Gradle plugins are built to support various use cases.&lt;/p&gt;

&lt;p&gt;Packaging: Package and dependencies are packed into an Amazon Machine Image (AMI) for release.&lt;/p&gt;

&lt;p&gt;Testing: Testing emphasizes the production culture's focus on building chaos tools.&lt;/p&gt;

&lt;p&gt;Deployment: Netflix uses its self-built Spinnaker for canary rollout deployment.&lt;/p&gt;

&lt;p&gt;Monitoring: The monitoring metrics are centralized in Atlas, and Kayenta is used to detect anomalies.&lt;/p&gt;

&lt;p&gt;Incident report: Incidents are dispatched according to priority, and PagerDuty is used for incident handling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture patterns
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  MVC, MVP, MVVM, MVVM-C, and VIPER
&lt;/h3&gt;

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

&lt;p&gt;These architecture patterns are among the most commonly used in app development, whether on iOS or Android platforms. Developers have introduced them to overcome the limitations of earlier patterns. So, how do they differ?&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/client%20arch%20patterns.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FByteByteGoHq%2Fsystem-design-101%2Fraw%2Fmain%2Fimages%2Fclient%2520arch%2520patterns.png" width="800" height="1097"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  MVC, the oldest pattern, dates back almost 50 years&lt;/li&gt;
&lt;li&gt;  Every pattern has a "view" (V) responsible for displaying content and receiving user input&lt;/li&gt;
&lt;li&gt;  Most patterns include a "model" (M) to manage business data&lt;/li&gt;
&lt;li&gt;  "Controller," "presenter," and "view-model" are translators that mediate between the view and the model ("entity" in the VIPER pattern)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  18 Key Design Patterns Every Developer Should Know
&lt;/h3&gt;

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

&lt;p&gt;Patterns are reusable solutions to common design problems, resulting in a smoother, more efficient development process. They serve as blueprints for building better software structures. These are some of the most popular patterns:&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/18-oo-patterns.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwcjkw6fjr8g9mb5r927o.png" width="800" height="864"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Abstract Factory: Family Creator - Makes groups of related items.&lt;/li&gt;
&lt;li&gt;  Builder: Lego Master - Builds objects step by step, keeping creation and appearance separate.&lt;/li&gt;
&lt;li&gt;  Prototype: Clone Maker - Creates copies of fully prepared examples.&lt;/li&gt;
&lt;li&gt;  Singleton: One and Only - A special class with just one instance.&lt;/li&gt;
&lt;li&gt;  Adapter: Universal Plug - Connects things with different interfaces.&lt;/li&gt;
&lt;li&gt;  Bridge: Function Connector - Links how an object works to what it does.&lt;/li&gt;
&lt;li&gt;  Composite: Tree Builder - Forms tree-like structures of simple and complex parts.&lt;/li&gt;
&lt;li&gt;  Decorator: Customizer - Adds features to objects without changing their core.&lt;/li&gt;
&lt;li&gt;  Facade: One-Stop-Shop - Represents a whole system with a single, simplified interface.&lt;/li&gt;
&lt;li&gt;  Flyweight: Space Saver - Shares small, reusable items efficiently.&lt;/li&gt;
&lt;li&gt;  Proxy: Stand-In Actor - Represents another object, controlling access or actions.&lt;/li&gt;
&lt;li&gt;  Chain of Responsibility: Request Relay - Passes a request through a chain of objects until handled.&lt;/li&gt;
&lt;li&gt;  Command: Task Wrapper - Turns a request into an object, ready for action.&lt;/li&gt;
&lt;li&gt;  Iterator: Collection Explorer - Accesses elements in a collection one by one.&lt;/li&gt;
&lt;li&gt;  Mediator: Communication Hub - Simplifies interactions between different classes.&lt;/li&gt;
&lt;li&gt;  Memento: Time Capsule - Captures and restores an object's state.&lt;/li&gt;
&lt;li&gt;  Observer: News Broadcaster - Notifies classes about changes in other objects.&lt;/li&gt;
&lt;li&gt;  Visitor: Skillful Guest - Adds new operations to a class without altering it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Database
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  A nice cheat sheet of different databases in cloud services
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/cloud-dbs2.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FByteByteGoHq%2Fsystem-design-101%2Fraw%2Fmain%2Fimages%2Fcloud-dbs2.png" width="800" height="713"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choosing the right database for your project is a complex task. Many database options, each suited to distinct use cases, can quickly lead to decision fatigue.&lt;/p&gt;

&lt;p&gt;We hope this cheat sheet provides high-level direction to pinpoint the right service that aligns with your project's needs and avoid potential pitfalls.&lt;/p&gt;

&lt;p&gt;Note: Google has limited documentation for their database use cases. Even though we did our best to look at what was available and arrived at the best option, some of the entries may need to be more accurate.&lt;/p&gt;

&lt;h3&gt;
  
  
  8 Data Structures That Power Your Databases
&lt;/h3&gt;

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

&lt;p&gt;The answer will vary depending on your use case. Data can be indexed in memory or on disk. Similarly, data formats vary, such as numbers, strings, geographic coordinates, etc. The system might be write-heavy or read-heavy. All of these factors affect your choice of database index format.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/8-ds-db.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvthkvw978oh65rlij6x.jpg" width="800" height="833"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The following are some of the most popular data structures used for indexing data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Skiplist: a common in-memory index type. Used in Redis&lt;/li&gt;
&lt;li&gt;  Hash index: a very common implementation of the “Map” data structure (or “Collection”)&lt;/li&gt;
&lt;li&gt;  SSTable: immutable on-disk “Map” implementation&lt;/li&gt;
&lt;li&gt;  LSM tree: Skiplist + SSTable. High write throughput&lt;/li&gt;
&lt;li&gt;  B-tree: disk-based solution. Consistent read/write performance&lt;/li&gt;
&lt;li&gt;  Inverted index: used for document indexing. Used in Lucene&lt;/li&gt;
&lt;li&gt;  Suffix tree: for string pattern search&lt;/li&gt;
&lt;li&gt;  R-tree: multi-dimension search, such as finding the nearest neighbor&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How is an SQL statement executed in the database?
&lt;/h3&gt;

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

&lt;p&gt;The diagram below shows the process. Note that the architectures for different databases are different, the diagram demonstrates some common designs.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/sql%20execution%20order%20in%20db.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FByteByteGoHq%2Fsystem-design-101%2Fraw%2Fmain%2Fimages%2Fsql%2520execution%2520order%2520in%2520db.jpeg" width="800" height="1014"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 1 - A SQL statement is sent to the database via a transport layer protocol (e.g.TCP).&lt;/p&gt;

&lt;p&gt;Step 2 - The SQL statement is sent to the command parser, where it goes through syntactic and semantic analysis, and a query tree is generated afterward.&lt;/p&gt;

&lt;p&gt;Step 3 - The query tree is sent to the optimizer. The optimizer creates an execution plan.&lt;/p&gt;

&lt;p&gt;Step 4 - The execution plan is sent to the executor. The executor retrieves data from the execution.&lt;/p&gt;

&lt;p&gt;Step 5 - Access methods provide the data fetching logic required for execution, retrieving data from the storage engine.&lt;/p&gt;

&lt;p&gt;Step 6 - Access methods decide whether the SQL statement is read-only. If the query is read-only (SELECT statement), it is passed to the buffer manager for further processing. The buffer manager looks for the data in the cache or data files.&lt;/p&gt;

&lt;p&gt;Step 7 - If the statement is an UPDATE or INSERT, it is passed to the transaction manager for further processing.&lt;/p&gt;

&lt;p&gt;Step 8 - During a transaction, the data is in lock mode. This is guaranteed by the lock manager. It also ensures the transaction’s ACID properties.&lt;/p&gt;

&lt;h3&gt;
  
  
  CAP theorem
&lt;/h3&gt;

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

&lt;p&gt;The CAP theorem is one of the most famous terms in computer science, but I bet different developers have different understandings. Let’s examine what it is and why it can be confusing.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/cap%20theorem.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FByteByteGoHq%2Fsystem-design-101%2Fraw%2Fmain%2Fimages%2Fcap%2520theorem.jpeg" width="800" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CAP theorem states that a distributed system can't provide more than two of these three guarantees simultaneously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consistency&lt;/strong&gt;: consistency means all clients see the same data at the same time no matter which node they connect to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Availability&lt;/strong&gt;: availability means any client that requests data gets a response even if some of the nodes are down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Partition Tolerance&lt;/strong&gt;: a partition indicates a communication break between two nodes. Partition tolerance means the system continues to operate despite network partitions.&lt;/p&gt;

&lt;p&gt;The “2 of 3” formulation can be useful, &lt;strong&gt;but this simplification could be misleading&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Picking a database is not easy. Justifying our choice purely based on the CAP theorem is not enough. For example, companies don't choose Cassandra for chat applications simply because it is an AP system. There is a list of good characteristics that make Cassandra a desirable option for storing chat messages. We need to dig deeper.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“CAP prohibits only a tiny part of the design space: perfect availability and consistency in the presence of partitions, which are rare”. Quoted from the paper: CAP Twelve Years Later: How the “Rules” Have Changed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The theorem is about 100% availability and consistency. A more realistic discussion would be the trade-offs between latency and consistency when there is no network partition. See PACELC theorem for more details.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Is the CAP theorem actually useful?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I think it is still useful as it opens our minds to a set of tradeoff discussions, but it is only part of the story. We need to dig deeper when picking the right database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Types of Memory and Storage
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/Types_of_Memory_and_Storage.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FByteByteGoHq%2Fsystem-design-101%2Fraw%2Fmain%2Fimages%2FTypes_of_Memory_and_Storage.jpeg" width="800" height="921"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Visualizing a SQL query
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/sql-execution-order.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnkuy0k63rvswx9l8fzh.jpg" width="800" height="932"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SQL statements are executed by the database system in several steps, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Parsing the SQL statement and checking its validity&lt;/li&gt;
&lt;li&gt;  Transforming the SQL into an internal representation, such as relational algebra&lt;/li&gt;
&lt;li&gt;  Optimizing the internal representation and creating an execution plan that utilizes index information&lt;/li&gt;
&lt;li&gt;  Executing the plan and returning the results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The execution of SQL is highly complex and involves many considerations, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The use of indexes and caches&lt;/li&gt;
&lt;li&gt;  The order of table joins&lt;/li&gt;
&lt;li&gt;  Concurrency control&lt;/li&gt;
&lt;li&gt;  Transaction management&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SQL language
&lt;/h3&gt;

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

&lt;p&gt;In 1986, SQL (Structured Query Language) became a standard. Over the next 40 years, it became the dominant language for relational database management systems. Reading the latest standard (ANSI SQL 2016) can be time-consuming. How can I learn it?&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/how-to-learn-sql.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FByteByteGoHq%2Fsystem-design-101%2Fraw%2Fmain%2Fimages%2Fhow-to-learn-sql.jpg" width="800" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are 5 components of the SQL language:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  DDL: data definition language, such as CREATE, ALTER, DROP&lt;/li&gt;
&lt;li&gt;  DQL: data query language, such as SELECT&lt;/li&gt;
&lt;li&gt;  DML: data manipulation language, such as INSERT, UPDATE, DELETE&lt;/li&gt;
&lt;li&gt;  DCL: data control language, such as GRANT, REVOKE&lt;/li&gt;
&lt;li&gt;  TCL: transaction control language, such as COMMIT, ROLLBACK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a backend engineer, you may need to know most of it. As a data analyst, you may need to have a good understanding of DQL. Select the topics that are most relevant to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cache
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  Data is cached everywhere
&lt;/h3&gt;

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

&lt;p&gt;This diagram illustrates where we cache data in a typical architecture.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/where%20do%20we%20cache%20data.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FByteByteGoHq%2Fsystem-design-101%2Fraw%2Fmain%2Fimages%2Fwhere%2520do%2520we%2520cache%2520data.jpeg" width="800" height="1166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are &lt;strong&gt;multiple layers&lt;/strong&gt; along the flow.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Client apps: HTTP responses can be cached by the browser. We request data over HTTP for the first time, and it is returned with an expiry policy in the HTTP header; we request data again, and the client app tries to retrieve the data from the browser cache first.&lt;/li&gt;
&lt;li&gt; CDN: CDN caches static web resources. The clients can retrieve data from a CDN node nearby.&lt;/li&gt;
&lt;li&gt; Load Balancer: The load Balancer can cache resources as well.&lt;/li&gt;
&lt;li&gt; Messaging infra: Message brokers store messages on disk first, and then consumers retrieve them at their own pace. Depending on the retention policy, the data is cached in Kafka clusters for a period of time.&lt;/li&gt;
&lt;li&gt; Services: There are multiple layers of cache in a service. If the data is not cached in the CPU cache, the service will try to retrieve the data from memory. Sometimes the service has a second-level cache to store data on disk.&lt;/li&gt;
&lt;li&gt; Distributed Cache: Distributed cache like Redis holds key-value pairs for multiple services in memory. It provides much better read/write performance than the database.&lt;/li&gt;
&lt;li&gt; Full-text Search: we sometimes need to use full-text searches like Elastic Search for document search or log search. A copy of data is indexed in the search engine as well.&lt;/li&gt;
&lt;li&gt; Database: Even in the database, we have different levels of caches:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;  WAL(Write-ahead Log): data is written to WAL first before building the B tree index&lt;/li&gt;
&lt;li&gt;  Bufferpool: A memory area allocated to cache query results&lt;/li&gt;
&lt;li&gt;  Materialized View: Pre-compute query results and store them in the database tables for better query performance&lt;/li&gt;
&lt;li&gt;  Transaction log: record all the transactions and database updates&lt;/li&gt;
&lt;li&gt;  Replication Log: used to record the replication state in a database cluster&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why is Redis so fast?
&lt;/h3&gt;

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

&lt;p&gt;There are 3 main reasons as shown in the diagram below.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/why_redis_fast.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbrya8l57lfd3ingun7f8.jpeg" width="800" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Redis is a RAM-based data store. RAM access is at least 1000 times faster than random disk access.&lt;/li&gt;
&lt;li&gt; Redis leverages IO multiplexing and single-threaded execution loop for execution efficiency.&lt;/li&gt;
&lt;li&gt; Redis leverages several efficient lower-level data structures.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Question: Another popular in-memory store is Memcached. Do you know the differences between Redis and Memcached?&lt;/p&gt;

&lt;p&gt;You might have noticed the style of this diagram is different from my previous posts. Please let me know which one you prefer.&lt;/p&gt;

&lt;h3&gt;
  
  
  How can Redis be used?
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/top-redis-use-cases.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6fowczu3dbfwq5luvwvs.jpg" width="800" height="1114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is more to Redis than just caching.&lt;/p&gt;

&lt;p&gt;Redis can be used in a variety of scenarios as shown in the diagram.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Session&lt;/p&gt;

&lt;p&gt;We can use Redis to share user session data among different services.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cache&lt;/p&gt;

&lt;p&gt;We can use Redis to cache objects or pages, especially for hotspot data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Distributed lock&lt;/p&gt;

&lt;p&gt;We can use a Redis string to acquire locks among distributed services.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Counter&lt;/p&gt;

&lt;p&gt;We can count how many likes or how many reads for articles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rate limiter&lt;/p&gt;

&lt;p&gt;We can apply a rate limiter for certain user IPs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Global ID generator&lt;/p&gt;

&lt;p&gt;We can use Redis Int for global ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shopping cart&lt;/p&gt;

&lt;p&gt;We can use Redis Hash to represent key-value pairs in a shopping cart.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Calculate user retention&lt;/p&gt;

&lt;p&gt;We can use Bitmap to represent the user login daily and calculate user retention.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Message queue&lt;/p&gt;

&lt;p&gt;We can use List for a message queue.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ranking&lt;/p&gt;

&lt;p&gt;We can use ZSet to sort the articles.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Top caching strategies
&lt;/h3&gt;

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

&lt;p&gt;Designing large-scale systems usually requires careful consideration of caching. Below are five caching strategies that are frequently utilized.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/top_caching_strategy.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe66r2t2vbkwz72wk328x.jpeg" width="800" height="1166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Microservice architecture
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  What does a typical microservice architecture look like?
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/typical-microservice-arch.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4eog6jsnvr6sm7smn4qp.jpg" width="800" height="1115"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The diagram below shows a typical microservice architecture.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Load Balancer: This distributes incoming traffic across multiple backend services.&lt;/li&gt;
&lt;li&gt;  CDN (Content Delivery Network): CDN is a group of geographically distributed servers that hold static content for faster delivery. The clients look for content in CDN first, then progress to backend services.&lt;/li&gt;
&lt;li&gt;  API Gateway: This handles incoming requests and routes them to the relevant services. It talks to the identity provider and service discovery.&lt;/li&gt;
&lt;li&gt;  Identity Provider: This handles authentication and authorization for users.&lt;/li&gt;
&lt;li&gt;  Service Registry &amp;amp; Discovery: Microservice registration and discovery happen in this component, and the API gateway looks for relevant services in this component to talk to.&lt;/li&gt;
&lt;li&gt;  Management: This component is responsible for monitoring the services.&lt;/li&gt;
&lt;li&gt;  Microservices: Microservices are designed and deployed in different domains. Each domain has its own database. The API gateway talks to the microservices via REST API or other protocols, and the microservices within the same domain talk to each other using RPC (Remote Procedure Call).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Benefits of microservices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  They can be quickly designed, deployed, and horizontally scaled.&lt;/li&gt;
&lt;li&gt;  Each domain can be independently maintained by a dedicated team.&lt;/li&gt;
&lt;li&gt;  Business requirements can be customized in each domain and better supported, as a result.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Microservice Best Practices
&lt;/h3&gt;

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

&lt;p&gt;A picture is worth a thousand words: 9 best practices for developing microservices.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/microservice-best-practices.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F56ahj30cj5njx6fgq4kd.jpeg" width="800" height="896"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When we develop microservices, we need to follow the following best practices:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Use separate data storage for each microservice&lt;/li&gt;
&lt;li&gt; Keep code at a similar level of maturity&lt;/li&gt;
&lt;li&gt; Separate build for each microservice&lt;/li&gt;
&lt;li&gt; Assign each microservice with a single responsibility&lt;/li&gt;
&lt;li&gt; Deploy into containers&lt;/li&gt;
&lt;li&gt; Design stateless services&lt;/li&gt;
&lt;li&gt; Adopt domain-driven design&lt;/li&gt;
&lt;li&gt; Design micro frontend&lt;/li&gt;
&lt;li&gt; Orchestrating microservices&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What tech stack is commonly used for microservices?
&lt;/h3&gt;

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

&lt;p&gt;Below you will find a diagram showing the microservice tech stack, both for the development phase and for production.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/microservice-tech.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fft5o8ou49vxf5g3s4vf0.jpeg" width="800" height="746"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;▶️ 𝐏𝐫𝐞-𝐏𝐫𝐨𝐝𝐮𝐜𝐭𝐢𝐨𝐧&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Define API - This establishes a contract between frontend and backend. We can use Postman or OpenAPI for this.&lt;/li&gt;
&lt;li&gt;  Development - Node.js or react is popular for frontend development, and java/python/go for backend development. Also, we need to change the configurations in the API gateway according to API definitions.&lt;/li&gt;
&lt;li&gt;  Continuous Integration - JUnit and Jenkins for automated testing. The code is packaged into a Docker image and deployed as microservices.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;▶️ 𝐏𝐫𝐨𝐝𝐮𝐜𝐭𝐢𝐨𝐧&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  NGinx is a common choice for load balancers. Cloudflare provides CDN (Content Delivery Network).&lt;/li&gt;
&lt;li&gt;  API Gateway - We can use spring boot for the gateway, and use Eureka/Zookeeper for service discovery.&lt;/li&gt;
&lt;li&gt;  The microservices are deployed on clouds. We have options among AWS, Microsoft Azure, or Google GCP. Cache and Full-text Search - Redis is a common choice for caching key-value pairs. Elasticsearch is used for full-text search.&lt;/li&gt;
&lt;li&gt;  Communications - For services to talk to each other, we can use messaging infra Kafka or RPC.&lt;/li&gt;
&lt;li&gt;  Persistence - We can use MySQL or PostgreSQL for a relational database, and Amazon S3 for object store. We can also use Cassandra for the wide-column store if necessary.&lt;/li&gt;
&lt;li&gt;  Management &amp;amp; Monitoring - To manage so many microservices, the common Ops tools include Prometheus, Elastic Stack, and Kubernetes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why is Kafka fast
&lt;/h3&gt;

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

&lt;p&gt;There are many design decisions that contributed to Kafka’s performance. In this post, we’ll focus on two. We think these two carried the most weight.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/why_is_kafka_fast.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fijhg17ceuw6gqoucvbek.jpeg" width="800" height="963"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; The first one is Kafka’s reliance on Sequential I/O.&lt;/li&gt;
&lt;li&gt; The second design choice that gives Kafka its performance advantage is its focus on efficiency: zero copy principle.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The diagram illustrates how the data is transmitted between producer and consumer, and what zero-copy means.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Step 1.1 - 1.3: Producer writes data to the disk&lt;/li&gt;
&lt;li&gt;  Step 2: Consumer reads data without zero-copy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2.1 The data is loaded from disk to OS cache&lt;/p&gt;

&lt;p&gt;2.2 The data is copied from OS cache to Kafka application&lt;/p&gt;

&lt;p&gt;2.3 Kafka application copies the data into the socket buffer&lt;/p&gt;

&lt;p&gt;2.4 The data is copied from socket buffer to network card&lt;/p&gt;

&lt;p&gt;2.5 The network card sends data out to the consumer&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Step 3: Consumer reads data with zero-copy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3.1: The data is loaded from disk to OS cache 3.2 OS cache directly copies the data to the network card via sendfile() command 3.3 The network card sends data out to the consumer&lt;/p&gt;

&lt;p&gt;Zero copy is a shortcut to save the multiple data copies between application context and kernel context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Payment systems
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  How to learn payment systems?
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/learn-payments.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqm5iu43qwm2617sx3b84.jpg" width="800" height="908"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is the credit card called “the most profitable product in banks”? How does VISA/Mastercard make money?
&lt;/h3&gt;

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

&lt;p&gt;The diagram below shows the economics of the credit card payment flow.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/how%20does%20visa%20makes%20money.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FByteByteGoHq%2Fsystem-design-101%2Fraw%2Fmain%2Fimages%2Fhow%2520does%2520visa%2520makes%2520money.jpg" width="800" height="826"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1.  The cardholder pays a merchant $100 to buy a product.&lt;/p&gt;

&lt;p&gt;2. The merchant benefits from the use of the credit card with higher sales volume and needs to compensate the issuer and the card network for providing the payment service. The acquiring bank sets a fee with the merchant, called the “merchant discount fee.”&lt;/p&gt;

&lt;p&gt;3 - 4. The acquiring bank keeps $0.25 as the acquiring markup, and $1.75 is paid to the issuing bank as the interchange fee. The merchant discount fee should cover the interchange fee.&lt;/p&gt;

&lt;p&gt;The interchange fee is set by the card network because it is less efficient for each issuing bank to negotiate fees with each merchant.&lt;/p&gt;

&lt;p&gt;5.  The card network sets up the network assessments and fees with each bank, which pays the card network for its services every month. For example, VISA charges a 0.11% assessment, plus a $0.0195 usage fee, for every swipe.&lt;/p&gt;

&lt;p&gt;6.  The cardholder pays the issuing bank for its services.&lt;/p&gt;

&lt;p&gt;Why should the issuing bank be compensated?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The issuer pays the merchant even if the cardholder fails to pay the issuer.&lt;/li&gt;
&lt;li&gt;  The issuer pays the merchant before the cardholder pays the issuer.&lt;/li&gt;
&lt;li&gt;  The issuer has other operating costs, including managing customer accounts, providing statements, fraud detection, risk management, clearing &amp;amp; settlement, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How does VISA work when we swipe a credit card at a merchant’s shop?
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/visa_payment.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F28e9ne5ygedr5qeurvcv.jpeg" width="800" height="1153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;VISA, Mastercard, and American Express act as card networks for the clearing and settling of funds. The card acquiring bank and the card issuing bank can be – and often are – different. If banks were to settle transactions one by one without an intermediary, each bank would have to settle the transactions with all the other banks. This is quite inefficient.&lt;/p&gt;

&lt;p&gt;The diagram below shows VISA’s role in the credit card payment process. There are two flows involved. Authorization flow happens when the customer swipes the credit card. Capture and settlement flow happens when the merchant wants to get the money at the end of the day.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Authorization Flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Step 0: The card issuing bank issues credit cards to its customers.&lt;/p&gt;

&lt;p&gt;Step 1: The cardholder wants to buy a product and swipes the credit card at the Point of Sale (POS) terminal in the merchant’s shop.&lt;/p&gt;

&lt;p&gt;Step 2: The POS terminal sends the transaction to the acquiring bank, which has provided the POS terminal.&lt;/p&gt;

&lt;p&gt;Steps 3 and 4: The acquiring bank sends the transaction to the card network, also called the card scheme. The card network sends the transaction to the issuing bank for approval.&lt;/p&gt;

&lt;p&gt;Steps 4.1, 4.2 and 4.3: The issuing bank freezes the money if the transaction is approved. The approval or rejection is sent back to the acquirer, as well as the POS terminal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Capture and Settlement Flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Steps 1 and 2: The merchant wants to collect the money at the end of the day, so they hit ”capture” on the POS terminal. The transactions are sent to the acquirer in batch. The acquirer sends the batch file with transactions to the card network.&lt;/p&gt;

&lt;p&gt;Step 3: The card network performs clearing for the transactions collected from different acquirers, and sends the clearing files to different issuing banks.&lt;/p&gt;

&lt;p&gt;Step 4: The issuing banks confirm the correctness of the clearing files, and transfer money to the relevant acquiring banks.&lt;/p&gt;

&lt;p&gt;Step 5: The acquiring bank then transfers money to the merchant’s bank.&lt;/p&gt;

&lt;p&gt;Step 4: The card network clears up the transactions from different acquiring banks. Clearing is a process in which mutual offset transactions are netted, so the number of total transactions is reduced.&lt;/p&gt;

&lt;p&gt;In the process, the card network takes on the burden of talking to each bank and receives service fees in return.&lt;/p&gt;

&lt;h3&gt;
  
  
  Payment Systems Around The World Series (Part 1): Unified Payments Interface (UPI) in India
&lt;/h3&gt;

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

&lt;p&gt;What’s UPI? UPI is an instant real-time payment system developed by the National Payments Corporation of India.&lt;/p&gt;

&lt;p&gt;It accounts for 60% of digital retail transactions in India today.&lt;/p&gt;

&lt;p&gt;UPI = payment markup language + standard for interoperable payments&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/how-does-upi-work.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft8uje7r8caudv7mkuzm9.png" width="800" height="967"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  DevOps
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  DevOps vs. SRE vs. Platform Engineering. What is the difference?
&lt;/h3&gt;

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

&lt;p&gt;The concepts of DevOps, SRE, and Platform Engineering have emerged at different times and have been developed by various individuals and organizations.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/devops-sre-platform.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37cluxj1bg8zy1usytxo.jpg" width="800" height="1146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DevOps as a concept was introduced in 2009 by Patrick Debois and Andrew Shafer at the Agile conference. They sought to bridge the gap between software development and operations by promoting a collaborative culture and shared responsibility for the entire software development lifecycle.&lt;/p&gt;

&lt;p&gt;SRE, or Site Reliability Engineering, was pioneered by Google in the early 2000s to address operational challenges in managing large-scale, complex systems. Google developed SRE practices and tools, such as the Borg cluster management system and the Monarch monitoring system, to improve the reliability and efficiency of their services.&lt;/p&gt;

&lt;p&gt;Platform Engineering is a more recent concept, building on the foundation of SRE engineering. The precise origins of Platform Engineering are less clear, but it is generally understood to be an extension of the DevOps and SRE practices, with a focus on delivering a comprehensive platform for product development that supports the entire business perspective.&lt;/p&gt;

&lt;p&gt;It's worth noting that while these concepts emerged at different times. They are all related to the broader trend of improving collaboration, automation, and efficiency in software development and operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is k8s (Kubernetes)?
&lt;/h3&gt;

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

&lt;p&gt;K8s is a container orchestration system. It is used for container deployment and management. Its design is greatly impacted by Google’s internal system Borg.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/k8s.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12sam7t3j9kii8h8fdno.jpeg" width="800" height="1091"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A k8s cluster consists of a set of worker machines, called nodes, that run containerized applications. Every cluster has at least one worker node.&lt;/p&gt;

&lt;p&gt;The worker node(s) host the Pods that are the components of the application workload. The control plane manages the worker nodes and the Pods in the cluster. In production environments, the control plane usually runs across multiple computers, and a cluster usually runs multiple nodes, providing fault tolerance and high availability.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Control Plane Components&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;API Server&lt;/p&gt;

&lt;p&gt;The API server talks to all the components in the k8s cluster. All the operations on pods are executed by talking to the API server.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scheduler&lt;/p&gt;

&lt;p&gt;The scheduler watches pod workloads and assigns loads on newly created pods.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Controller Manager&lt;/p&gt;

&lt;p&gt;The controller manager runs the controllers, including Node Controller, Job Controller, EndpointSlice Controller, and ServiceAccount Controller.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Etcd&lt;/p&gt;

&lt;p&gt;etcd is a key-value store used as Kubernetes' backing store for all cluster data.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;  Nodes&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Pods&lt;/p&gt;

&lt;p&gt;A pod is a group of containers and is the smallest unit that k8s administers. Pods have a single IP address applied to every container within the pod.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kubelet&lt;/p&gt;

&lt;p&gt;An agent that runs on each node in the cluster. It ensures containers are running in a Pod.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kube Proxy&lt;/p&gt;

&lt;p&gt;Kube-proxy is a network proxy that runs on each node in your cluster. It routes traffic coming into a node from the service. It forwards requests for work to the correct containers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Docker vs. Kubernetes. Which one should we use?
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/docker-vs-k8s.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fag83kipa33kskrvt44xp.jpg" width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What is Docker ?&lt;/p&gt;

&lt;p&gt;Docker is an open-source platform that allows you to package, distribute, and run applications in isolated containers. It focuses on containerization, providing lightweight environments that encapsulate applications and their dependencies.&lt;/p&gt;

&lt;p&gt;What is Kubernetes ?&lt;/p&gt;

&lt;p&gt;Kubernetes, often referred to as K8s, is an open-source container orchestration platform. It provides a framework for automating the deployment, scaling, and management of containerized applications across a cluster of nodes.&lt;/p&gt;

&lt;p&gt;How are both different from each other ?&lt;/p&gt;

&lt;p&gt;Docker: Docker operates at the individual container level on a single operating system host.&lt;/p&gt;

&lt;p&gt;You must manually manage each host and setting up networks, security policies, and storage for multiple related containers can be complex.&lt;/p&gt;

&lt;p&gt;Kubernetes: Kubernetes operates at the cluster level. It manages multiple containerized applications across multiple hosts, providing automation for tasks like load balancing, scaling, and ensuring the desired state of applications.&lt;/p&gt;

&lt;p&gt;In short, Docker focuses on containerization and running containers on individual hosts, while Kubernetes specializes in managing and orchestrating containers at scale across a cluster of hosts.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does Docker work?
&lt;/h3&gt;

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

&lt;p&gt;The diagram below shows the architecture of Docker and how it works when we run “docker build”, “docker pull” and “docker run”.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/docker.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F85e16n0rrcxc2b8xjiea.jpg" width="800" height="766"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are 3 components in Docker architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Docker client&lt;/p&gt;

&lt;p&gt;The docker client talks to the Docker daemon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker host&lt;/p&gt;

&lt;p&gt;The Docker daemon listens for Docker API requests and manages Docker objects such as images, containers, networks, and volumes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker registry&lt;/p&gt;

&lt;p&gt;A Docker registry stores Docker images. Docker Hub is a public registry that anyone can use.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s take the “docker run” command as an example.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Docker pulls the image from the registry.&lt;/li&gt;
&lt;li&gt; Docker creates a new container.&lt;/li&gt;
&lt;li&gt; Docker allocates a read-write filesystem to the container.&lt;/li&gt;
&lt;li&gt; Docker creates a network interface to connect the container to the default network.&lt;/li&gt;
&lt;li&gt; Docker starts the container.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  GIT
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  How Git Commands work
&lt;/h3&gt;

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

&lt;p&gt;To begin with, it's essential to identify where our code is stored. The common assumption is that there are only two locations - one on a remote server like Github and the other on our local machine. However, this isn't entirely accurate. Git maintains three local storages on our machine, which means that our code can be found in four places:&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/git-commands.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frgy0k2zoptpuk60opceh.png" width="800" height="791"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Working directory: where we edit files&lt;/li&gt;
&lt;li&gt;  Staging area: a temporary location where files are kept for the next commit&lt;/li&gt;
&lt;li&gt;  Local repository: contains the code that has been committed&lt;/li&gt;
&lt;li&gt;  Remote repository: the remote server that stores the code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most Git commands primarily move files between these four locations.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does Git Work?
&lt;/h3&gt;

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

&lt;p&gt;The diagram below shows the Git workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/git-workflow.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6pvj6mnhxjgc3ab9ioes.jpeg" width="800" height="1212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Git is a distributed version control system.&lt;/p&gt;

&lt;p&gt;Every developer maintains a local copy of the main repository and edits and commits to the local copy.&lt;/p&gt;

&lt;p&gt;The commit is very fast because the operation doesn’t interact with the remote repository.&lt;/p&gt;

&lt;p&gt;If the remote repository crashes, the files can be recovered from the local repositories.&lt;/p&gt;

&lt;h3&gt;
  
  
  Git merge vs. Git rebase
&lt;/h3&gt;

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

&lt;p&gt;What are the differences?&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/git-merge-git-rebase.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6xztpah9r2pai0mo1sul.jpeg" width="800" height="992"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When we &lt;strong&gt;merge changes&lt;/strong&gt; from one Git branch to another, we can use ‘git merge’ or ‘git rebase’. The diagram below shows how the two commands work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Git merge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This creates a new commit G’ in the main branch. G’ ties the histories of both main and feature branches.&lt;/p&gt;

&lt;p&gt;Git merge is &lt;strong&gt;non-destructive&lt;/strong&gt;. Neither the main nor the feature branch is changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Git rebase&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Git rebase moves the feature branch histories to the head of the main branch. It creates new commits E’, F’, and G’ for each commit in the feature branch.&lt;/p&gt;

&lt;p&gt;The benefit of rebase is that it has a linear &lt;strong&gt;commit history&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Rebase can be dangerous if “the golden rule of git rebase” is not followed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Golden Rule of Git Rebase&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Never use it on public branches!&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloud Services
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  A nice cheat sheet of different cloud services (2023 edition)
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/cloud-compare.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FByteByteGoHq%2Fsystem-design-101%2Fraw%2Fmain%2Fimages%2Fcloud-compare.jpg" width="800" height="1235"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is cloud native?
&lt;/h3&gt;

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

&lt;p&gt;Below is a diagram showing the evolution of architecture and processes since the 1980s.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/cloud-native.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3378im7rrcw1bsngmuy.jpeg" width="800" height="1025"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Organizations can build and run scalable applications on public, private, and hybrid clouds using cloud native technologies.&lt;/p&gt;

&lt;p&gt;This means the applications are designed to leverage cloud features, so they are resilient to load and easy to scale.&lt;/p&gt;

&lt;p&gt;Cloud native includes 4 aspects:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Development process&lt;/p&gt;

&lt;p&gt;This has progressed from waterfall to agile to DevOps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Application Architecture&lt;/p&gt;

&lt;p&gt;The architecture has gone from monolithic to microservices. Each service is designed to be small, adaptive to the limited resources in cloud containers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deployment &amp;amp; packaging&lt;/p&gt;

&lt;p&gt;The applications used to be deployed on physical servers. Then around 2000, the applications that were not sensitive to latency were usually deployed on virtual servers. With cloud native applications, they are packaged into docker images and deployed in containers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Application infrastructure&lt;/p&gt;

&lt;p&gt;The applications are massively deployed on cloud infrastructure instead of self-hosted servers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Developer productivity tools
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  Visualize JSON files
&lt;/h3&gt;

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

&lt;p&gt;Nested JSON files are hard to read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JsonCrack&lt;/strong&gt; generates graph diagrams from JSON files and makes them easy to read.&lt;/p&gt;

&lt;p&gt;Additionally, the generated diagrams can be downloaded as images.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/json-cracker.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffp931dx2pne6f09oggyc.jpeg" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Automatically turn code into architecture diagrams
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/diagrams_as_code.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczb6j6uug33sxk354zhm.jpeg" width="800" height="1414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What does it do?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Draw the cloud system architecture in Python code.&lt;/li&gt;
&lt;li&gt;  Diagrams can also be rendered directly inside the Jupyter Notebooks.&lt;/li&gt;
&lt;li&gt;  No design tools are needed.&lt;/li&gt;
&lt;li&gt;  Supports the following providers: AWS, Azure, GCP, Kubernetes, Alibaba Cloud, Oracle Cloud, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/mingrammer/diagrams" rel="noopener noreferrer"&gt;Github repo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Linux
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  Linux file system explained
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/linux-file-systems.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8kfi74lkx91i28ragff.jpg" width="800" height="913"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Linux file system used to resemble an unorganized town where individuals constructed their houses wherever they pleased. However, in 1994, the Filesystem Hierarchy Standard (FHS) was introduced to bring order to the Linux file system.&lt;/p&gt;

&lt;p&gt;By implementing a standard like the FHS, software can ensure a consistent layout across various Linux distributions. Nonetheless, not all Linux distributions strictly adhere to this standard. They often incorporate their own unique elements or cater to specific requirements. To become proficient in this standard, you can begin by exploring. Utilize commands such as "cd" for navigation and "ls" for listing directory contents. Imagine the file system as a tree, starting from the root (/). With time, it will become second nature to you, transforming you into a skilled Linux administrator.&lt;/p&gt;

&lt;h3&gt;
  
  
  18 Most-used Linux Commands You Should Know
&lt;/h3&gt;

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

&lt;p&gt;Linux commands are instructions for interacting with the operating system. They help manage files, directories, system processes, and many other aspects of the system. You need to become familiar with these commands in order to navigate and maintain Linux-based systems efficiently and effectively.&lt;/p&gt;

&lt;p&gt;This diagram below shows popular Linux commands:&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/18%20Most-Used%20Linux%20Commands%20You%20Should%20Know-01.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FByteByteGoHq%2Fsystem-design-101%2Fraw%2Fmain%2Fimages%2F18%2520Most-Used%2520Linux%2520Commands%2520You%2520Should%2520Know-01.jpeg" width="800" height="942"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  ls - List files and directories&lt;/li&gt;
&lt;li&gt;  cd - Change the current directory&lt;/li&gt;
&lt;li&gt;  mkdir - Create a new directory&lt;/li&gt;
&lt;li&gt;  rm - Remove files or directories&lt;/li&gt;
&lt;li&gt;  cp - Copy files or directories&lt;/li&gt;
&lt;li&gt;  mv - Move or rename files or directories&lt;/li&gt;
&lt;li&gt;  chmod - Change file or directory permissions&lt;/li&gt;
&lt;li&gt;  grep - Search for a pattern in files&lt;/li&gt;
&lt;li&gt;  find - Search for files and directories&lt;/li&gt;
&lt;li&gt;  tar - manipulate tarball archive files&lt;/li&gt;
&lt;li&gt;  vi - Edit files using text editors&lt;/li&gt;
&lt;li&gt;  cat - display the content of files&lt;/li&gt;
&lt;li&gt;  top - Display processes and resource usage&lt;/li&gt;
&lt;li&gt;  ps - Display processes information&lt;/li&gt;
&lt;li&gt;  kill - Terminate a process by sending a signal&lt;/li&gt;
&lt;li&gt;  du - Estimate file space usage&lt;/li&gt;
&lt;li&gt;  ifconfig - Configure network interfaces&lt;/li&gt;
&lt;li&gt;  ping - Test network connectivity between hosts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Security
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  How does HTTPS work?
&lt;/h3&gt;

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

&lt;p&gt;Hypertext Transfer Protocol Secure (HTTPS) is an extension of the Hypertext Transfer Protocol (HTTP.) HTTPS transmits encrypted data using Transport Layer Security (TLS.) If the data is hijacked online, all the hijacker gets is binary code.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/https.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fufs89oxnq8v4akql8jzn.jpg" width="800" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How is the data encrypted and decrypted?&lt;/p&gt;

&lt;p&gt;Step 1 - The client (browser) and the server establish a TCP connection.&lt;/p&gt;

&lt;p&gt;Step 2 - The client sends a “client hello” to the server. The message contains a set of necessary encryption algorithms (cipher suites) and the latest TLS version it can support. The server responds with a “server hello” so the browser knows whether it can support the algorithms and TLS version.&lt;/p&gt;

&lt;p&gt;The server then sends the SSL certificate to the client. The certificate contains the public key, host name, expiry dates, etc. The client validates the certificate.&lt;/p&gt;

&lt;p&gt;Step 3 - After validating the SSL certificate, the client generates a session key and encrypts it using the public key. The server receives the encrypted session key and decrypts it with the private key.&lt;/p&gt;

&lt;p&gt;Step 4 - Now that both the client and the server hold the same session key (symmetric encryption), the encrypted data is transmitted in a secure bi-directional channel.&lt;/p&gt;

&lt;p&gt;Why does HTTPS switch to symmetric encryption during data transmission? There are two main reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Security: The asymmetric encryption goes only one way. This means that if the server tries to send the encrypted data back to the client, anyone can decrypt the data using the public key.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Server resources: The asymmetric encryption adds quite a lot of mathematical overhead. It is not suitable for data transmissions in long sessions.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Oauth 2.0 Explained With Simple Terms.
&lt;/h3&gt;

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

&lt;p&gt;OAuth 2.0 is a powerful and secure framework that allows different applications to securely interact with each other on behalf of users without sharing sensitive credentials.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/oAuth2.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FByteByteGoHq%2Fsystem-design-101%2Fraw%2Fmain%2Fimages%2FoAuth2.jpg" width="800" height="1040"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The entities involved in OAuth are the User, the Server, and the Identity Provider (IDP).&lt;/p&gt;

&lt;p&gt;What Can an OAuth Token Do?&lt;/p&gt;

&lt;p&gt;When you use OAuth, you get an OAuth token that represents your identity and permissions. This token can do a few important things:&lt;/p&gt;

&lt;p&gt;Single Sign-On (SSO): With an OAuth token, you can log into multiple services or apps using just one login, making life easier and safer.&lt;/p&gt;

&lt;p&gt;Authorization Across Systems: The OAuth token allows you to share your authorization or access rights across various systems, so you don't have to log in separately everywhere.&lt;/p&gt;

&lt;p&gt;Accessing User Profile: Apps with an OAuth token can access certain parts of your user profile that you allow, but they won't see everything.&lt;/p&gt;

&lt;p&gt;Remember, OAuth 2.0 is all about keeping you and your data safe while making your online experiences seamless and hassle-free across different applications and services.&lt;/p&gt;

&lt;h3&gt;
  
  
  Top 4 Forms of Authentication Mechanisms
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/top4-most-used-auth.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FByteByteGoHq%2Fsystem-design-101%2Fraw%2Fmain%2Fimages%2Ftop4-most-used-auth.jpg" width="800" height="1062"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;SSH Keys:&lt;/p&gt;

&lt;p&gt;Cryptographic keys are used to access remote systems and servers securely&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OAuth Tokens:&lt;/p&gt;

&lt;p&gt;Tokens that provide limited access to user data on third-party applications&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SSL Certificates:&lt;/p&gt;

&lt;p&gt;Digital certificates ensure secure and encrypted communication between servers and clients&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Credentials:&lt;/p&gt;

&lt;p&gt;User authentication information is used to verify and grant access to various systems and services&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Session, cookie, JWT, token, SSO, and OAuth 2.0 - what are they?
&lt;/h3&gt;

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

&lt;p&gt;These terms are all related to user identity management. When you log into a website, you declare who you are (identification). Your identity is verified (authentication), and you are granted the necessary permissions (authorization). Many solutions have been proposed in the past, and the list keeps growing.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/session.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7wi8rcri2yhb4igfo1h.jpeg" width="800" height="932"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From simple to complex, here is my understanding of user identity management:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;WWW-Authenticate is the most basic method. You are asked for the username and password by the browser. As a result of the inability to control the login life cycle, it is seldom used today.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A finer control over the login life cycle is session-cookie. The server maintains session storage, and the browser keeps the ID of the session. A cookie usually only works with browsers and is not mobile app friendly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To address the compatibility issue, the token can be used. The client sends the token to the server, and the server validates the token. The downside is that the token needs to be encrypted and decrypted, which may be time-consuming.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JWT is a standard way of representing tokens. This information can be verified and trusted because it is digitally signed. Since JWT contains the signature, there is no need to save session information on the server side.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By using SSO (single sign-on), you can sign on only once and log in to multiple websites. It uses CAS (central authentication service) to maintain cross-site information.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By using OAuth 2.0, you can authorize one website to access your information on another website.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to store passwords safely in the database and how to validate a password?
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/salt.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnd4fze6b92qtdpoh7k60.jpg" width="800" height="831"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Things NOT to do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Storing passwords in plain text is not a good idea because anyone with internal access can see them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Storing password hashes directly is not sufficient because it is pruned to precomputation attacks, such as rainbow tables.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To mitigate precomputation attacks, we salt the passwords.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What is salt?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;According to OWASP guidelines, “a salt is a unique, randomly generated string that is added to each password as part of the hashing process”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to store a password and salt?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; the hash result is unique to each password.&lt;/li&gt;
&lt;li&gt; The password can be stored in the database using the following format: hash(password + salt).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;How to validate a password?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To validate a password, it can go through the following process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; A client enters the password.&lt;/li&gt;
&lt;li&gt; The system fetches the corresponding salt from the database.&lt;/li&gt;
&lt;li&gt; The system appends the salt to the password and hashes it. Let’s call the hashed value H1.&lt;/li&gt;
&lt;li&gt; The system compares H1 and H2, where H2 is the hash stored in the database. If they are the same, the password is valid.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Explaining JSON Web Token (JWT) to a 10 year old Kid
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/jwt.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqq7p5vjrft6u1iqx8d8z.jpg" width="800" height="803"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagine you have a special box called a JWT. Inside this box, there are three parts: a header, a payload, and a signature.&lt;/p&gt;

&lt;p&gt;The header is like the label on the outside of the box. It tells us what type of box it is and how it's secured. It's usually written in a format called JSON, which is just a way to organize information using curly braces { } and colons : .&lt;/p&gt;

&lt;p&gt;The payload is like the actual message or information you want to send. It could be your name, age, or any other data you want to share. It's also written in JSON format, so it's easy to understand and work with. Now, the signature is what makes the JWT secure. It's like a special seal that only the sender knows how to create. The signature is created using a secret code, kind of like a password. This signature ensures that nobody can tamper with the contents of the JWT without the sender knowing about it.&lt;/p&gt;

&lt;p&gt;When you want to send the JWT to a server, you put the header, payload, and signature inside the box. Then you send it over to the server. The server can easily read the header and payload to understand who you are and what you want to do.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does Google Authenticator (or other types of 2-factor authenticators) work?
&lt;/h3&gt;

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

&lt;p&gt;Google Authenticator is commonly used for logging into our accounts when 2-factor authentication is enabled. How does it guarantee security?&lt;/p&gt;

&lt;p&gt;Google Authenticator is a software-based authenticator that implements a two-step verification service. The diagram below provides detail.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/google_authenticate.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fps6zm4qlvyn51oskvsbp.jpeg" width="800" height="931"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are two stages involved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Stage 1 - The user enables Google two-step verification.&lt;/li&gt;
&lt;li&gt;  Stage 2 - The user uses the authenticator for logging in, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s look at these stages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Steps 1 and 2: Bob opens the web page to enable two-step verification. The front end requests a secret key. The authentication service generates the secret key for Bob and stores it in the database.&lt;/p&gt;

&lt;p&gt;Step 3: The authentication service returns a URI to the front end. The URI is composed of a key issuer, username, and secret key. The URI is displayed in the form of a QR code on the web page.&lt;/p&gt;

&lt;p&gt;Step 4: Bob then uses Google Authenticator to scan the generated QR code. The secret key is stored in the authenticator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 2&lt;/strong&gt; Steps 1 and 2: Bob wants to log into a website with Google two-step verification. For this, he needs the password. Every 30 seconds, Google Authenticator generates a 6-digit password using TOTP (Time-based One Time Password) algorithm. Bob uses the password to enter the website.&lt;/p&gt;

&lt;p&gt;Steps 3 and 4: The frontend sends the password Bob enters to the backend for authentication. The authentication service reads the secret key from the database and generates a 6-digit password using the same TOTP algorithm as the client.&lt;/p&gt;

&lt;p&gt;Step 5: The authentication service compares the two passwords generated by the client and the server, and returns the comparison result to the frontend. Bob can proceed with the login process only if the two passwords match.&lt;/p&gt;

&lt;p&gt;Is this authentication mechanism safe?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Can the secret key be obtained by others?&lt;/p&gt;

&lt;p&gt;We need to make sure the secret key is transmitted using HTTPS. The authenticator client and the database store the secret key, and we need to make sure the secret keys are encrypted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Can the 6-digit password be guessed by hackers?&lt;/p&gt;

&lt;p&gt;No. The password has 6 digits, so the generated password has 1 million potential combinations. Plus, the password changes every 30 seconds. If hackers want to guess the password in 30 seconds, they need to enter 30,000 combinations per second.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real World Case Studies
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  Netflix's Tech Stack
&lt;/h3&gt;

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

&lt;p&gt;This post is based on research from many Netflix engineering blogs and open-source projects. If you come across any inaccuracies, please feel free to inform us.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/netflix%20tech%20stack.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FByteByteGoHq%2Fsystem-design-101%2Fraw%2Fmain%2Fimages%2Fnetflix%2520tech%2520stack.png" width="800" height="1131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mobile and web&lt;/strong&gt;: Netflix has adopted Swift and Kotlin to build native mobile apps. For its web application, it uses React.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontend/server communication&lt;/strong&gt;: Netflix uses GraphQL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend services&lt;/strong&gt;: Netflix relies on ZUUL, Eureka, the Spring Boot framework, and other technologies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Databases&lt;/strong&gt;: Netflix utilizes EV cache, Cassandra, CockroachDB, and other databases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Messaging/streaming&lt;/strong&gt;: Netflix employs Apache Kafka and Fink for messaging and streaming purposes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video storage&lt;/strong&gt;: Netflix uses S3 and Open Connect for video storage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data processing&lt;/strong&gt;: Netflix utilizes Flink and Spark for data processing, which is then visualized using Tableau. Redshift is used for processing structured data warehouse information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CI/CD&lt;/strong&gt;: Netflix employs various tools such as JIRA, Confluence, PagerDuty, Jenkins, Gradle, Chaos Monkey, Spinnaker, Atlas, and more for CI/CD processes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Twitter Architecture 2022
&lt;/h3&gt;

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

&lt;p&gt;Yes, this is the real Twitter architecture. It is posted by Elon Musk and redrawn by us for better readability.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/twitter-arch.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc94de9c6nd60al0rl0my.jpeg" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Evolution of Airbnb’s microservice architecture over the past 15 years
&lt;/h3&gt;

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

&lt;p&gt;Airbnb’s microservice architecture went through 3 main stages.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/airbnb_arch.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogjddiv3d0xya5zyysye.jpeg" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Monolith (2008 - 2017)&lt;/p&gt;

&lt;p&gt;Airbnb began as a simple marketplace for hosts and guests. This is built in a Ruby on Rails application - the monolith.&lt;/p&gt;

&lt;p&gt;What’s the challenge?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Confusing team ownership + unowned code&lt;/li&gt;
&lt;li&gt;  Slow deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Microservices (2017 - 2020)&lt;/p&gt;

&lt;p&gt;Microservice aims to solve those challenges. In the microservice architecture, key services include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Data fetching service&lt;/li&gt;
&lt;li&gt;  Business logic data service&lt;/li&gt;
&lt;li&gt;  Write workflow service&lt;/li&gt;
&lt;li&gt;  UI aggregation service&lt;/li&gt;
&lt;li&gt;  Each service had one owning team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What’s the challenge?&lt;/p&gt;

&lt;p&gt;Hundreds of services and dependencies were difficult for humans to manage.&lt;/p&gt;

&lt;p&gt;Micro + macroservices (2020 - present)&lt;/p&gt;

&lt;p&gt;This is what Airbnb is working on now. The micro and macroservice hybrid model focuses on the unification of APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monorepo vs. Microrepo.
&lt;/h3&gt;

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

&lt;p&gt;Which is the best? Why do different companies choose different options?&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/monorepo-microrepo.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb8nud5lff8yx4n4wcs6s.jpg" width="800" height="1131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Monorepo isn't new; Linux and Windows were both created using Monorepo. To improve scalability and build speed, Google developed its internal dedicated toolchain to scale it faster and strict coding quality standards to keep it consistent.&lt;/p&gt;

&lt;p&gt;Amazon and Netflix are major ambassadors of the Microservice philosophy. This approach naturally separates the service code into separate repositories. It scales faster but can lead to governance pain points later on.&lt;/p&gt;

&lt;p&gt;Within Monorepo, each service is a folder, and every folder has a BUILD config and OWNERS permission control. Every service member is responsible for their own folder.&lt;/p&gt;

&lt;p&gt;On the other hand, in Microrepo, each service is responsible for its repository, with the build config and permissions typically set for the entire repository.&lt;/p&gt;

&lt;p&gt;In Monorepo, dependencies are shared across the entire codebase regardless of your business, so when there's a version upgrade, every codebase upgrades their version.&lt;/p&gt;

&lt;p&gt;In Microrepo, dependencies are controlled within each repository. Businesses choose when to upgrade their versions based on their own schedules.&lt;/p&gt;

&lt;p&gt;Monorepo has a standard for check-ins. Google's code review process is famously known for setting a high bar, ensuring a coherent quality standard for Monorepo, regardless of the business.&lt;/p&gt;

&lt;p&gt;Microrepo can either set its own standard or adopt a shared standard by incorporating the best practices. It can scale faster for business, but the code quality might be a bit different. Google engineers built Bazel, and Meta built Buck. There are other open-source tools available, including Nx, Lerna, and others.&lt;/p&gt;

&lt;p&gt;Over the years, Microrepo has had more supported tools, including Maven and Gradle for Java, NPM for NodeJS, and CMake for C/C++, among others.&lt;/p&gt;

&lt;h3&gt;
  
  
  How will you design the Stack Overflow website?
&lt;/h3&gt;

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

&lt;p&gt;If your answer is on-premise servers and monolith (on the bottom of the following image), you would likely fail the interview, but that's how it is built in reality!&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/stackoverflow.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxkghjvpsfaad1twp1gz4.jpg" width="800" height="848"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What people think it should look like&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The interviewer is probably expecting something like the top portion of the picture.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Microservice is used to decompose the system into small components.&lt;/li&gt;
&lt;li&gt;  Each service has its own database. Use cache heavily.&lt;/li&gt;
&lt;li&gt;  The service is sharded.&lt;/li&gt;
&lt;li&gt;  The services talk to each other asynchronously through message queues.&lt;/li&gt;
&lt;li&gt;  The service is implemented using Event Sourcing with CQRS.&lt;/li&gt;
&lt;li&gt;  Showing off knowledge in distributed systems such as eventual consistency, CAP theorem, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What it actually is&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stack Overflow serves all the traffic with only 9 on-premise web servers, and it’s on monolith! It has its own servers and does not run on the cloud.&lt;/p&gt;

&lt;p&gt;This is contrary to all our popular beliefs these days.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why did Amazon Prime Video monitoring move from serverless to monolithic? How can it save 90% cost?
&lt;/h3&gt;

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

&lt;p&gt;The diagram below shows the architecture comparison before and after the migration.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/serverless-to-monolithic.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjhg9n6w9cxs8s8ytdwyc.jpeg" width="800" height="875"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What is Amazon Prime Video Monitoring Service?&lt;/p&gt;

&lt;p&gt;Prime Video service needs to monitor the quality of thousands of live streams. The monitoring tool automatically analyzes the streams in real time and identifies quality issues like block corruption, video freeze, and sync problems. This is an important process for customer satisfaction.&lt;/p&gt;

&lt;p&gt;There are 3 steps: media converter, defect detector, and real-time notification.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;What is the problem with the old architecture?&lt;/p&gt;

&lt;p&gt;The old architecture was based on Amazon Lambda, which was good for building services quickly. However, it was not cost-effective when running the architecture at a high scale. The two most expensive operations are:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The orchestration workflow - AWS step functions charge users by state transitions and the orchestration performs multiple state transitions every second.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data passing between distributed components - the intermediate data is stored in Amazon S3 so that the next stage can download. The download can be costly when the volume is high.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Monolithic architecture saves 90% cost&lt;/p&gt;

&lt;p&gt;A monolithic architecture is designed to address the cost issues. There are still 3 components, but the media converter and defect detector are deployed in the same process, saving the cost of passing data over the network. Surprisingly, this approach to deployment architecture change led to 90% cost savings!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is an interesting and unique case study because microservices have become a go-to and fashionable choice in the tech industry. It's good to see that we are having more discussions about evolving the architecture and having more honest discussions about its pros and cons. Decomposing components into distributed microservices comes with a cost.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;What did Amazon leaders say about this?&lt;/p&gt;

&lt;p&gt;Amazon CTO Werner Vogels: “Building &lt;strong&gt;evolvable software systems&lt;/strong&gt; is a strategy, not a religion. And revisiting your architecture with an open mind is a must.”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ex Amazon VP Sustainability Adrian Cockcroft: “The Prime Video team had followed a path I call &lt;strong&gt;Serverless First&lt;/strong&gt;…I don’t advocate &lt;strong&gt;Serverless Only&lt;/strong&gt;”.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does Disney Hotstar capture 5 Billion Emojis during a tournament?
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/hotstar_emojis.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhiqdr5wmzpyldkla9zu.jpeg" width="800" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Clients send emojis through standard HTTP requests. You can think of Golang Service as a typical Web Server. Golang is chosen because it supports concurrency well. Threads in Golang are lightweight.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Since the write volume is very high, Kafka (message queue) is used as a buffer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Emoji data are aggregated by a streaming processing service called Spark. It aggregates data every 2 seconds, which is configurable. There is a trade-off to be made based on the interval. A shorter interval means emojis are delivered to other clients faster but it also means more computing resources are needed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aggregated data is written to another Kafka.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The PubSub consumers pull aggregated emoji data from Kafka.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Emojis are delivered to other clients in real-time through the PubSub infrastructure. The PubSub infrastructure is interesting. Hotstar considered the following protocols: Socketio, NATS, MQTT, and gRPC, and settled with MQTT.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A similar design is adopted by LinkedIn which streams a million likes/sec.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Discord Stores Trillions Of Messages
&lt;/h3&gt;

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

&lt;p&gt;The diagram below shows the evolution of message storage at Discord:&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/discord-store-messages.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjf1s0kgbzpk24clzg9k7.jpg" width="800" height="678"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MongoDB ➡️ Cassandra ➡️ ScyllaDB&lt;/p&gt;

&lt;p&gt;In 2015, the first version of Discord was built on top of a single MongoDB replica. Around Nov 2015, MongoDB stored 100 million messages and the RAM couldn’t hold the data and index any longer. The latency became unpredictable. Message storage needs to be moved to another database. Cassandra was chosen.&lt;/p&gt;

&lt;p&gt;In 2017, Discord had 12 Cassandra nodes and stored billions of messages.&lt;/p&gt;

&lt;p&gt;At the beginning of 2022, it had 177 nodes with trillions of messages. At this point, latency was unpredictable, and maintenance operations became too expensive to run.&lt;/p&gt;

&lt;p&gt;There are several reasons for the issue:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Cassandra uses the LSM tree for the internal data structure. The reads are more expensive than the writes. There can be many concurrent reads on a server with hundreds of users, resulting in hotspots.&lt;/li&gt;
&lt;li&gt;  Maintaining clusters, such as compacting SSTables, impacts performance.&lt;/li&gt;
&lt;li&gt;  Garbage collection pauses would cause significant latency spikes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ScyllaDB is Cassandra compatible database written in C++. Discord redesigned its architecture to have a monolithic API, a data service written in Rust, and ScyllaDB-based storage.&lt;/p&gt;

&lt;p&gt;The p99 read latency in ScyllaDB is 15ms compared to 40-125ms in Cassandra. The p99 write latency is 5ms compared to 5-70ms in Cassandra.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do video live streamings work on YouTube, TikTok live, or Twitch?
&lt;/h3&gt;

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

&lt;p&gt;Live streaming differs from regular streaming because the video content is sent via the internet in real-time, usually with a latency of just a few seconds.&lt;/p&gt;

&lt;p&gt;The diagram below explains what happens behind the scenes to make this possible.&lt;/p&gt;

&lt;p&gt;&lt;a href="/ByteByteGoHq/system-design-101/blob/main/images/live_streaming_updated.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3b6rkavddid1z49w9k5f.jpg" width="800" height="982"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 1: The raw video data is captured by a microphone and camera. The data is sent to the server side.&lt;/p&gt;

&lt;p&gt;Step 2: The video data is compressed and encoded. For example, the compressing algorithm separates the background and other video elements. After compression, the video is encoded to standards such as H.264. The size of the video data is much smaller after this step.&lt;/p&gt;

&lt;p&gt;Step 3: The encoded data is divided into smaller segments, usually seconds in length, so it takes much less time to download or stream.&lt;/p&gt;

&lt;p&gt;Step 4: The segmented data is sent to the streaming server. The streaming server needs to support different devices and network conditions. This is called ‘Adaptive Bitrate Streaming.’ This means we need to produce multiple files at different bitrates in steps 2 and 3.&lt;/p&gt;

&lt;p&gt;Step 5: The live streaming data is pushed to edge servers supported by CDN (Content Delivery Network.) Millions of viewers can watch the video from an edge server nearby. CDN significantly lowers data transmission latency.&lt;/p&gt;

&lt;p&gt;Step 6: The viewers’ devices decode and decompress the video data and play the video in a video player.&lt;/p&gt;

&lt;p&gt;Steps 7 and 8: If the video needs to be stored for replay, the encoded data is sent to a storage server, and viewers can request a replay from it later.&lt;/p&gt;

&lt;p&gt;Standard protocols for live streaming include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  RTMP (Real-Time Messaging Protocol): This was originally developed by Macromedia to transmit data between a Flash player and a server. Now it is used for streaming video data over the internet. Note that video conferencing applications like Skype use RTC (Real-Time Communication) protocol for lower latency.&lt;/li&gt;
&lt;li&gt;  HLS (HTTP Live Streaming): It requires the H.264 or H.265 encoding. Apple devices accept only HLS format.&lt;/li&gt;
&lt;li&gt;  DASH (Dynamic Adaptive Streaming over HTTP): DASH does not support Apple devices.&lt;/li&gt;
&lt;li&gt;  Both HLS and DASH support adaptive bitrate streaming.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

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

&lt;p&gt;This work is licensed under &lt;a href="http://creativecommons.org/licenses/by-nc-nd/4.0/?ref=chooser-v1" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c694114258cf3478eda2c00e0caa1c03fd31b51a6de35ec4c67e6484e25b5042/68747470733a2f2f6d6972726f72732e6372656174697665636f6d6d6f6e732e6f72672f70726573736b69742f69636f6e732f63632e7376673f7265663d63686f6f7365722d7631" width="64" height="64"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>kubernetes</category>
      <category>designsystem</category>
    </item>
    <item>
      <title>DevOps Labs : Guide to Setup Node.js 23, React, NestJS, Next.js, and Nginx on EC2 Ubuntu 24.04</title>
      <dc:creator>Hoang Guruu</dc:creator>
      <pubDate>Thu, 20 Feb 2025 03:31:29 +0000</pubDate>
      <link>https://dev.to/aws-builders/guide-to-setup-nodejs-23-react-nestjs-nextjs-and-nginx-on-ec2-ubuntu-2404-4ei6</link>
      <guid>https://dev.to/aws-builders/guide-to-setup-nodejs-23-react-nestjs-nextjs-and-nginx-on-ec2-ubuntu-2404-4ei6</guid>
      <description>&lt;h1&gt;
  
  
  Guide to Setup Node.js 23, React, NestJS, Next.js, and Nginx on EC2 Ubuntu 24.04
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Install Node.js 23&lt;/li&gt;
&lt;li&gt;Setup React Application&lt;/li&gt;
&lt;li&gt;Install and Configure Nginx for React&lt;/li&gt;
&lt;li&gt;Setup NestJS and Next.js Applications&lt;/li&gt;
&lt;li&gt;Configure Nginx for NestJS and Next.js&lt;/li&gt;
&lt;li&gt;Start and Verify Applications&lt;/li&gt;
&lt;li&gt;Troubleshooting&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Install Node.js 23
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Update and Install Dependencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; curl gnupg2 lsb-release ca-certificates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Add NodeSource Repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://deb.nodesource.com/setup_23.x | &lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; bash -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Install Node.js 23
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nodejs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Verify Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node &lt;span class="nt"&gt;-v&lt;/span&gt;
npm &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Setup React Application
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Install &lt;code&gt;create-react-app&lt;/code&gt; and Create a Project
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-react-app my-react-app
&lt;span class="nb"&gt;cd &lt;/span&gt;my-react-app
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Start React Application
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Default React app runs on &lt;strong&gt;port 3000&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Install and Configure Nginx for React
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Install Nginx
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Enable and Start Nginx
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Configure Nginx Proxy for React
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/nginx/sites-available/default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace with the following configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;your_domain_or_IP&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="s"&gt;'upgrade'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_cache_bypass&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&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;
  
  
  Step 4: Test and Restart Nginx
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Setup NestJS and Next.js Applications
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Install NestJS CLI and Create a New Project
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @nestjs/cli
nest new my-nest-app
&lt;span class="nb"&gt;cd &lt;/span&gt;my-nest-app
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Change NestJS Port to 4000
&lt;/h3&gt;

&lt;p&gt;Edit &lt;code&gt;src/main.ts&lt;/code&gt; and modify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Start NestJS Server
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Setup Next.js Application
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-next-app@latest my-next-app
&lt;span class="nb"&gt;cd &lt;/span&gt;my-next-app
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Change Next.js Port to 3001
&lt;/h3&gt;

&lt;p&gt;Modify &lt;code&gt;package.json&lt;/code&gt; scripts:&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="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"next dev -p 3001"&lt;/span&gt;&lt;span class="w"&gt;
&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;h3&gt;
  
  
  Step 6: Start Next.js Application
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Configure Nginx for NestJS and Next.js
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Edit Nginx Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/nginx/sites-available/default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;your_domain_or_IP&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/react&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/nestjs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://localhost:4000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/next&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://localhost:3001&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;
  
  
  Step 2: Test and Restart Nginx
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Start and Verify Applications
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Start Applications
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/my-react-app &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm start &amp;amp;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/my-nest-app &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run start &amp;amp;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/my-next-app &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run dev &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Access Applications via Nginx
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React App:&lt;/strong&gt; &lt;code&gt;http://your_domain_or_IP/react&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NestJS App:&lt;/strong&gt; &lt;code&gt;http://your_domain_or_IP/nestjs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next.js App:&lt;/strong&gt; &lt;code&gt;http://your_domain_or_IP/next&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Nginx Not Starting?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Check logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-xe&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;React/NestJS/Next.js Not Running?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Check logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pm2 logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or restart manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node app.js 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;tee &lt;/span&gt;error.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You have successfully:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installed &lt;strong&gt;Node.js 23&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set up &lt;strong&gt;React, NestJS, and Next.js applications&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Configured &lt;strong&gt;Nginx as a reverse proxy&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you face any issues, check logs and verify configurations.&lt;/p&gt;




&lt;p&gt;🚀 &lt;strong&gt;Happy coding!&lt;/strong&gt; 🚀&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
    </item>
    <item>
      <title>DevOps CLI Linux Like a Pro!</title>
      <dc:creator>Hoang Guruu</dc:creator>
      <pubDate>Wed, 19 Feb 2025 09:59:13 +0000</pubDate>
      <link>https://dev.to/aws-builders/devops-cli-linux-like-a-pro-4mea</link>
      <guid>https://dev.to/aws-builders/devops-cli-linux-like-a-pro-4mea</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiao33bd2bdsvw4bgth51.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiao33bd2bdsvw4bgth51.jpg" alt="DevOps 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6c4ir74cigeucw9gun0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6c4ir74cigeucw9gun0.jpg" alt="DevOps 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg77spwwai89ybf6cgtj5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg77spwwai89ybf6cgtj5.jpg" alt="DevOps 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2xmqaxrfxt6sa9ky1ip3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2xmqaxrfxt6sa9ky1ip3.jpg" alt="DevOps 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft24s2csdjpz3hcdkwmq2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft24s2csdjpz3hcdkwmq2.jpg" alt="DevOps 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1yipxlzx9yh2ljz30ic4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1yipxlzx9yh2ljz30ic4.jpg" alt="DevOps 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsregderajdm78leyforv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsregderajdm78leyforv.jpg" alt="DevOps 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F40iym1pz043eawtj00yw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F40iym1pz043eawtj00yw.jpg" alt="DevOps 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9wvncui5t6c80dmgqr3s.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9wvncui5t6c80dmgqr3s.jpg" alt="DevOps 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6wycxltgpn4p0i6nnfch.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6wycxltgpn4p0i6nnfch.jpg" alt="DevOps 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6oruwn8ydrng97fzo7up.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6oruwn8ydrng97fzo7up.jpg" alt="DevOps 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm1nyvjkpvuzz3pnsdpk6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm1nyvjkpvuzz3pnsdpk6.jpg" alt="DevOps 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihrkn2t6z2n1yhyphcqn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihrkn2t6z2n1yhyphcqn.jpg" alt="DevOps 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3iaw65d3kv068694yz7k.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3iaw65d3kv068694yz7k.jpg" alt="DevOps 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F60e6ekn2248k3fego8gm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F60e6ekn2248k3fego8gm.jpg" alt="DevOps 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa2o00a21ji899oscjshe.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa2o00a21ji899oscjshe.jpg" alt="DevOps 1" width="800" height="1131"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
