<?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>Forem: Hrittik Bhattacharjee</title>
    <description>The latest articles on Forem by Hrittik Bhattacharjee (@the777ist).</description>
    <link>https://forem.com/the777ist</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%2F236994%2Fa30ba689-30c8-4548-bc7c-96979d106778.png</url>
      <title>Forem: Hrittik Bhattacharjee</title>
      <link>https://forem.com/the777ist</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/the777ist"/>
    <language>en</language>
    <item>
      <title>Bite-Sized Kubernetes Part 6 - Ingress, Volumes, Namespaces &amp; Clusters</title>
      <dc:creator>Hrittik Bhattacharjee</dc:creator>
      <pubDate>Thu, 09 Mar 2023 22:07:10 +0000</pubDate>
      <link>https://forem.com/the777ist/bite-sized-kubernetes-part-6-ingress-volumes-namespaces-clusters-c7e</link>
      <guid>https://forem.com/the777ist/bite-sized-kubernetes-part-6-ingress-volumes-namespaces-clusters-c7e</guid>
      <description>&lt;h2&gt;
  
  
  Land Ahoy!☸️
&lt;/h2&gt;

&lt;p&gt;You made it! Land in sight!🏝️&lt;br&gt;
In the last part we learnt about services in kubernetes.&lt;br&gt;
In this final part of the series, we shall be exploring &lt;strong&gt;Ingress&lt;/strong&gt;, &lt;strong&gt;Volumes&lt;/strong&gt; and &lt;strong&gt;Namespaces&lt;/strong&gt;! We shall also briefly revisit &lt;strong&gt;Clusters&lt;/strong&gt; since you already learnt what they are in &lt;a href="https://dev.to/espelar-dev/bite-sized-kubernetes-part-1-introduction-overview-k38"&gt;Part 1&lt;/a&gt;!&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;OBJECT&lt;/th&gt;
&lt;th&gt;DESCRIPTION&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pods&lt;/td&gt;
&lt;td&gt;The lowest level, single instance of an application&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ReplicaSets&lt;/td&gt;
&lt;td&gt;The next level, manages a set of pods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployments&lt;/td&gt;
&lt;td&gt;The next level, manages a set of ReplicaSets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Services&lt;/td&gt;
&lt;td&gt;The next level, manages a set of deployments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👉 Ingress&lt;/td&gt;
&lt;td&gt;The next level, manages a set of services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👉 Volumes&lt;/td&gt;
&lt;td&gt;The next level, manages a set of ingress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👉 Namespaces&lt;/td&gt;
&lt;td&gt;The next level, manages a set of volumes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👉 Cluster&lt;/td&gt;
&lt;td&gt;The highest level, manages a set of namespaces&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Ingress:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ingress is a set of rules that allow external traffic to reach the cluster services.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Creating ingress:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Example &lt;code&gt;ingress-definition.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;extensions/v1beta1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ingress&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app-ingress&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp.com&lt;/span&gt;
      &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;
            &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;serviceName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app-service&lt;/span&gt;
              &lt;span class="na"&gt;servicePort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;&lt;p&gt;The &lt;code&gt;host&lt;/code&gt; property is the domain name that the ingress will listen for requests on.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;The &lt;code&gt;path&lt;/code&gt; property is the path that the ingress will listen for requests on.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;The &lt;code&gt;serviceName&lt;/code&gt; property is the name of the service that the ingress will forward requests to.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;The &lt;code&gt;servicePort&lt;/code&gt; property is the port on the service that the ingress will forward requests to.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Once the .yml file is created, it can be used to create an ingress:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl create &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;file name&amp;gt;.yml
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;See list of ingresses:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get ingresses
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;See detailed info about an ingress:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl describe ingress &amp;lt;ingress name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;To access the ingress from outside the cluster, use the node IP address and the node port:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &amp;lt;node IP address&amp;gt;:&amp;lt;node port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;To access the ingress from inside the cluster, use the cluster IP address and the port:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &amp;lt;cluster IP address&amp;gt;:&amp;lt;port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Volumes:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Volumes are used to store data that is not ephemeral.&lt;/li&gt;
&lt;li&gt;Volumes are created in the cluster and are mounted to the pods.&lt;/li&gt;
&lt;li&gt;Types of volumes:

&lt;ul&gt;
&lt;li&gt;EmptyDir: a temporary volume that is created when a pod is created and is deleted when the pod is deleted.&lt;/li&gt;
&lt;li&gt;HostPath: a volume that is mounted from the host machine to the pod.&lt;/li&gt;
&lt;li&gt;PersistentVolume: a volume that is created in the cluster and is mounted to the pods.&lt;/li&gt;
&lt;li&gt;PersistentVolumeClaim: a claim for a persistent volume.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Creating a volume:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Example &lt;code&gt;volume-definition.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PersistentVolume&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app-volume&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;capacity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1Gi&lt;/span&gt;
  &lt;span class="na"&gt;accessModes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ReadWriteOnce&lt;/span&gt;
  &lt;span class="na"&gt;hostPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/data/my-app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;capacity&lt;/code&gt; property is the size of the volume.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;accessModes&lt;/code&gt; property is the access mode of the volume.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;hostPath&lt;/code&gt; property is the path on the host machine where the volume will be created.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once the .yml file is created, it can be used to create a volume:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl create &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;file name&amp;gt;.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;See list of volumes:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get pv
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;See detailed info about a volume:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl describe pv &amp;lt;volume name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Namespaces:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Namespaces are used to isolate resources in the cluster.&lt;/li&gt;
&lt;li&gt;Namespaces are created in the cluster and are used to group resources.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Creating a namespace:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Example &lt;code&gt;namespace-definition.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Namespace&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app-namespace&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once the .yml file is created, it can be used to create a namespace:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl create &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;file name&amp;gt;.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;See list of namespaces:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get namespaces
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;See detailed info about a namespace:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl describe namespace &amp;lt;namespace name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Clusters:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;We have already understood clusters at the very beginning of this blog series.&lt;/li&gt;
&lt;li&gt;A cluster is just a set of nodes (machines) that run containerized applications i.e. k8s pods.&lt;/li&gt;
&lt;li&gt;A cluster can be created using a cloud provider or using a single node.&lt;/li&gt;
&lt;li&gt;Try creating cluster and playing around with it on your local machine using &lt;strong&gt;&lt;a href="https://minikube.sigs.k8s.io/docs/start/" rel="noopener noreferrer"&gt;minikube&lt;/a&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;a href="https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/" rel="noopener noreferrer"&gt;kubeadm&lt;/a&gt;&lt;/strong&gt; or you can get started with the services offered by cloud providers like AWS (&lt;strong&gt;&lt;a href="https://aws.amazon.com/eks/" rel="noopener noreferrer"&gt;EKS&lt;/a&gt;&lt;/strong&gt;), GCP (&lt;strong&gt;&lt;a href="https://cloud.google.com/kubernetes-engine" rel="noopener noreferrer"&gt;GKE&lt;/a&gt;&lt;/strong&gt;) or Azure (&lt;strong&gt;&lt;a href="https://azure.microsoft.com/en-us/products/kubernetes-service" rel="noopener noreferrer"&gt;AKS&lt;/a&gt;&lt;/strong&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Well done and hearty congratulations Sailor!!!🥁📯&lt;br&gt;
You are hereby commissioned Ensign and are now ready to join the fleet!🎖️🎖️🎖️&lt;br&gt;
To be an explorer and a force for good! To venture out into the great sea!🌅 To fight monsters 🦑 and explore uncharted lands!🏞️&lt;/p&gt;

&lt;p&gt;Hope this series was fun!&lt;br&gt;
Feel free to check the references below to take your journey of building with Kubernetes further ahead and put your newly acquired skills to the test!&lt;br&gt;
Cheers and until next time!🍻&lt;/p&gt;

&lt;h2&gt;
  
  
  References:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/home/" rel="noopener noreferrer"&gt;Kubernetes documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/" rel="noopener noreferrer"&gt;Kubernetes concepts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/tutorials/" rel="noopener noreferrer"&gt;Kubernetes tutorials&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kodekloud.com/" rel="noopener noreferrer"&gt;Kubernetes video courses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/workloads/controllers/deployment/" rel="noopener noreferrer"&gt;Kubernetes examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/reference/kubectl/cheatsheet/" rel="noopener noreferrer"&gt;Kubernetes cheat sheet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>containers</category>
    </item>
    <item>
      <title>Bite-Sized Kubernetes Part 5 - Services</title>
      <dc:creator>Hrittik Bhattacharjee</dc:creator>
      <pubDate>Wed, 08 Mar 2023 19:57:37 +0000</pubDate>
      <link>https://forem.com/the777ist/bite-sized-kubernetes-part-5-services-5cn2</link>
      <guid>https://forem.com/the777ist/bite-sized-kubernetes-part-5-services-5cn2</guid>
      <description>&lt;h2&gt;
  
  
  Heave Ho!☸️
&lt;/h2&gt;

&lt;p&gt;In Part 4 we learnt about deployments in kubernetes.&lt;br&gt;
Moseying along now, to &lt;strong&gt;Services&lt;/strong&gt;!🏴‍☠️&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;OBJECT&lt;/th&gt;
&lt;th&gt;DESCRIPTION&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pods&lt;/td&gt;
&lt;td&gt;The lowest level, single instance of an application&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ReplicaSets&lt;/td&gt;
&lt;td&gt;The next level, manages a set of pods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployments&lt;/td&gt;
&lt;td&gt;The next level, manages a set of ReplicaSets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👉 Services&lt;/td&gt;
&lt;td&gt;The next level, manages a set of deployments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ingress&lt;/td&gt;
&lt;td&gt;The next level, manages a set of services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volumes&lt;/td&gt;
&lt;td&gt;The next level, manages a set of ingress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Namespaces&lt;/td&gt;
&lt;td&gt;The next level, manages a set of volumes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster&lt;/td&gt;
&lt;td&gt;The highest level, manages a set of namespaces&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Services:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;K8s services enable the pods to communicate with the outside world.&lt;/li&gt;
&lt;li&gt;K8s services also enable the pods to communicate with each other.&lt;/li&gt;
&lt;li&gt;Services types:

&lt;ul&gt;
&lt;li&gt;NodePort service: a service that listens for requests on a port on the k8s node and forwards them to the pods&lt;/li&gt;
&lt;li&gt;ClusterIP service: a service that creates a virtual IP address that is accessible only within the cluster, for communication between various services within the cluster.&lt;/li&gt;
&lt;li&gt;Load Balancer service: a service that creates a load balancer in the cloud provider that forwards requests to the pods accordingly to balance load.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  NodePort Service:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Target port&lt;/em&gt;: the port on the pod that the service forwards requests to.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Node port&lt;/em&gt;: the port on the k8s node that the service listens for requests on.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Port&lt;/em&gt;: the port on the service that it listens on.&lt;/li&gt;
&lt;li&gt;The service has its own IP address, called the cluster IP address of the service.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Creating a NodePort service:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Example &lt;code&gt;service-definition.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app-service&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-type&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NodePort&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targetPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
      &lt;span class="na"&gt;nodePort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30080&lt;/span&gt;
  &lt;span class="c1"&gt;# selector identifies the pods that the service will forward requests to&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-type&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;&lt;p&gt;The &lt;code&gt;type&lt;/code&gt; property can be set to &lt;code&gt;NodePort&lt;/code&gt; or &lt;code&gt;ClusterIP&lt;/code&gt; or &lt;code&gt;LoadBalancer&lt;/code&gt; depending on the type of service we're creating.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Once the .yml file is created, it can be used to create a service:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl create &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;file name&amp;gt;.yml
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;See list of services:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get services
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;See detailed info about a service:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl describe service &amp;lt;service name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;To access the service from outside the cluster, use the node IP address and the node port:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &amp;lt;node IP address&amp;gt;:&amp;lt;node port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;To access the service from inside the cluster, use the cluster IP address and the port:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &amp;lt;cluster IP address&amp;gt;:&amp;lt;port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;&lt;p&gt;If there are multiple nodes in the cluster with their own pods, the service created can be accessed from all the nodes in the cluster. &lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  ClusterIP Service:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A service that creates a virtual IP address that is accessible only within the cluster, for communication between various services within the cluster.&lt;/li&gt;
&lt;li&gt;It groups together a set of pods and exposes them as a single service e.g. a service for all pods running the frontend app, a service for all pods running the backend app, for the database pods, redis pods etc.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Creating a ClusterIP service:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Example &lt;code&gt;service-definition.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app-service&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-type&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ClusterIP&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# target port: the port on the pod that the service forwards requests to&lt;/span&gt;
      &lt;span class="c1"&gt;# port: the port on the service that it listens on&lt;/span&gt;
      &lt;span class="c1"&gt;# no need to specify nodePort since this is a ClusterIP service&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targetPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-type&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Commands are same as the ones above for NodePort service.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  LoadBalancer Service:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A service that creates a load balancer in the cloud provider that forwards requests to the pods accordingly to balance load.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Creating a LoadBalancer service:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Example &lt;code&gt;service-definition.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app-service&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-type&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;LoadBalancer&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targetPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-type&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Commands are same as the ones above for NodePort service.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;You're doing great, Sailor! Captin Ahab would be proud!👨🏼‍✈️&lt;br&gt;
Keep going! We'll look at "Ingress", "Volumes", "Namespaces" and revisit "Clusters" in the next and final part of this series!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ahead Flank!!!&lt;/strong&gt;🚀&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>containers</category>
    </item>
    <item>
      <title>Bite-Sized Kubernetes Part 4 - Deployments</title>
      <dc:creator>Hrittik Bhattacharjee</dc:creator>
      <pubDate>Wed, 08 Mar 2023 19:43:09 +0000</pubDate>
      <link>https://forem.com/the777ist/bite-sized-kubernetes-part-4-deployments-pdg</link>
      <guid>https://forem.com/the777ist/bite-sized-kubernetes-part-4-deployments-pdg</guid>
      <description>&lt;h2&gt;
  
  
  Blimey!☸️
&lt;/h2&gt;

&lt;p&gt;In Part 3 we looked at ReplicaSets in kubernetes.&lt;br&gt;
Moving right along to &lt;strong&gt;Deployments&lt;/strong&gt;!🌊&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;OBJECT&lt;/th&gt;
&lt;th&gt;DESCRIPTION&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pods&lt;/td&gt;
&lt;td&gt;The lowest level, single instance of an application&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ReplicaSets&lt;/td&gt;
&lt;td&gt;The next level, manages a set of pods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👉 Deployments&lt;/td&gt;
&lt;td&gt;The next level, manages a set of ReplicaSets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Services&lt;/td&gt;
&lt;td&gt;The next level, manages a set of deployments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ingress&lt;/td&gt;
&lt;td&gt;The next level, manages a set of services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volumes&lt;/td&gt;
&lt;td&gt;The next level, manages a set of ingress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Namespaces&lt;/td&gt;
&lt;td&gt;The next level, manages a set of volumes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster&lt;/td&gt;
&lt;td&gt;The highest level, manages a set of namespaces&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Deployments:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;K8s deployments are a higher-level abstraction that are built on top of ReplicaSets.&lt;/li&gt;
&lt;li&gt;K8s deployments help in rolling updates and rollbacks.&lt;/li&gt;
&lt;li&gt;K8s deployments are one level above ReplicaSets in the k8s hierarchy.&lt;/li&gt;
&lt;li&gt;Creating deployments:&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The .yml definition of a deployment is exactly similar to that of a ReplicaSet except for the &lt;code&gt;kind&lt;/code&gt; property.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Example &lt;code&gt;deployment-definition.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;

&lt;span class="c1"&gt;# all else is same as ReplicaSet&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Once the .yml file is created, it can be used to create a deployment:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl create &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;file name&amp;gt;.yml
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;See list of deployments:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get deployment
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;&lt;p&gt;The deployment will automatically create a ReplicaSet and the ReplicaSet will create the pods.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;See list of ReplicaSets:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get replicaset
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;See list of pods:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get pods  
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;See detailed info about a deployment:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl describe deployment &amp;lt;deployment name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Scale up or down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We can scale up the number of pods by updating the &lt;code&gt;replicas&lt;/code&gt; property in the .yml file and then run the &lt;code&gt;kubectl replace&lt;/code&gt; command:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl replace &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;file name&amp;gt;.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Or we can use the &lt;code&gt;kubectl scale&lt;/code&gt; command:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl scale deployment &amp;lt;deployment name&amp;gt; &lt;span class="nt"&gt;--replicas&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;number of replicas&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;To see all k8s objects created i.e. pods, ReplicaSets, deployments, etc.:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get all
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Rollouts (updates) and rollbacks in deployments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;To see rollout status:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl rollout status deployment &amp;lt;deployment name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To see rollout history:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl rollout &lt;span class="nb"&gt;history &lt;/span&gt;deployment &amp;lt;deployment name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deployment strategies:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Recreate&lt;/code&gt;: the default strategy&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;this will delete all the pods and then create new pods&lt;/li&gt;
&lt;li&gt;this is not recommended for production&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;RollingUpdate&lt;/code&gt;: the recommended strategy&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;this will update the pods one by one&lt;/li&gt;
&lt;li&gt;this is the recommended strategy and the default strategy for &lt;code&gt;kubectl apply&lt;/code&gt; command&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;To update a deployment:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl edit deployment &amp;lt;deployment name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;After updating the .yml file e.g. updating the app version (image tag), run the &lt;code&gt;kubectl apply&lt;/code&gt; command to trigger a new rollout:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;file name&amp;gt;.yml
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;&lt;p&gt;The k8s deployment will create a new ReplicaSet and the new ReplicaSet will create new pods following wither of the deployment strategies.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;To rollback a deployment:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl rollout undo deployment &amp;lt;deployment name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;You're unstoppable!&lt;br&gt;
Let's look at "Services" next. See ya in Part 5!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flank Speed!!!&lt;/strong&gt;🚢&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>containers</category>
    </item>
    <item>
      <title>Bite-Sized Kubernetes Part 3 - ReplicaSets</title>
      <dc:creator>Hrittik Bhattacharjee</dc:creator>
      <pubDate>Tue, 07 Mar 2023 21:41:04 +0000</pubDate>
      <link>https://forem.com/the777ist/bite-sized-kubernetes-part-3-replicasets-23mc</link>
      <guid>https://forem.com/the777ist/bite-sized-kubernetes-part-3-replicasets-23mc</guid>
      <description>&lt;h2&gt;
  
  
  Aye Aye!☸️
&lt;/h2&gt;

&lt;p&gt;In Part 2 we looked at pods in kubernetes.&lt;br&gt;
Let us now venture further with &lt;strong&gt;Controllers and ReplicaSets&lt;/strong&gt;!🌊&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;OBJECT&lt;/th&gt;
&lt;th&gt;DESCRIPTION&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pods&lt;/td&gt;
&lt;td&gt;The lowest level, single instance of an application&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👉 ReplicaSets&lt;/td&gt;
&lt;td&gt;The next level, manages a set of pods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployments&lt;/td&gt;
&lt;td&gt;The next level, manages a set of ReplicaSets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Services&lt;/td&gt;
&lt;td&gt;The next level, manages a set of deployments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ingress&lt;/td&gt;
&lt;td&gt;The next level, manages a set of services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volumes&lt;/td&gt;
&lt;td&gt;The next level, manages a set of ingress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Namespaces&lt;/td&gt;
&lt;td&gt;The next level, manages a set of volumes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster&lt;/td&gt;
&lt;td&gt;The highest level, manages a set of namespaces&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Controllers and ReplicaSets:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A controller is a k8s object that is responsible for managing a set of pods.&lt;/li&gt;
&lt;li&gt;Replication controller: 

&lt;ul&gt;
&lt;li&gt;A controller that is responsible for managing a set of pods.&lt;/li&gt;
&lt;li&gt;It ensures that the specified number of pods are running at any given time.&lt;/li&gt;
&lt;li&gt;It is responsible for creating new pods if the number of pods falls below the specified number.&lt;/li&gt;
&lt;li&gt;It is responsible for deleting pods if the number of pods exceeds the specified number.&lt;/li&gt;
&lt;li&gt;It is responsible for updating the pods if the pod template is changed.&lt;/li&gt;
&lt;li&gt;It helps to ensure that multiple pods are running at all times, thus guaranteeing "high availability" of the application.&lt;/li&gt;
&lt;li&gt;It is also responsible for load balancing and scaling the number of pods up and down.&lt;/li&gt;
&lt;li&gt;Replication controller can span across multiple nodes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replication controller is a legacy object, and is replaced by ReplicaSet&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Creating replication controllers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Example &lt;code&gt;rc-definition.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ReplicationController&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app-rc&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-type&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# the template is the pod template that will be used to create the pods&lt;/span&gt;
  &lt;span class="c1"&gt;# all the contents of the pod-definition.yml file can be copied here, except the apiVersion and kind&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-pod&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-type&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-container&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-image-name:my-image-tag&lt;/span&gt;
  &lt;span class="c1"&gt;# the number of replicas that should be running at any given time&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Once the .yml file is created, it can be used to create a replication controller:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl create &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;file name&amp;gt;.yml
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;See list of replication controllers:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get replicationcontroller
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;See list of pods (those created by the replication contrller will have the name of the replication controller, here &lt;code&gt;my-app-rc&lt;/code&gt;, followed by a hash suffix):&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get pods  
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Creating ReplicaSets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Example &lt;code&gt;rs-definition.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt; &lt;span class="c1"&gt;# not v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ReplicaSet&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app-rs&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-type&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# the template is the pod template that will be used to create the pods&lt;/span&gt;
  &lt;span class="c1"&gt;# all the contents of the pod-definition.yml file can be copied here, except the apiVersion and kind&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-pod&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-type&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-container&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-image-name:my-image-tag&lt;/span&gt;
  &lt;span class="c1"&gt;# the number of replicas that should be running at any given time&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
  &lt;span class="c1"&gt;# selector is needed for the ReplicaSet, not needed for replication controller&lt;/span&gt;
  &lt;span class="c1"&gt;# this identifies the pods that it is managing&lt;/span&gt;
  &lt;span class="c1"&gt;# this is because ReplicaSet can also manage pods that were created manually or already created pods &lt;/span&gt;
  &lt;span class="c1"&gt;# i.e. those that were not a part of the ReplicaSet pod creation process&lt;/span&gt;
  &lt;span class="c1"&gt;# this ReplicaSet will only manage the pods that have the labels app=my-app and type=my-type&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-type&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once the .yml file is created, it can be used to create a ReplicaSet:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl create &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;file name&amp;gt;.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;See list of ReplicaSets:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get replicaset
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;See list of pods (those created by the ReplicaSet will have the name of the ReplicaSet, here &lt;code&gt;my-app-rs&lt;/code&gt;, followed by a hash suffix):&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get pods  
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Edit a ReplicaSet:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl edit replicaset &amp;lt;replicaset name&amp;gt;

&lt;span class="c"&gt;# opens up vi editor&lt;/span&gt;
&lt;span class="c"&gt;# press i to enter insert mode, make necessary changes&lt;/span&gt;
&lt;span class="c"&gt;# press 'esc' to exit insert mode&lt;/span&gt;
&lt;span class="c"&gt;# type ':wq!' to save and exit&lt;/span&gt;

&lt;span class="c"&gt;# then delete all the pods managed by the ReplicaSet and then the ReplicaSet will create new pods with the updated pod template&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Scaling up or down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We can scale up the number of pods by updating the &lt;code&gt;replicas&lt;/code&gt; property in the .yml file and then run the &lt;code&gt;kubectl replace&lt;/code&gt; command:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl replace &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;file name&amp;gt;.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Or we can use the &lt;code&gt;kubectl scale&lt;/code&gt; command:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl scale &lt;span class="nt"&gt;--replicas&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;number of replicas&amp;gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;file name&amp;gt;.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Delete a ReplicaSet and all pods managed by it:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl delete replicaset &amp;lt;replicaset name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Great going sailor, Posiedon watches over ya!🔱&lt;br&gt;
Now that you understand ReplicaSets, let us move on to "Deployments" in Part 4.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Heave Ho!!!&lt;/strong&gt;🚣🏻&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>containers</category>
    </item>
    <item>
      <title>Bite-Sized Kubernetes Part 2 - Pods</title>
      <dc:creator>Hrittik Bhattacharjee</dc:creator>
      <pubDate>Mon, 06 Mar 2023 22:30:44 +0000</pubDate>
      <link>https://forem.com/the777ist/bite-sized-kubernetes-part-2-pods-5cf2</link>
      <guid>https://forem.com/the777ist/bite-sized-kubernetes-part-2-pods-5cf2</guid>
      <description>&lt;h2&gt;
  
  
  Arr!☸️
&lt;/h2&gt;

&lt;p&gt;In Part 1 we were introduced to the basics of kubernetes and took a brief look at the k8s "objects".&lt;br&gt;
Onward now with our expedition with &lt;strong&gt;Pods&lt;/strong&gt;, the smallest object in k8s.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;OBJECT&lt;/th&gt;
&lt;th&gt;DESCRIPTION&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👉 Pods&lt;/td&gt;
&lt;td&gt;The lowest level, single instance of an application&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ReplicaSets&lt;/td&gt;
&lt;td&gt;The next level, manages a set of pods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployments&lt;/td&gt;
&lt;td&gt;The next level, manages a set of ReplicaSets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Services&lt;/td&gt;
&lt;td&gt;The next level, manages a set of deployments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ingress&lt;/td&gt;
&lt;td&gt;The next level, manages a set of services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volumes&lt;/td&gt;
&lt;td&gt;The next level, manages a set of ingress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Namespaces&lt;/td&gt;
&lt;td&gt;The next level, manages a set of volumes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster&lt;/td&gt;
&lt;td&gt;The highest level, manages a set of namespaces&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Pods:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;K8s does not deploy the containers directly on the worker nodes.&lt;/li&gt;
&lt;li&gt;The containers are encapsulated into a kubernetes object, known as 'pod'.&lt;/li&gt;
&lt;li&gt;A pod is a single instance of an application.&lt;/li&gt;
&lt;li&gt;Usually a pod contains a single container, but it can contain multiple containers, and these containers are not the same containers.&lt;/li&gt;
&lt;li&gt;For example, a pod can contain a container running the application, and another container running a sidecar process or helper application.&lt;/li&gt;
&lt;li&gt;Containers inside the pod share the same network namespace, and can communicate with each other using localhost, and can share the same storage space.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Commands:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="c"&gt;# deploy a container by creating a pod&lt;/span&gt;
  &lt;span class="nv"&gt;$ &lt;/span&gt;kubectl run &amp;lt;pod name&amp;gt; &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;image name&amp;gt;

  &lt;span class="c"&gt;# list all pods&lt;/span&gt;
  &lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get pods

  &lt;span class="c"&gt;# list detailed info about all pods&lt;/span&gt;
  &lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get pods &lt;span class="nt"&gt;-o&lt;/span&gt; wide

  &lt;span class="c"&gt;# describe a pod&lt;/span&gt;
  &lt;span class="nv"&gt;$ &lt;/span&gt;kubectl describe pod &amp;lt;pod name&amp;gt;  

  &lt;span class="c"&gt;# delete a pod&lt;/span&gt;
  &lt;span class="nv"&gt;$ &lt;/span&gt;kubectl delete pod &amp;lt;pod name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Creating pods:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The .yml file must contain 4 top-level fields/properties i.e. &lt;code&gt;apiVersion&lt;/code&gt;, &lt;code&gt;kind&lt;/code&gt;, &lt;code&gt;metadata&lt;/code&gt; and &lt;code&gt;spec&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;apiVersion&lt;/code&gt;: the version of the k8s API that is being used e.g. &lt;code&gt;v1&lt;/code&gt;, &lt;code&gt;apps/v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kind&lt;/code&gt;: the type of object that is being created e.g. &lt;code&gt;Pod&lt;/code&gt;, &lt;code&gt;Service&lt;/code&gt;, &lt;code&gt;Deployment&lt;/code&gt;, &lt;code&gt;ReplicaSet&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;metadata&lt;/code&gt;: data that helps to uniquely identify the object e.g. &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;labels&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;name&lt;/code&gt; can only have a string value&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;labels&lt;/code&gt; can have any kind of key-value pairs&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;spec&lt;/code&gt;: the specification of the object

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;containers&lt;/code&gt;: the list of containers that will be launched in the pod&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;name&lt;/code&gt;: the name of the container&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;image&lt;/code&gt;: the image that will be used to launch the container&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Example &lt;code&gt;pod-definition.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-pod&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-type&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-container&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-image-name:my-image-tag&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Once the .yml file is created, it can be used to create a pod using the &lt;code&gt;kubectl create&lt;/code&gt; command:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl create &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;file name&amp;gt;.yml
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;View detailed info about the pod:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl describe pod &amp;lt;pod name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Delete the pod:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl delete pod &amp;lt;pod name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Update the pod  with an updated .yml file e.g. with a new image, etc.:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;file name&amp;gt;.yml
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Great job sailor!&lt;br&gt;
You now know what pods are, hopefully you found this post an interesting and useful read.&lt;br&gt;
Onwards now to "Controllers and ReplicaSets" in Part 3 which will be out soon! &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Haul Wind!!!&lt;/strong&gt;⛵&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>containers</category>
    </item>
    <item>
      <title>Bite-Sized Kubernetes Part 1 - Introduction &amp; Overview</title>
      <dc:creator>Hrittik Bhattacharjee</dc:creator>
      <pubDate>Mon, 06 Mar 2023 22:14:34 +0000</pubDate>
      <link>https://forem.com/the777ist/bite-sized-kubernetes-part-1-introduction-overview-k38</link>
      <guid>https://forem.com/the777ist/bite-sized-kubernetes-part-1-introduction-overview-k38</guid>
      <description>&lt;h2&gt;
  
  
  Ahoy Sailor!☸️
&lt;/h2&gt;

&lt;p&gt;Learning Kubernetes can be daunting!&lt;br&gt;
"Cluster"... "Deployments"... "Services"... what?!&lt;/p&gt;

&lt;p&gt;As a newcomer to these concepts one is faced with either of two choices:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Watch a 20-hour long Udemy course&lt;/li&gt;
&lt;li&gt;Dive into the &lt;a href="https://kubernetes.io/docs/home/" rel="noopener noreferrer"&gt;docs&lt;/a&gt; which is probably longer than the King James Bible. And with a million links leading to an altogether new concept.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So you end up with a couple of half-finished courses, thousands of tabs of the docs pages open, some youtube videos, but mostly a great deal of confusion and regret!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft4nylwukq7t5lalmrh8t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft4nylwukq7t5lalmrh8t.png" alt="Meme1" width="551" height="499"&gt;&lt;/a&gt;&lt;em&gt;Source: &lt;a href="https://9gag.com/gag/amPPxpX" rel="noopener noreferrer"&gt;https://9gag.com/gag/amPPxpX&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sooooo we decided to write a series of blog posts to help a young cadet like yourself, get abreast quickly with the important concepts in kubernetes, in bite-sized posts with only need-to-know "points" to grasp the essentials. Our goal here is to choose the path of least resistance to set sail!&lt;/p&gt;

&lt;p&gt;Feel free, of course, to move on after you're done here, to the official documentation and/or a detailed course, or get your hands dirty and deploy your own apps, or maybe even get certified. But assuredly, whatever you choose, you'll be able to go in with a certain level of confidence!&lt;/p&gt;
&lt;h2&gt;
  
  
  Kubernetes Overview
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A kubernetes or k8s "cluster" consists of a set of k8s "nodes" i.e. machines.

&lt;ul&gt;
&lt;li&gt;K8s cluster: set of k8s nodes grouped together.&lt;/li&gt;
&lt;li&gt;K8s node: the physical/virtual machine on which k8s software and tools are installed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;There are 2 types of nodes in a k8s cluster:

&lt;ul&gt;
&lt;li&gt;K8s worker node: machine where the containers will be launched by k8s.&lt;/li&gt;
&lt;li&gt;K8s master node: responsible for managing the worker nodes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The master node is the node with the k8s "control plane" components installed, we'll understand this in more detail.&lt;/li&gt;
&lt;li&gt;The master node is responsible for the orchestration of containers on the worker nodes.&lt;/li&gt;
&lt;li&gt;Kubernetes comprises of the following main components:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;API server&lt;/code&gt; 

&lt;ul&gt;
&lt;li&gt;The API server is the front-end for the Kubernetes control plane.&lt;/li&gt;
&lt;li&gt;It exposes the Kubernetes API and allows us to interact with the k8s cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;etcd service&lt;/code&gt; 

&lt;ul&gt;
&lt;li&gt;etcd is a distributed key-value store that stores all the data used to manage the cluster.&lt;/li&gt;
&lt;li&gt;It is used to store the configuration data, metadata and the current state of all the k8s objects in the cluster.&lt;/li&gt;
&lt;li&gt;it is responsible for implementing logs within the cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kubelet&lt;/code&gt; 

&lt;ul&gt;
&lt;li&gt;The kubelet is an "agent" that runs on each node in the cluster.&lt;/li&gt;
&lt;li&gt;It makes sure that containers are running in a pod.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;container runtime&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;The container runtime is the underlying software that is responsible for running containers e.g. docker. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;controller&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;It is responsible for making sure that the specified number of pods are running at any given time and bring up new containers.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scheduler&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;It is responsible for making sure that the containers are running on the right node.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The master node has the &lt;code&gt;kube-apiserver&lt;/code&gt; installed, worker nodes have the &lt;code&gt;kubelet&lt;/code&gt; agent installed.&lt;/li&gt;
&lt;li&gt;All info about worker nodes is stored in a key-value store on the master i.e. &lt;code&gt;etcd&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;controller&lt;/code&gt; and &lt;code&gt;scheduler&lt;/code&gt; exist also, on the master.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;container runtime&lt;/code&gt; like docker runs on the worker nodes.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some basic commands:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# run 1000 instances of my-app&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl run &lt;span class="nt"&gt;--replicas&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1000 my-app

&lt;span class="c"&gt;# scale it up to 5000 instances&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl scale &lt;span class="nt"&gt;--replicas&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5000 my-app

&lt;span class="c"&gt;# update these 5000 instances in a rolling upgrade&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl rolling-update my-app &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;image name&amp;gt;:&amp;lt;image tag&amp;gt;

&lt;span class="c"&gt;# rollback updates&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl rolling-update my-app &lt;span class="nt"&gt;--rollback&lt;/span&gt;

&lt;span class="c"&gt;# deploy an app on a cluster&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl run &amp;lt;image name&amp;gt;

&lt;span class="c"&gt;# see info about the cluster&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl cluster-info

&lt;span class="c"&gt;# list all nodes in the cluster&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;&lt;p&gt;We will now, over the next few posts, explore the "objects" in kubernetes, e.g. pods, deployments, services, etc.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;These are the entities in the k8s architecture that we will be working with to deploy an application on k8s.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Following are the k8s objects that we'll be looking at:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;OBJECT&lt;/th&gt;
&lt;th&gt;DESCRIPTION&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pods&lt;/td&gt;
&lt;td&gt;The lowest level, single instance of an application&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ReplicaSets&lt;/td&gt;
&lt;td&gt;The next level, manages a set of pods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployments&lt;/td&gt;
&lt;td&gt;The next level, manages a set of ReplicaSets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Services&lt;/td&gt;
&lt;td&gt;The next level, manages a set of deployments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ingress&lt;/td&gt;
&lt;td&gt;The next level, manages a set of services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volumes&lt;/td&gt;
&lt;td&gt;The next level, manages a set of ingress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Namespaces&lt;/td&gt;
&lt;td&gt;The next level, manages a set of volumes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster&lt;/td&gt;
&lt;td&gt;The highest level, manages a set of namespaces&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;In Part 2 we shall start by taking a look at "pods" in kubernetes.&lt;br&gt;
Thank you for reading, hope you're excited!  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anchors Aweigh!!!&lt;/strong&gt;⚓&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>containers</category>
    </item>
    <item>
      <title>React Hooks by Example - Part 2</title>
      <dc:creator>Hrittik Bhattacharjee</dc:creator>
      <pubDate>Sat, 11 Feb 2023 14:15:52 +0000</pubDate>
      <link>https://forem.com/the777ist/react-hooks-by-example-part-2-40a3</link>
      <guid>https://forem.com/the777ist/react-hooks-by-example-part-2-40a3</guid>
      <description>&lt;h2&gt;
  
  
  Learn (more) Hooks = Make (more) Money!🤑
&lt;/h2&gt;

&lt;p&gt;We're back to make more Dinero!💵💵💵&lt;br&gt;
Let's explore some of the less commonly used, but nonetheless super-important hooks in react!&lt;/p&gt;

&lt;p&gt;The code for all the examples can be found at this &lt;a href="https://codesandbox.io/s/u2tbtz" rel="noopener noreferrer"&gt;Code Sandbox&lt;/a&gt;.&lt;br&gt;
This is Part 2 of a three-part series, and it covers &lt;strong&gt;useReducer&lt;/strong&gt;, &lt;strong&gt;useRef&lt;/strong&gt;, &lt;strong&gt;useMemo&lt;/strong&gt;, &lt;strong&gt;useCallback&lt;/strong&gt;, &lt;strong&gt;useImperativeHandle&lt;/strong&gt; and &lt;strong&gt;useLayoutEffect&lt;/strong&gt;!&lt;/p&gt;


&lt;h2&gt;
  
  
  useReducer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;useReducer&lt;/code&gt; can be used as an alternative to &lt;code&gt;useState&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useReducer&lt;/code&gt; is usually preferable to &lt;code&gt;useState&lt;/code&gt; when you have complex state logic that involves multiple sub-values or when the next state depends on the previous one."&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// /src/UseReducerExample.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useReducer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bankBalance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;make 1 $&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;spend 1 $&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&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;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UseReducerExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useReducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;bankBalance&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nx"&gt;Dinero&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You have&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You lost&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;)}{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="err"&gt;💵&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;spend 1 $&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Spend&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;make 1 $&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Make&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;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;/li&gt;

&lt;li&gt;

&lt;p&gt;In the above example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;useReducer&lt;/code&gt; hook accepts a &lt;code&gt;reducer&lt;/code&gt; function and an data which you want to save to state, &lt;em&gt;here, { counter: 0 }&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;useReducer&lt;/code&gt; hook returns a &lt;code&gt;state&lt;/code&gt; object containing this data, and a &lt;code&gt;dispatch&lt;/code&gt; function.&lt;/li&gt;
&lt;li&gt;When &lt;code&gt;dispatch&lt;/code&gt; is called with an &lt;code&gt;action&lt;/code&gt; &lt;em&gt;here, { type: "spend 1 $" }&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;It passes the &lt;code&gt;state&lt;/code&gt; and this &lt;code&gt;action&lt;/code&gt; to the &lt;code&gt;reducer&lt;/code&gt; function.&lt;/li&gt;
&lt;li&gt;Depending on the &lt;code&gt;action&lt;/code&gt; type, it will return some value and this value will be saved to the &lt;code&gt;state&lt;/code&gt; &lt;em&gt;here, state.counter&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;The updated value of the state can then be accessed inside the component.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;See it in action &lt;a href="https://u2tbtz.csb.app/use-reducer" rel="noopener noreferrer"&gt;here&lt;/a&gt; and the code at this &lt;a href="https://codesandbox.io/s/react-hooks-examples-u2tbtz?file=/src/UseReducerExample.js" rel="noopener noreferrer"&gt;sandbox&lt;/a&gt;! &lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  useRef
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;useRef&lt;/code&gt; hook can be used to reference a given value, and it will be stored in its &lt;code&gt;.current&lt;/code&gt; property between component re-renders, and can be changed.&lt;/li&gt;
&lt;li&gt;A common use-case is to access DOM elements directly.&lt;/li&gt;
&lt;li&gt;It is important to note that mutating &lt;code&gt;.current&lt;/code&gt; will not cause a re-render.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// /src/UseRefExample.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UseRefExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;refAmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;updateAmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;refAmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`You actually have &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 💵`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nx"&gt;Dinero&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;refAmt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;You&lt;/span&gt; &lt;span class="nx"&gt;have&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="err"&gt;💵&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;updateAmt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;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;/li&gt;
&lt;li&gt;
&lt;p&gt;In the above example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We create a ref, &lt;code&gt;refAmt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;in the &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; element we specify &lt;code&gt;ref={refAmt}&lt;/code&gt;, so now &lt;code&gt;refAmt.current&lt;/code&gt; points to the &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; element.&lt;/li&gt;
&lt;li&gt;On clicking the button, we can open the console and see that,&lt;/li&gt;
&lt;li&gt;The value of &lt;code&gt;counter&lt;/code&gt; is increasing.&lt;/li&gt;
&lt;li&gt;But &lt;code&gt;refAmt.current&lt;/code&gt; (which points to the &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; element) is not being updated with the new value of &lt;code&gt;counter&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;See it in action &lt;a href="https://u2tbtz.csb.app/use-ref" rel="noopener noreferrer"&gt;here&lt;/a&gt; and the code at this &lt;a href="https://codesandbox.io/s/react-hooks-examples-u2tbtz?file=/src/UseRefExample.js" rel="noopener noreferrer"&gt;sandbox&lt;/a&gt;!&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  useMemo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;code&gt;useMemo&lt;/code&gt; hook takes a function (that ideally returns something) and an array of dependencies.&lt;/li&gt;
&lt;li&gt;It will only re-compute the return value if one or more of the dependencies has changed.&lt;/li&gt;
&lt;li&gt;This helps to optimizae expensive computations on each render, that may not necessarily need to be re-computed.&lt;/li&gt;
&lt;li&gt;If no array is provided, a new value will be computed on every render.&lt;/li&gt;
&lt;li&gt;Every value referenced inside the function should also appear in the dependencies array.&lt;/li&gt;
&lt;li&gt;Side effects should be in &lt;code&gt;useEffect&lt;/code&gt;, not &lt;code&gt;useMemo&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// /src/UseMemoExample.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useMemo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculationRes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;constant&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`The calculated result is: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UseMemoExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCounter&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;calculation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useMemo&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;calculationRes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nx"&gt;Dinero&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;You&lt;/span&gt; &lt;span class="nx"&gt;have&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="err"&gt;💵&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCounter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;calculation&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;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;/li&gt;
&lt;li&gt;
&lt;p&gt;In the above example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The function &lt;code&gt;calculationRes&lt;/code&gt; runs once, the result is memoized and &lt;code&gt;result&lt;/code&gt; is logged in console.&lt;/li&gt;
&lt;li&gt;On clicking on the button, the state &lt;code&gt;counter&lt;/code&gt; changes and hence the component re-renders.&lt;/li&gt;
&lt;li&gt;But on subsequent renders, &lt;code&gt;result&lt;/code&gt; is not logged to console.&lt;/li&gt;
&lt;li&gt;This is because the value of &lt;code&gt;result&lt;/code&gt; has not changed since the value of the variable &lt;code&gt;constant&lt;/code&gt; has not changed, which was in the dependency array for &lt;code&gt;calculationRes&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;See it in action &lt;a href="https://u2tbtz.csb.app/use-memo" rel="noopener noreferrer"&gt;here&lt;/a&gt; and the code at this &lt;a href="https://codesandbox.io/s/react-hooks-examples-u2tbtz?file=/src/UseMemoExample.js" rel="noopener noreferrer"&gt;sandbox&lt;/a&gt;!&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  useCallback
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;useCallback&lt;/code&gt; hook is very similar to the &lt;code&gt;useMemo&lt;/code&gt; hook, the only difference being that &lt;code&gt;useMemo&lt;/code&gt; returns a memoized value, and &lt;code&gt;useCallback&lt;/code&gt; returns a memoized function.&lt;/li&gt;
&lt;li&gt;A common use-case is when the function needs to be passed down nested child components.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The example above can be referred to, as an example of &lt;code&gt;useCallback&lt;/code&gt; by just replacing:&lt;br&gt;&lt;br&gt;
&lt;code&gt;const calculation = useMemo(() =&amp;gt; calculationRes(constant), [constant]);&lt;/code&gt; &lt;br&gt;
with&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;calculation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;calculationRes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;See it in action &lt;a href="https://u2tbtz.csb.app/use-callback" rel="noopener noreferrer"&gt;here&lt;/a&gt; and the code at this &lt;a href="https://codesandbox.io/s/react-hooks-examples-u2tbtz?file=/src/UseCallbackExample.js" rel="noopener noreferrer"&gt;sandbox&lt;/a&gt;!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;em&gt;forwardRef&lt;/em&gt; and useImperativeHandle
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;As we have seen above, the &lt;code&gt;useRef&lt;/code&gt; hook can be used to access DOM elements.&lt;/li&gt;
&lt;li&gt;We can wrap the component exposing this &lt;code&gt;ref&lt;/code&gt;, inside &lt;code&gt;forwardRef&lt;/code&gt; and then the parent component would have access to this ref.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example of forwarding refs:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;forwardRef&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ChildComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;💵💵💵💵💵💵💵💵💵💵&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;ChildComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;forwardRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ChildComponent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UseImperativeHandleExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;moneyRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ChildComponent&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;moneyRef&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;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;/li&gt;
&lt;li&gt;
&lt;p&gt;In the above example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The parent component &lt;code&gt;UseImperativeHandleExample&lt;/code&gt; uses the &lt;code&gt;useRef&lt;/code&gt; hook to create a ref object.&lt;/li&gt;
&lt;li&gt;This ref is pointed to &lt;code&gt;ChildComponent&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ChildComponent&lt;/code&gt; is wrapped inside &lt;code&gt;forwardRef&lt;/code&gt; and hence we can assign this ref object to a DOM element inside it, here, the &lt;code&gt;&amp;lt;h1&amp;gt; element&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Now, the parent component &lt;code&gt;UseImperativeHandleExample&lt;/code&gt; will have access to the ref to the &lt;code&gt;&amp;lt;h1&amp;gt; element&lt;/code&gt; inside &lt;code&gt;ChildComponent&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Now, if we need to modify the behavious of this ref, based on say, some user action, this is where the &lt;code&gt;useImperativeHandle&lt;/code&gt; hook comes in handy!&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;The above example can be modified like so:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// /src/UseImperativeHandleExample.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;forwardRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useImperativeHandle&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ChildComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;h1Ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useImperativeHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;seeReferencedEl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;h1Ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;
  &lt;span class="p"&gt;}));&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nx"&gt;Dinero&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;h1Ref&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;💵💵💵💵💵💵💵💵💵💵&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;ChildComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;forwardRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ChildComponent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UseImperativeHandleExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;moneyRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;seeReferencedElement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;moneyRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;seeReferencedEl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ChildComponent&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;moneyRef&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;seeReferencedElement&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;See&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;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;/li&gt;

&lt;li&gt;

&lt;p&gt;In the above example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inside the &lt;code&gt;UseImperativeHandleExample&lt;/code&gt; component, &lt;code&gt;moneyRef.current&lt;/code&gt; points to &lt;code&gt;ChildComponent&lt;/code&gt; as we saw in the &lt;em&gt;forwardRef&lt;/em&gt; example previously.&lt;/li&gt;
&lt;li&gt;But in this example, we assign a new ref object &lt;code&gt;h1Ref&lt;/code&gt; to the &lt;code&gt;&amp;lt;h1&amp;gt; element&lt;/code&gt; inside &lt;code&gt;ChildComponent&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Using the &lt;code&gt;useImperativeHandle&lt;/code&gt; hook, we assign this new &lt;code&gt;h1Ref&lt;/code&gt; to the &lt;code&gt;seeReferencedEl&lt;/code&gt; property of &lt;code&gt;ChildComponent&lt;/code&gt;'s ref.&lt;/li&gt;
&lt;li&gt;So now, inside the &lt;code&gt;UseImperativeHandleExample&lt;/code&gt; component, &lt;code&gt;moneyRef.current.seeReferencedEl&lt;/code&gt; points to the &lt;code&gt;&amp;lt;h1&amp;gt; element&lt;/code&gt; inside &lt;code&gt;ChildComponent&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;See it in action &lt;a href="https://u2tbtz.csb.app/use-imperative-handle" rel="noopener noreferrer"&gt;here&lt;/a&gt; and the code at this &lt;a href="https://codesandbox.io/s/react-hooks-examples-u2tbtz?file=/src/UseImperativeHandleExample.js" rel="noopener noreferrer"&gt;sandbox&lt;/a&gt;!&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  useLayoutEffect
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;useLayoutEffect&lt;/code&gt; is similar to &lt;code&gt;useEffect&lt;/code&gt;, except one key difference.&lt;/li&gt;
&lt;li&gt; It runs (synchronously) after the elements have been loaded into the DOM but before they are painted to the UI.&lt;/li&gt;
&lt;li&gt;"Use this [hook] to read layout from the DOM and synchronously re-render".&lt;/li&gt;
&lt;li&gt;A common use-case is to measure layout and change the position of elements based on it.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// /src/UseLayoutEffectExample.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useLayoutEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UseLayoutEffectExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;refAmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;useEffect called!&lt;/span&gt;&lt;span class="dl"&gt;"&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;span class="nf"&gt;useLayoutEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;useLayoutEffect called&lt;/span&gt;&lt;span class="dl"&gt;"&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;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;linkStyle&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nx"&gt;Dinero&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;refAmt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;You&lt;/span&gt; &lt;span class="nx"&gt;have&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt; &lt;span class="err"&gt;💵&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;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;/li&gt;
&lt;li&gt;
&lt;p&gt;In the above example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We see that &lt;code&gt;"useLayoutEffect called"&lt;/code&gt; is logged first, since the &lt;code&gt;useLayoutEffect&lt;/code&gt; runs synchronously &lt;/li&gt;
&lt;li&gt;Then the DOM is visually updated.&lt;/li&gt;
&lt;li&gt;Then &lt;code&gt;"useEffect called!"&lt;/code&gt; is logged, since &lt;code&gt;useEffect&lt;/code&gt; runs asynchronously.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;See it in action &lt;a href="https://u2tbtz.csb.app/use-layout-effect" rel="noopener noreferrer"&gt;here&lt;/a&gt; and the code at this &lt;a href="https://codesandbox.io/s/react-hooks-examples-u2tbtz?file=/src/UseLayoutEffectExample.js" rel="noopener noreferrer"&gt;sandbox&lt;/a&gt;!  &lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Hope you had great fun learning hooks, and heading to the Buggati store soon for some Sunday shopping!&lt;br&gt;
Stay tuned for Part 3 where we look at more hooks🤘&lt;br&gt;
Cheers!&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>BONUS! Redis Commands Cheat Sheet Part 4 - Transactions, Bit Data, Pub/Sub and Geospatial Data</title>
      <dc:creator>Hrittik Bhattacharjee</dc:creator>
      <pubDate>Sun, 05 Feb 2023 20:24:09 +0000</pubDate>
      <link>https://forem.com/the777ist/bonus-redis-commands-cheat-sheet-part-4-transactions-bit-data-pubsub-and-geospatial-data-3hc1</link>
      <guid>https://forem.com/the777ist/bonus-redis-commands-cheat-sheet-part-4-transactions-bit-data-pubsub-and-geospatial-data-3hc1</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%2F2ch1nj3g33iea3w75ol8.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%2F2ch1nj3g33iea3w75ol8.png" alt="Redis Icon" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Following are some of the commonly used Redis commands and data structures, use this list as a quick cheat sheet or a ready reference for your day-to-day Redis usage as needed 😄&lt;/p&gt;

&lt;p&gt;This is a BONUS Part 4 of this series, containing commands pertaining to &lt;strong&gt;Transactions, Bit Data, Pub/Sub and Geospatial Data&lt;/strong&gt; in Redis!&lt;/p&gt;




&lt;h3&gt;
  
  
  Transactions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# each transaction is atomic - either it completes, nor not&lt;/span&gt;
&lt;span class="c"&gt;# command execution is single threaded in redis&lt;/span&gt;
&lt;span class="c"&gt;# new command will execute after previous command is completed and will wait till it is either finished or failed&lt;/span&gt;
&lt;span class="c"&gt;# but there are exceptions - e.g. async non-blocking commands like `UNLINK`&lt;/span&gt;
&lt;span class="c"&gt;# transaction: a set of commands that are guaranteed to be atomic&lt;/span&gt;
  &lt;span class="c"&gt;# all commands in a transaction are serialized and executed sequentially&lt;/span&gt;
  &lt;span class="c"&gt;# this guarantees that all the commands are executed in a single, isolated operation&lt;/span&gt;
  &lt;span class="c"&gt;# another connectoin cannot make a change during the execution of a transaction&lt;/span&gt;
  &lt;span class="c"&gt;# in transaction, all commands are executed or none are&lt;/span&gt;

&lt;span class="c"&gt;# commands:&lt;/span&gt;

&lt;span class="c"&gt;# mark the start of a transaction block&lt;/span&gt;
&lt;span class="c"&gt;# Subsequent commands will be queued for atomic execution using EXEC&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; MULTI

&lt;span class="c"&gt;# executes all previously queued commands (issued after MULTI) in a transaction and restores the connection state to normal&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; EXEC

&lt;span class="c"&gt;# flushes all previously queued commands (issued after MULTI) in a transaction and restores the connection state to normal&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; DISCARD

&lt;span class="c"&gt;# example:&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; MULTI
OK
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ...command 1
QUEUED
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ...command 2
QUEUED
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ...command 3
QUEUED
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; EXEC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# optimistic concurrency control or optimistic blocking:&lt;/span&gt;
  &lt;span class="c"&gt;# observe changes in one/more keys&lt;/span&gt;
  &lt;span class="c"&gt;# abort transaction if observed key(s) have changed&lt;/span&gt;

&lt;span class="c"&gt;# declare interest in one/more keys&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; WATCH key &lt;span class="o"&gt;[&lt;/span&gt;key ...]

&lt;span class="c"&gt;# when EXEC is called, the transaction will fail if any 'watched' keys have been modified&lt;/span&gt;

&lt;span class="c"&gt;# WATCH has to be called before the transaction is started, i.e. before MULTI&lt;/span&gt;
&lt;span class="c"&gt;# multiple WATCH commands can be called subsequently, the effects are cumulative&lt;/span&gt;
&lt;span class="c"&gt;# watches are local to the current client connection&lt;/span&gt;
&lt;span class="c"&gt;# all keys are automatically 'unwatched' after EXEC (EXEC will return (nil)) &lt;/span&gt;

&lt;span class="c"&gt;# forget about all 'watched' keys&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; UNWATCH 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Bit Data
&lt;/h3&gt;

&lt;p&gt;Bit Fields:&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="c"&gt;# bit fields can be used to get, set or increment a value in a bit field&lt;/span&gt;
&lt;span class="c"&gt;# bitfield commands allows manipulation of one/more variable length integers within a string datatype&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; BITFIELD key
    &lt;span class="o"&gt;[&lt;/span&gt;GET &lt;span class="nb"&gt;type &lt;/span&gt;offset]
    &lt;span class="o"&gt;[&lt;/span&gt;SET &lt;span class="nb"&gt;type &lt;/span&gt;offset value]
    &lt;span class="o"&gt;[&lt;/span&gt;INCRBY &lt;span class="nb"&gt;type &lt;/span&gt;offset increment]
    &lt;span class="o"&gt;[&lt;/span&gt;OVERFLOW WRAP | SAT | FAIL]

&lt;span class="c"&gt;# 'type' can be - i (signed) or u (unsigned), followed by the size&lt;/span&gt;
&lt;span class="c"&gt;# e.g. u8, i16, etc.&lt;/span&gt;
&lt;span class="c"&gt;# can have a max size of i63 and u64&lt;/span&gt;

&lt;span class="c"&gt;# set an unsigned 8-bit value, at bit offset 0, to 42&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; BITFIELD mykey SET u8 0 42

&lt;span class="c"&gt;# get the unsigned 8-bit value, at bit offset 0&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; BITFIELD mykey GET u8 0
1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;integer&lt;span class="o"&gt;)&lt;/span&gt; 42

&lt;span class="c"&gt;# BITFIELD can also be used to increment values&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; BITFIELD myfield incrby u8 0 1
2&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;integer&lt;span class="o"&gt;)&lt;/span&gt; 43

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; TYPE mykey
string
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; OBJECT ENCODING mykey
&lt;span class="s2"&gt;"raw"&lt;/span&gt; &lt;span class="c"&gt;# not "embstr"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bit Arrays:&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="c"&gt;# bit arrays allow manipulation of individual bits within a string datatype&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; GETBIT key offset

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SETBIT key offset value

&lt;span class="c"&gt;# no need to specify 'type' for bit array commands&lt;/span&gt;
&lt;span class="c"&gt;# bitfields are preferred over bit arrays, since commands have greated flexibility&lt;/span&gt;

&lt;span class="c"&gt;# count the no. of "set" bits within a range&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; BITCOUNT key &lt;span class="o"&gt;[&lt;/span&gt;start end]

&lt;span class="c"&gt;# BITCOUNT uses a "byte offset" not "bit offset" unlike all the other commands&lt;/span&gt;

&lt;span class="c"&gt;# perform AND/OR/XOR/NOT and store the result at a new 'destination' key&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; BITOP operation destination key &lt;span class="o"&gt;[&lt;/span&gt;key...]

&lt;span class="c"&gt;# find the index of the first set/unset bit within a given offset range&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; BITPOS key bit &lt;span class="o"&gt;[&lt;/span&gt;start end]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Pub/Sub
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# simple pub/sub&lt;/span&gt;
  &lt;span class="c"&gt;# post a message to the given channel&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; PUBLISH channel message

  &lt;span class="c"&gt;# when a message is published with the PUBLISH command, redis guaranteeS the order of messages in a single node&lt;/span&gt;

  &lt;span class="c"&gt;# listen for messgaes on a channel(s)&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SUBSCRIBE channel &lt;span class="o"&gt;[&lt;/span&gt;channel ...]

  &lt;span class="c"&gt;# stop listening for messgaes on a channel(s)&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; UNSUBSCRIBE &lt;span class="o"&gt;[&lt;/span&gt;channel &lt;span class="o"&gt;[&lt;/span&gt;channel ...]]

&lt;span class="c"&gt;# patterned pub/sub&lt;/span&gt;
  &lt;span class="c"&gt;# subscribes the client to the given patterns&lt;/span&gt;
  &lt;span class="c"&gt;# Supported glob-style patterns:&lt;/span&gt;
    &lt;span class="c"&gt;# h?llo subscribes to hello, hallo and hxllo&lt;/span&gt;
    &lt;span class="c"&gt;# h*llo subscribes to hllo and heeeello&lt;/span&gt;
    &lt;span class="c"&gt;# h[ae]llo subscribes to hello and hallo, but not hillo&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; PSUBSCRIBE pattern &lt;span class="o"&gt;[&lt;/span&gt;pattern ...]

  &lt;span class="c"&gt;# un-subscribes the client from the given patterns&lt;/span&gt;
  &lt;span class="c"&gt;# when no patterns are specified, the client is unsubscribed from all the previously subscribed patterns&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; PUNSUBSCRIBE &lt;span class="o"&gt;[&lt;/span&gt;pattern &lt;span class="o"&gt;[&lt;/span&gt;pattern ...]]

&lt;span class="c"&gt;# introspection/admin of the pub-sub mechanism can be done using the PUBSUB command&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; PUBSUB subcommand &lt;span class="o"&gt;[&lt;/span&gt;argument &lt;span class="o"&gt;[&lt;/span&gt;argument ...]]
  &lt;span class="c"&gt;# list currently active channels&lt;/span&gt;
  &lt;span class="c"&gt;# if no pattern is specified, all the channels are listed&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; PUBSUB CHANNELS &lt;span class="o"&gt;[&lt;/span&gt;pattern]

  &lt;span class="c"&gt;# return the number of "unique" patterns that are subscribed to by clients (that are performed using the PSUBSCRIBE command)&lt;/span&gt;
  &lt;span class="c"&gt;# note that this isn't the count of clients subscribed to patterns, but the total number of unique patterns all the clients are subscribed to&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; PUBSUB NUMPAT

  &lt;span class="c"&gt;# return the number of subscribers (exclusive of clients subscribed to patterns) for the specified channels&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; PUBSUB NUMSUB &lt;span class="o"&gt;[&lt;/span&gt;channel &lt;span class="o"&gt;[&lt;/span&gt;channel ...]]

  &lt;span class="c"&gt;# list the currently active shard channels&lt;/span&gt;
  &lt;span class="c"&gt;# an active shard channel is a Pub/Sub shard channel with one or more subscribers&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; PUBSUB SHARDCHANNELS &lt;span class="o"&gt;[&lt;/span&gt;pattern]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Geospatial data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# we can create a geo-spatial index, using a "key" and the "value" comprising of - *unique name of point (member)*, *latitude* and *longitude*&lt;/span&gt;
&lt;span class="c"&gt;# geo-spatial data is encoded as "geo-hash" - 52 bit integer value&lt;/span&gt;
&lt;span class="c"&gt;# geo-spatial data is stored as sorted sets&lt;/span&gt;

&lt;span class="c"&gt;# commands:&lt;/span&gt;

&lt;span class="c"&gt;# add one or more geospatial items to the geospatial index (key)&lt;/span&gt;
&lt;span class="c"&gt;# adds the specified geospatial items (longitude, latitude, name) to the specified key&lt;/span&gt;
&lt;span class="c"&gt;# options:&lt;/span&gt;
  &lt;span class="c"&gt;# XX: only update elements that already exist, never add elements&lt;/span&gt;
  &lt;span class="c"&gt;# NX: don't update already existing elements, always add new elements&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; GEOADD key &lt;span class="o"&gt;[&lt;/span&gt;NX | XX] longitude latitude member &lt;span class="o"&gt;[&lt;/span&gt;longitude latitude member ...]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; GEOADD Sicily 13.361389 38.115556 &lt;span class="s2"&gt;"Palermo"&lt;/span&gt; 15.087269 37.502669 &lt;span class="s2"&gt;"Catania"&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;integer&lt;span class="o"&gt;)&lt;/span&gt; 2

&lt;span class="c"&gt;# data is stored into the key as a sorted set, in a way that makes it possible to query the items with the GEOSEARCH command&lt;/span&gt;
&lt;span class="c"&gt;# there is no GEODEL command because you can use ZREM to remove elements&lt;/span&gt;

&lt;span class="c"&gt;# see all the computed geo-hashes for a given geospatial index (key) i.e. the computed 52-bit integer values&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZRANGE key 0 &lt;span class="nt"&gt;-1&lt;/span&gt; WITHSCORES

&lt;span class="c"&gt;# see the geo-hashes for specific member(s) in a given geospatial index &lt;/span&gt;
&lt;span class="c"&gt;# the command returns 11-character geo-hash strings, not the 52-bit integers&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; GEOHASH key member &lt;span class="o"&gt;[&lt;/span&gt;member ...]

&lt;span class="c"&gt;# see the longitude and latitude for specific member(s) in a given geospatial index &lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; GEOPOS key member &lt;span class="o"&gt;[&lt;/span&gt;member ...]

&lt;span class="c"&gt;# query a geospatial index to fetch members inside an area of a box or a circle&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; GEOSEARCH key 
  &amp;lt;FROMMEMBER member | FROMLONLAT longitude latitude&amp;gt;
  &amp;lt;BYRADIUS radius &amp;lt;M | KM | FT | MI&amp;gt; | BYBOX width height &amp;lt;M | KM | FT | MI&amp;gt;&amp;gt; 
  &lt;span class="o"&gt;[&lt;/span&gt;ASC | DESC] &lt;span class="o"&gt;[&lt;/span&gt;COUNT count &lt;span class="o"&gt;[&lt;/span&gt;ANY]] &lt;span class="o"&gt;[&lt;/span&gt;WITHCOORD] &lt;span class="o"&gt;[&lt;/span&gt;WITHDIST] &lt;span class="o"&gt;[&lt;/span&gt;WITHHASH]

&lt;span class="c"&gt;# The query's center point is provided by one of these mandatory options:&lt;/span&gt;
  &lt;span class="c"&gt;# FROMMEMBER: use the position of the given existing &amp;lt;member&amp;gt; in the sorted set&lt;/span&gt;
  &lt;span class="c"&gt;# FROMLONLAT: use the given &amp;lt;longitude&amp;gt; and &amp;lt;latitude&amp;gt; position&lt;/span&gt;

&lt;span class="c"&gt;# the query's shape is provided by one of these mandatory options:&lt;/span&gt;
  &lt;span class="c"&gt;# BYRADIUS: similar to GEORADIUS, search inside circular area according to given &amp;lt;radius&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;# BYBOX: search inside an axis-aligned rectangle, determined by &amp;lt;height&amp;gt; and &amp;lt;width&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;# matching items are returned unsorted by default, to sort them, use one of the following two options: ASC or DESC&lt;/span&gt;

&lt;span class="c"&gt;# all matching items are returned by default, to limit the results to the first N matching items, use the COUNT &amp;lt;count&amp;gt; option&lt;/span&gt;

&lt;span class="c"&gt;# the command optionally returns additional information using the following options:&lt;/span&gt;
  &lt;span class="c"&gt;# WITHDIST: also return the distance of the returned items from the specified center point, the distance is returned in the same unit as specified for the radius or height and width arguments&lt;/span&gt;
  &lt;span class="c"&gt;# WITHCOORD: also return the longitude and latitude of the matching items&lt;/span&gt;
  &lt;span class="c"&gt;# WITHHASH: also return the raw geohash-encoded sorted set score of the item&lt;/span&gt;

&lt;span class="c"&gt;# GEOSEARCHSTORE is similR GEOSEARCH, but stores the result in destination key&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; GEOSEARCHSTORE destination &lt;span class="nb"&gt;source&lt;/span&gt; 
  &amp;lt;FROMMEMBER member | FROMLONLAT longitude latitude&amp;gt; 
  &amp;lt;BYRADIUS radius &amp;lt;M | KM | FT | MI&amp;gt; | BYBOX width height &amp;lt;M | KM | FT | MI&amp;gt;&amp;gt; 
  &lt;span class="o"&gt;[&lt;/span&gt;ASC | DESC] &lt;span class="o"&gt;[&lt;/span&gt;COUNT count &lt;span class="o"&gt;[&lt;/span&gt;ANY]] &lt;span class="o"&gt;[&lt;/span&gt;STOREDIST]

&lt;span class="c"&gt;# return the distance between two members in the geospatial index&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; GEODIST key member1 member2 &lt;span class="o"&gt;[&lt;/span&gt;M | KM | FT | MI]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>devto</category>
      <category>announcement</category>
      <category>community</category>
      <category>offers</category>
    </item>
    <item>
      <title>React Hooks by Example - Part 1</title>
      <dc:creator>Hrittik Bhattacharjee</dc:creator>
      <pubDate>Sat, 04 Feb 2023 20:58:34 +0000</pubDate>
      <link>https://forem.com/the777ist/react-hooks-by-example-part-1-31o0</link>
      <guid>https://forem.com/the777ist/react-hooks-by-example-part-1-31o0</guid>
      <description>&lt;h2&gt;
  
  
  Learn Hooks = Make Money!🤑
&lt;/h2&gt;

&lt;p&gt;Let's jump right in!&lt;br&gt;
Oh wait, what are hooks?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reactjs.org/docs/hooks-intro.html" rel="noopener noreferrer"&gt;React docs&lt;/a&gt; has this to say&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hooks are a new addition in React 16.8. They let you use state and other React features without writing a class"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Honestly though, you're definitely better off learning hooks there, but in case you prefer a less bloated source in more of a go-to, no-BS spirit, read on!&lt;br&gt;
Okay let's make some money!&lt;/p&gt;

&lt;p&gt;The code for all the examples can be found at this &lt;a href="https://codesandbox.io/s/u2tbtz" rel="noopener noreferrer"&gt;Code Sandbox&lt;/a&gt;.&lt;br&gt;
This is Part 1 of a three-part series, and it covers the OG hooks; &lt;strong&gt;useState&lt;/strong&gt;, &lt;strong&gt;useEffect&lt;/strong&gt; and &lt;strong&gt;useContext&lt;/strong&gt;!😎&lt;/p&gt;


&lt;h2&gt;
  
  
  useState
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;useState&lt;/code&gt; hook is used to store and update dynamic data in the application, i.e. "State".&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a state variable and a function to update said state value:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const [state, setState] = useState(initialState);
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Update the value of the state variable:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;setState(newState);
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

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

&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// /src/UseStateExample.js &lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UseStateExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCounter&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UseStateExample&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Dinero&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;You&lt;/span&gt; &lt;span class="nx"&gt;have&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="err"&gt;💵&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCounter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;/li&gt;

&lt;li&gt;

&lt;p&gt;In the above example, &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The state variable &lt;code&gt;counter&lt;/code&gt; is initialized to 0 using the &lt;code&gt;useState&lt;/code&gt; hook. &lt;/li&gt;
&lt;li&gt;When the button is clicked, the setter function &lt;code&gt;setCounter&lt;/code&gt; runs and increments the value of &lt;code&gt;counter&lt;/code&gt; by 1.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;See it in action &lt;a href="https://u2tbtz.csb.app/use-state" rel="noopener noreferrer"&gt;here&lt;/a&gt; and the code at this &lt;a href="https://codesandbox.io/s/react-hooks-examples-u2tbtz?file=/src/UseStateExample.js" rel="noopener noreferrer"&gt;sandbox&lt;/a&gt;!&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  useEffect
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;useEffect&lt;/code&gt; hook takes a callback function and an optional dependency array, as arguments.&lt;/li&gt;
&lt;li&gt;It is used to run some logic inside a callback function, when the value of any of the variables in a specified dependency array changes.&lt;/li&gt;
&lt;li&gt;If the dependency array is empty, then the function runs once when the component is initialy loaded.&lt;/li&gt;
&lt;li&gt;If you need to run some logic before the component is unmounted, this can be done by &lt;strong&gt;returning&lt;/strong&gt; a function from the callback to &lt;code&gt;useEffect&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// /src/UseEffectExample.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UseEffectExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCounter&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Congratulations! You're a Millionaire&lt;/span&gt;&lt;span class="dl"&gt;"&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;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UseEffectExample&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Dinero&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;You&lt;/span&gt; &lt;span class="nx"&gt;have&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="err"&gt;💵&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCounter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Become&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;Millionaire&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;/li&gt;
&lt;li&gt;
&lt;p&gt;In the above example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The callback to &lt;code&gt;useEffect&lt;/code&gt; will run each time the value of &lt;code&gt;counter&lt;/code&gt; changes.&lt;/li&gt;
&lt;li&gt;When &lt;code&gt;counter &amp;gt;= 1000000&lt;/code&gt;, an alert will be displayed! &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;See it in action &lt;a href="https://u2tbtz.csb.app/use-effect" rel="noopener noreferrer"&gt;here&lt;/a&gt; and the code at this &lt;a href="https://codesandbox.io/s/react-hooks-examples-u2tbtz?file=/src/UseEffectExample.js" rel="noopener noreferrer"&gt;sandbox&lt;/a&gt;! &lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  useContext
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;React's &lt;em&gt;Context API&lt;/em&gt; allows you to share data between components without having to prop-drill them down the hierarchy, i.e. without having to pass data down to each child component. The &lt;code&gt;useContext&lt;/code&gt; hook allows us to do this.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We can create a Context in the top-level component like so:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const CashContext = createContext("one million dollars");
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And we can wrap the child components inside a Provider, and they will have access to the value:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function App(props) {
  return (
    &amp;lt;CashContext.Provider value={"one million dollars"}&amp;gt;
      &amp;lt;ChildComponent1 /&amp;gt;
    &amp;lt;/CashContext.Provider&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We can then use the &lt;code&gt;useContext&lt;/code&gt; hook inside nth level child components to access this value passed to the Provider:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function ChildComponent1(props) {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;ChildComponent2 /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

function ChildComponent2() {
  const cash = useContext(CashContext);

  return (
    &amp;lt;div&amp;gt;{cash}&amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Note: the below example illustrates how Context can be used to access &lt;strong&gt;and update&lt;/strong&gt; values from within child components, which is a pretty useful pattern.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// /src/context/emojiContext.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emojis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;heavy-dollar-sign&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;💲&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dollar-banknote&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;💵&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;money-bag&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;💰&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;EmojiContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;emoji&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;emojis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;heavy-dollar-sign&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;setEmoji&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// --------------------------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;// /src/App.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./styles.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BrowserRouter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Routes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;emojis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;EmojiContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./context/emojiContext&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;UseContextExample&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./UseContextExample&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;emoji&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEmoji&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emojis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;heavy-dollar-sign&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emojiValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;emoji&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEmoji&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;EmojiContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;emojiValue&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;BrowserRouter&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Routes&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use-context&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UseContextExample&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Routes&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/BrowserRouter&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/EmojiContext.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// --------------------------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;// /src/UseContextExample.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;emojis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;EmojiContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./context/emojiContext&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UseContextExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;emoji&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEmoji&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;EmojiContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getRandom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emoji&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;emojis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;heavy-dollar-sign&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;emojis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;money-bag&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;emojis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;heavy-dollar-sign&lt;/span&gt;&lt;span class="dl"&gt;"&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;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Dinero&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;You&lt;/span&gt; &lt;span class="nx"&gt;have&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;emoji&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setEmoji&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getRandom&lt;/span&gt;&lt;span class="p"&gt;())}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;Click&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nx"&gt;something&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;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;/li&gt;
&lt;li&gt;
&lt;p&gt;In the above example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We create a Context in &lt;code&gt;emojiContext.js&lt;/code&gt; and export it.&lt;/li&gt;
&lt;li&gt;Import it into &lt;code&gt;App.js&lt;/code&gt; and wrap the child components inside the Provider.&lt;/li&gt;
&lt;li&gt;The "value" passed to the Provider are the state variable and setter function.&lt;/li&gt;
&lt;li&gt;In &lt;code&gt;UseContextExample.js&lt;/code&gt; we use the &lt;code&gt;useContext&lt;/code&gt; hook to access and update the value as needed.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;See it in action &lt;a href="https://u2tbtz.csb.app/use-context" rel="noopener noreferrer"&gt;here&lt;/a&gt; and the code at this sandbox for &lt;a href="https://codesandbox.io/s/react-hooks-examples-u2tbtz?file=/src/context/emojiContext.js" rel="noopener noreferrer"&gt;emojiContext.js&lt;/a&gt;, &lt;a href="https://codesandbox.io/s/react-hooks-examples-u2tbtz?file=/src/App.js" rel="noopener noreferrer"&gt;App.js&lt;/a&gt; and &lt;a href="https://codesandbox.io/s/react-hooks-examples-u2tbtz?file=/src/UseContextExample.js" rel="noopener noreferrer"&gt;UseContextExample.js&lt;/a&gt;! &lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Hope this was fun and you're sleeping on stacks of cash by now!&lt;br&gt;
Stay tuned for Part 2 and 3 where we look at more hooks🤘&lt;br&gt;
Cheers!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
      <category>learning</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Redis Commands Cheat Sheet Part 3 - Sets and Sorted Sets</title>
      <dc:creator>Hrittik Bhattacharjee</dc:creator>
      <pubDate>Sat, 28 Jan 2023 21:20:39 +0000</pubDate>
      <link>https://forem.com/the777ist/redis-commands-cheat-sheet-part-3-sets-and-sorted-sets-5fh6</link>
      <guid>https://forem.com/the777ist/redis-commands-cheat-sheet-part-3-sets-and-sorted-sets-5fh6</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ch1nj3g33iea3w75ol8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ch1nj3g33iea3w75ol8.png" alt="Redis Icon" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Following are some of the commonly used Redis commands and data structures, use this list as a quick cheat sheet or a ready reference for your day-to-day Redis usage as needed 😄&lt;/p&gt;

&lt;p&gt;This is Part 3 of this series, containing commands pertaining to &lt;strong&gt;Sets&lt;/strong&gt; and &lt;strong&gt;Sorted Sets&lt;/strong&gt; in Redis.&lt;/p&gt;




&lt;h3&gt;
  
  
  Sets
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# add one/more elements (members) to a set&lt;/span&gt;
&lt;span class="c"&gt;# ignores duplicates - returns 0 for duplicates since they will not be added&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SADD key member &lt;span class="o"&gt;[&lt;/span&gt;member ...]

&lt;span class="c"&gt;# get number of members, or cardinality, in a set&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SCARD key

&lt;span class="c"&gt;# get all members of a set&lt;/span&gt;
&lt;span class="c"&gt;# inefficient&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SMEMBERS key

&lt;span class="c"&gt;# iterate over members of a set&lt;/span&gt;
&lt;span class="c"&gt;# more efficient than SMEMBERS&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SSCAN key cursor &lt;span class="o"&gt;[&lt;/span&gt;MATCH pattern] &lt;span class="o"&gt;[&lt;/span&gt;COUNT count]

&lt;span class="c"&gt;# determine if a given value is a member of a set&lt;/span&gt;
&lt;span class="c"&gt;# returns:&lt;/span&gt;
&lt;span class="c"&gt;#   - 1 if the element is a member of the set.&lt;/span&gt;
&lt;span class="c"&gt;#   - 0 if the element is not a member of the set, or if key does not exist&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SISMEMBER key member

&lt;span class="c"&gt;# remove one/more members by value&lt;/span&gt;
&lt;span class="c"&gt;# specified members that are not a member of this set are ignored&lt;/span&gt;
&lt;span class="c"&gt;# if 'key' does not exist, it is treated as an empty set and this command returns 0&lt;/span&gt;
&lt;span class="c"&gt;# error is returned when the value stored at 'key' is not a set&lt;/span&gt;
&lt;span class="c"&gt;# the return value indicates how many elements were removed&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SREM key member &lt;span class="o"&gt;[&lt;/span&gt;member ...]

&lt;span class="c"&gt;# remove and return one/multiple random member from the set&lt;/span&gt;
&lt;span class="c"&gt;# default value of 'count' is 1&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SPOP key &lt;span class="o"&gt;[&lt;/span&gt;count]

&lt;span class="c"&gt;# union, intersection, difference of multiple sets stored at a specific key&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SUNION key &lt;span class="o"&gt;[&lt;/span&gt;key ...]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SINTER key &lt;span class="o"&gt;[&lt;/span&gt;key ...]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SDIFF key &lt;span class="o"&gt;[&lt;/span&gt;key ...]

&lt;span class="c"&gt;# union, intersection, difference of multiple sets stored at a specific key - and store the resulting set in a new set at a 'destination' key&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SUNIONSTORE destination key &lt;span class="o"&gt;[&lt;/span&gt;key ...]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SINTERSTORE destination key &lt;span class="o"&gt;[&lt;/span&gt;key ...]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SDIFFSTORE destination key &lt;span class="o"&gt;[&lt;/span&gt;key ...]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Sorted Sets
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# add one/more members to sorted set, or update its score if member already exists&lt;/span&gt;
&lt;span class="c"&gt;# for oprions, see: https://redis.io/commands/zadd/&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZADD key score member &lt;span class="o"&gt;[&lt;/span&gt;score member ...] &lt;span class="o"&gt;[&lt;/span&gt;NX | XX] &lt;span class="o"&gt;[&lt;/span&gt;GT | LT] &lt;span class="o"&gt;[&lt;/span&gt;CH] &lt;span class="o"&gt;[&lt;/span&gt;INCR]

&lt;span class="c"&gt;# increment score of a member&lt;/span&gt;
&lt;span class="c"&gt;# decremebt score by using negative value for 'ncrement'&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZINCRBY key increment member

&lt;span class="c"&gt;# iterate over sorted set, from lowest score to highest score&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZRANGE key start-index stop-index &lt;span class="o"&gt;[&lt;/span&gt;WITHSCORES]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZRANGE &lt;span class="s2"&gt;"subway:red-line"&lt;/span&gt; 0 &lt;span class="nt"&gt;-1&lt;/span&gt; WITHSCORES

&lt;span class="c"&gt;# iterate over sorted set, from highest score to lowest score&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZREVRANGE key start-index stop-index &lt;span class="o"&gt;[&lt;/span&gt;WITHSCORES]

&lt;span class="c"&gt;# WITHSCORES includes the score of the members in the output&lt;/span&gt;

&lt;span class="c"&gt;# return all the elements in the sorted set at key with a score between min and max, from lowest score to highest score&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZRANGEBYSCORE key min max &lt;span class="o"&gt;[&lt;/span&gt;WITHSCORES]

&lt;span class="c"&gt;# return all the elements in the sorted set at key with a score between min and max, from highest score to lowest score&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZREVRANGEBYSCORE key min max &lt;span class="o"&gt;[&lt;/span&gt;WITHSCORES]

&lt;span class="c"&gt;# 'min' and 'max' can be -inf and +inf&lt;/span&gt;
&lt;span class="c"&gt;# by default, the interval specified by 'min' and 'max' is inclusive&lt;/span&gt;
&lt;span class="c"&gt;# it is possible to specify an exclusive interval by prefixing the score with the character '('&lt;/span&gt;
&lt;span class="c"&gt;# example:&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZRANGEBYSCORE zset &lt;span class="o"&gt;(&lt;/span&gt;1 5 &lt;span class="c"&gt;# return all elements with 1 &amp;lt; score &amp;lt;= 5&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZRANGEBYSCORE zset &lt;span class="o"&gt;(&lt;/span&gt;5 &lt;span class="o"&gt;(&lt;/span&gt;10 &lt;span class="c"&gt;# return all the elements with 5 &amp;lt; score &amp;lt; 10 (5 and 10 excluded)&lt;/span&gt;

&lt;span class="c"&gt;# when all the elements in a sorted set are inserted with the same score, in order to force lexicographical ordering&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZRANGEBYLEX key min max

&lt;span class="c"&gt;# 'min' and 'max' can be - and +&lt;/span&gt;
&lt;span class="c"&gt;# '(' is exclusive&lt;/span&gt;
&lt;span class="c"&gt;# '[' is inclusive&lt;/span&gt;
&lt;span class="c"&gt;# example:&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZRANGEBYLEX myzset - &lt;span class="o"&gt;[&lt;/span&gt;c &lt;span class="c"&gt;# returns a, b and c&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZRANGEBYLEX myzset - &lt;span class="o"&gt;(&lt;/span&gt;c &lt;span class="c"&gt;# returns a and b&lt;/span&gt;

&lt;span class="c"&gt;# find index (rank) of a member in a sorted set, from lowest score to highest score&lt;/span&gt;
&lt;span class="c"&gt;# scores ordered from low to high, i.e. member with the lowest score has rank 0&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZRANK key member

&lt;span class="c"&gt;# find index (rank) of a member in a sorted set, from highest score to lowest score&lt;/span&gt;
&lt;span class="c"&gt;# scores ordered from high to low, i.e. member with the highest score has rank 0&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZREVRANK key member

&lt;span class="c"&gt;# get score of a given member&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZSCORE key member

&lt;span class="c"&gt;# count the members with scores within the given values&lt;/span&gt;
&lt;span class="c"&gt;# includes members with scores equl to 'min' and 'max'&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZCOUNT key min max 

&lt;span class="c"&gt;# remove one/more members from a sorted set&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZREM key member &lt;span class="o"&gt;[&lt;/span&gt;member ...]

&lt;span class="c"&gt;# get number of elements (cardinality) in a sorted set&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZCARD key

&lt;span class="c"&gt;# set operations - union, intersection, difference on sorted sets&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZUNION numkeys key &lt;span class="o"&gt;[&lt;/span&gt;key ...]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZINTER numkeys key &lt;span class="o"&gt;[&lt;/span&gt;key ...]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZDIFF numkeys key &lt;span class="o"&gt;[&lt;/span&gt;key ...]

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZUNIONSTORE destination numkeys key &lt;span class="o"&gt;[&lt;/span&gt;key ...] &lt;span class="o"&gt;[&lt;/span&gt;AGGREGATE &amp;lt;SUM | MIN | MAX&amp;gt;]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZINTERSTORE destination numkeys key &lt;span class="o"&gt;[&lt;/span&gt;key ...] &lt;span class="o"&gt;[&lt;/span&gt;AGGREGATE &amp;lt;SUM | MIN | MAX&amp;gt;]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZDIFFSTORE destination numkeys key &lt;span class="o"&gt;[&lt;/span&gt;key ...]

&lt;span class="c"&gt;# for the above commands, it is mandatory to provide the number of input keys (numkeys) before passing the input keys and the other (optional) arguments&lt;/span&gt;
&lt;span class="c"&gt;# when AGGREGATE is SUM: the resulting set will contain the sum of the score of an element across the inputs where it exists (default)&lt;/span&gt;
&lt;span class="c"&gt;# when AGGREGATE is MIN or MAX: the resulting set will contain the minimum or maximum score of an element across the inputs where it exists&lt;/span&gt;

&lt;span class="c"&gt;# commands for set operations on sorted sets, can work between sets as well as sorted sets&lt;/span&gt;

&lt;span class="c"&gt;# remove all members in a sorted set within the given scores&lt;/span&gt;
&lt;span class="c"&gt;# min and max are inclusive by default, exclusive if appended with a '('&lt;/span&gt;
&lt;span class="c"&gt;# min and max can be -inf and +inf&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZREMRANGEBYSCORE key min max 

&lt;span class="c"&gt;# remove all members in a sorted set within the given indexes&lt;/span&gt;
&lt;span class="c"&gt;# start and stop are inclusive&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZREMRANGEBYRANK key start stop

&lt;span class="c"&gt;# remove all members in a sorted set within the given lexicographical range&lt;/span&gt;
&lt;span class="c"&gt;# min and max are inclusive if appended with a '[', exclusive if appended with a '('&lt;/span&gt;
&lt;span class="c"&gt;# min and max can be - and +&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ZREMRANGEBYLEX key min max
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Hope you found this useful! Save the post for reference, here's &lt;a href="https://dev.to/espelar-dev/redis-commands-cheat-sheet-part-1-keys-strings-278j"&gt;Part 1&lt;/a&gt; and &lt;a href="//..."&gt;Part 2&lt;/a&gt; of the series.&lt;/p&gt;

&lt;p&gt;Do follow &lt;a href="https://dev.to/espelar-dev"&gt;espelar.dev&lt;/a&gt; we're working on some pretty cool stuff and have exciting content for you in the works.😊&lt;br&gt;
Cheers!&lt;/p&gt;

</description>
      <category>redis</category>
      <category>cheatsheet</category>
      <category>rediscommand</category>
      <category>database</category>
    </item>
    <item>
      <title>Redis Commands Cheat Sheet Part 2 - Hashes and Lists</title>
      <dc:creator>Hrittik Bhattacharjee</dc:creator>
      <pubDate>Fri, 27 Jan 2023 23:53:48 +0000</pubDate>
      <link>https://forem.com/the777ist/redis-commands-cheat-sheet-part-2-hashes-and-lists-36a4</link>
      <guid>https://forem.com/the777ist/redis-commands-cheat-sheet-part-2-hashes-and-lists-36a4</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%2F2ch1nj3g33iea3w75ol8.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%2F2ch1nj3g33iea3w75ol8.png" alt="Redis Icon" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Following are some of the commonly used Redis commands and data structures, use this list as a quick cheat sheet or a ready reference for your day-to-day Redis usage as needed 😄&lt;/p&gt;

&lt;p&gt;This is Part 2 of this series, containing commands pertaining to &lt;strong&gt;Hashes&lt;/strong&gt; and &lt;strong&gt;Lists&lt;/strong&gt; in Redis.&lt;/p&gt;




&lt;h3&gt;
  
  
  Hashes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# create a hash&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HSET key field value &lt;span class="o"&gt;[&lt;/span&gt;field value ...]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HSET player:1000 name Artexius race Elf level 5
&lt;span class="o"&gt;(&lt;/span&gt;integer&lt;span class="o"&gt;)&lt;/span&gt; 3

&lt;span class="c"&gt;# returns the number of fields saved in the hash, so 3 in the above case&lt;/span&gt;

&lt;span class="c"&gt;# if field does not exist, HSET will create the field and set it's value as specified&lt;/span&gt;

&lt;span class="c"&gt;# to set a field value only if it does not yet exist&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HSETNX key field value

&lt;span class="c"&gt;# get all fields and values of the hash&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HGETALL key
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HGETALL player:1000

&lt;span class="c"&gt;# get the value of a specific field in the hash&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HGET key field
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HGET player:1000 level

&lt;span class="c"&gt;# get the value of a multiple specific fields in the hash&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HMGET key field &lt;span class="o"&gt;[&lt;/span&gt;field ...]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HMGET player:1000 level name race

&lt;span class="c"&gt;# get all field names for a key&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HKEYS key

&lt;span class="c"&gt;# get all field values for a key&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HVALS key

&lt;span class="c"&gt;# update a field in the hash&lt;/span&gt;
&lt;span class="c"&gt;# HSET overwrites the values of specified fields that exist in the hash. If key doesn't exist, a new key holding a hash is created&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HSET field
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HSET player:1000 level 15

&lt;span class="c"&gt;# set a field in the hash only if field does not yet exist&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HSETNX key field value

&lt;span class="c"&gt;# delete a field(s) in the hash&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HDEL key field &lt;span class="o"&gt;[&lt;/span&gt;field ...] 
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HDEL player:1000 level

&lt;span class="c"&gt;# increment the value of a hash field&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HINCRBY key field increment
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HINCRBYFLOAT key field increment

&lt;span class="c"&gt;# determine if a hash field exists&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HEXISTS key field

&lt;span class="c"&gt;# returns 1 if exists, 0 if does not&lt;/span&gt;

&lt;span class="c"&gt;# iterate over fields that match a pattern&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; HSCAN key cursor &lt;span class="o"&gt;[&lt;/span&gt;MATCH pattern] &lt;span class="o"&gt;[&lt;/span&gt;COUNT count]

&lt;span class="c"&gt;# the first HSCAN called with cursor 0&lt;/span&gt;
&lt;span class="c"&gt;# this returns a new cursor that can be used in subsequent iterations&lt;/span&gt;
&lt;span class="c"&gt;# HSCAN Is more efficient than HGETALL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Lists
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# push elements (to right side) of list&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; RPUSH key element &lt;span class="o"&gt;[&lt;/span&gt;element ...]

&lt;span class="c"&gt;# push elements (to left side) of list&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; LPUSH key element &lt;span class="o"&gt;[&lt;/span&gt;element ...]

&lt;span class="c"&gt;# pop elements (from left side) of list&lt;/span&gt;
&lt;span class="c"&gt;# default, the command pops a single element from the beginning of the list&lt;/span&gt;
&lt;span class="c"&gt;# but when provided with the optional count argument, the reply will consist of up to count elements, depending on the list's length&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; LPOP key &lt;span class="o"&gt;[&lt;/span&gt;count]

&lt;span class="c"&gt;# pop elements (from right side) of list&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; RPOP key &lt;span class="o"&gt;[&lt;/span&gt;count]

&lt;span class="c"&gt;# get a range of elements from the list &lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; LRANGE key start stop

&lt;span class="c"&gt;# if you have a list of numbers from 0 to 100, LRANGE list 0 10 will return 11 elements, that is, the rightmost item is included&lt;/span&gt;
&lt;span class="c"&gt;# -1 is rightmost value&lt;/span&gt;

&lt;span class="c"&gt;# check length of the list&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; LLEN key

&lt;span class="c"&gt;# if key does not exist, it is interpreted as an empty list and 0 is returned&lt;/span&gt;
&lt;span class="c"&gt;# error is returned when the value stored at key is not a list&lt;/span&gt;

&lt;span class="c"&gt;# return element at a specified index&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; LINDEX key index

&lt;span class="c"&gt;# add an element before/after an element&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; LINSERT key BEFORE|AFTER pivot-element new-element

&lt;span class="c"&gt;# set value at a specified index&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; LSET key index value

&lt;span class="c"&gt;# remove the first 'count' occurrences of elements equal to 'element' from the list stored at key&lt;/span&gt;
&lt;span class="c"&gt;# the 'count' argument influences the operation in the following ways:&lt;/span&gt;
&lt;span class="c"&gt;#   - 'count' &amp;gt; 0: Remove elements equal to 'element' moving from head to tail&lt;/span&gt;
&lt;span class="c"&gt;#   - 'count' &amp;lt; 0: Remove elements equal to 'element' moving from tail to head&lt;/span&gt;
&lt;span class="c"&gt;#   - 'count' = 0: Remove all elements equal to 'element'&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; LREM key count element

&lt;span class="c"&gt;# trim list to a specified range&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; LTRIM key start stop

&lt;span class="c"&gt;# example: &lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; LTRIM foobar 0 2 &lt;span class="c"&gt;# only the first three elements of the list will remain in the list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Hope you found this useful! Save the post for reference, here's &lt;a href="https://dev.to/espelar-dev/redis-commands-cheat-sheet-part-1-keys-strings-278j"&gt;Part 1&lt;/a&gt; of the series. Part 3 will be out soon!&lt;/p&gt;

&lt;p&gt;Do follow &lt;a href="https://dev.to/espelar-dev"&gt;espelar.dev&lt;/a&gt; we're working on some pretty cool stuff and have exciting content for you in the works.😊&lt;br&gt;
Cheers!&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>ai</category>
      <category>webdev</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Redis Commands Cheat Sheet Part 1 - Keys and Strings</title>
      <dc:creator>Hrittik Bhattacharjee</dc:creator>
      <pubDate>Fri, 27 Jan 2023 23:42:57 +0000</pubDate>
      <link>https://forem.com/the777ist/redis-commands-cheat-sheet-part-1-keys-strings-278j</link>
      <guid>https://forem.com/the777ist/redis-commands-cheat-sheet-part-1-keys-strings-278j</guid>
      <description>&lt;p&gt;&lt;a href="https://media.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%2F2ch1nj3g33iea3w75ol8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F2ch1nj3g33iea3w75ol8.png" alt="Redis Icon"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Following are some of the commonly used Redis commands and data structures, use this list as a quick cheat sheet or a ready reference for your day-to-day Redis usage as needed.😄&lt;/p&gt;

&lt;p&gt;This is Part 1 of this series, containing commands pertaining to &lt;strong&gt;Keys&lt;/strong&gt; and &lt;strong&gt;Strings&lt;/strong&gt; in Redis.&lt;/p&gt;




&lt;h2&gt;
  
  
  Keys
&lt;/h2&gt;

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

&lt;span class="c"&gt;# SET: store a value for a given key name&lt;/span&gt;
&lt;span class="c"&gt;# NX or XX allows us to check for "only if does not exist" or "only if exists" while setting, respectively&lt;/span&gt;
&lt;span class="c"&gt;# PX is used to set TTL for a key in milliseconds&lt;/span&gt;
&lt;span class="c"&gt;# EX is used to set TTL for a key in seconds&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SET key value &lt;span class="o"&gt;[&lt;/span&gt;NX | XX] &lt;span class="o"&gt;[&lt;/span&gt;EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SET customer:1000 fred

&lt;span class="c"&gt;# options of the SET command:&lt;/span&gt;
&lt;span class="c"&gt;#   EX seconds -- Set the specified expire time, in seconds.&lt;/span&gt;
&lt;span class="c"&gt;#   PX milliseconds -- Set the specified expire time, in milliseconds.&lt;/span&gt;
&lt;span class="c"&gt;#   EXAT timestamp-seconds -- Set the specified Unix time at which the key will expire, in seconds.&lt;/span&gt;
&lt;span class="c"&gt;#   PXAT timestamp-milliseconds -- Set the specified Unix time at which the key will expire, in milliseconds.&lt;/span&gt;
&lt;span class="c"&gt;#   NX -- Only set the key if it does not already exist.&lt;/span&gt;
&lt;span class="c"&gt;#   XX -- Only set the key if it already exist.&lt;/span&gt;

&lt;span class="c"&gt;# GET: return a value for a given key name&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; GET key
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; GET customer:1000

&lt;span class="c"&gt;# keys and scan: get a list of existing key names, or to iterate over keys that match a pattern&lt;/span&gt;
&lt;span class="c"&gt;# keys:&lt;/span&gt;
&lt;span class="c"&gt;#   - blocks until complete&lt;/span&gt;
&lt;span class="c"&gt;#   - never use in production&lt;/span&gt;
&lt;span class="c"&gt;#   - useful for debugging&lt;/span&gt;
&lt;span class="c"&gt;# scan:&lt;/span&gt;
&lt;span class="c"&gt;#   - also blocks but returns only a handful of keys at a time, &lt;/span&gt;
&lt;span class="c"&gt;#   - then returns a slot reference (or, cursor) that can then be used to continue more iterations&lt;/span&gt;
&lt;span class="c"&gt;#   - safe for production&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; KEYS customer:1&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="c"&gt;# returns customer:1000, customer 1500 etc. cus they match the pattern 1*&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SCAN cursor &lt;span class="o"&gt;[&lt;/span&gt;MATCH pattern] &lt;span class="o"&gt;[&lt;/span&gt;COUNT count] &lt;span class="o"&gt;[&lt;/span&gt;TYPE &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SCAN 0 MATCH customer:1&lt;span class="k"&gt;*&lt;/span&gt; COUNT 1000
&lt;span class="c"&gt;# may or may not return results&lt;/span&gt;
&lt;span class="c"&gt;# but returns the next slot reference to be used in the next command&lt;/span&gt;

&lt;span class="c"&gt;# e.g. if it returns the slot reference 14848, then the next SCAN command will be&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SCAN 14848 MATCH customer:1&lt;span class="k"&gt;*&lt;/span&gt; COUNT 1000

&lt;span class="c"&gt;# COUNT is optional, it may be used to return more keys per call, but the more the COUNT, the longer it will block&lt;/span&gt;

&lt;span class="c"&gt;# removing keys&lt;/span&gt;
&lt;span class="c"&gt;# DEL: &lt;/span&gt;
&lt;span class="c"&gt;#   - remove the key and the memory associated with the key&lt;/span&gt;
&lt;span class="c"&gt;#   - blocking operation&lt;/span&gt;
&lt;span class="c"&gt;# UNLINK: &lt;/span&gt;
&lt;span class="c"&gt;#   - the key will no longer exist&lt;/span&gt;
&lt;span class="c"&gt;#   - the memory associated with the key value is claimed by an async process, so non-blocking&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; DEL key &lt;span class="o"&gt;[&lt;/span&gt;key ...]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; UNLINK key &lt;span class="o"&gt;[&lt;/span&gt;key ...]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; UNLINK customer:1000

&lt;span class="c"&gt;# returns the number of keys removed&lt;/span&gt;

&lt;span class="c"&gt;# when SET is used on a key name that does not exist, the key is automatically created&lt;/span&gt;
&lt;span class="c"&gt;# however, to set the key value only if the key exysts, use EXISTS&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; EXISTS key &lt;span class="o"&gt;[&lt;/span&gt;key ...]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; EXISTS customer:1000

&lt;span class="c"&gt;# if the same existing key is mentioned in the arguments multiple times, it will be counted multiple times. &lt;/span&gt;
&lt;span class="c"&gt;# So if somekey exists, EXISTS somekey somekey will return 2.&lt;/span&gt;

&lt;span class="c"&gt;# setting TTL for a key&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; EXPIRE key seconds
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; PEXPIRE key milliseconds
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; EXPIREAT key timestamp
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; PEXPIREAT key milliseconds-timestamp

&lt;span class="c"&gt;# viewing TTL for a key&lt;/span&gt;
&lt;span class="c"&gt;# in seconds&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; TTL key
&lt;span class="c"&gt;# in milliseconds&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; PTTL key

&lt;span class="c"&gt;# removing TTL for a key&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; PERSIST key

&lt;span class="c"&gt;# PX or EX can be used to set TTL for key at the time of creation&lt;/span&gt;

&lt;span class="c"&gt;# TTL of a "persisted" key is -1&lt;/span&gt;

&lt;span class="c"&gt;# SCAN basic usage example&lt;/span&gt;
&lt;span class="c"&gt;# SCAN is a cursor based iterator&lt;/span&gt;
&lt;span class="c"&gt;# this means that at every call of the command, the server returns an updated cursor that the user needs to use as the cursor argument in the next call&lt;/span&gt;
&lt;span class="c"&gt;# an iteration starts when the cursor is set to 0, and terminates when the cursor returned by the server is 0&lt;/span&gt;
&lt;span class="c"&gt;# commands `SCAN, SSCAN, HSCAN and ZSCAN` all work very similarly&lt;/span&gt;
&lt;span class="c"&gt;# the default `COUNT` value is 10&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; scan 0
1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"17"&lt;/span&gt;
2&lt;span class="o"&gt;)&lt;/span&gt;  1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:12"&lt;/span&gt;
    2&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:8"&lt;/span&gt;
    3&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:4"&lt;/span&gt;
    4&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:14"&lt;/span&gt;
    5&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:16"&lt;/span&gt;
    6&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:17"&lt;/span&gt;
    7&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:15"&lt;/span&gt;
    8&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:10"&lt;/span&gt;
    9&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:3"&lt;/span&gt;
    10&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:7"&lt;/span&gt;
    11&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:1"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; scan 17
1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"0"&lt;/span&gt;
2&lt;span class="o"&gt;)&lt;/span&gt;  1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:5"&lt;/span&gt;
    2&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:18"&lt;/span&gt;
    3&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:0"&lt;/span&gt;
    4&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:2"&lt;/span&gt;
    5&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:19"&lt;/span&gt;
    6&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:13"&lt;/span&gt;
    7&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:6"&lt;/span&gt;
    8&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:9"&lt;/span&gt;
    9&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"key:11"&lt;/span&gt;


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

&lt;/div&gt;




&lt;h2&gt;
  
  
  Strings
&lt;/h2&gt;

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

&lt;span class="c"&gt;# SET can be used to create a string&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SET key value
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SET user:101:time-zone UTC-8

&lt;span class="c"&gt;# sets the value "UTC-8" for the key user:101:time-zone&lt;/span&gt;

&lt;span class="c"&gt;# GET can be used to retrieve a string&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; GET key
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; GET user:101:time-zone

&lt;span class="c"&gt;# JSON responses can be serealized as a string and stored (cached) as a value for a key&lt;/span&gt;
&lt;span class="c"&gt;# when caching data it is common to set an expiry time using the `EX` option for seconds&lt;/span&gt;
&lt;span class="c"&gt;# after expiry, the key will be deleted along with its value&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SET key:1000 &lt;span class="s1"&gt;'{ "somehing": 1000 }'&lt;/span&gt; EX 7200

&lt;span class="c"&gt;# check remaining TTL for a key/string using the TTL command&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; TTL key:1000

&lt;span class="c"&gt;# integer manipulation commands:&lt;/span&gt;
&lt;span class="c"&gt;# using INCR and INCRBY commands can be used to increment a key's value by 1 or a specified number&lt;/span&gt;
&lt;span class="c"&gt;# if key does not exist, it will be created and incremented appropriately&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; INCR key
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; INCRBY key increment

&lt;span class="c"&gt;# if the number is negative, value will be decremented&lt;/span&gt;

&lt;span class="c"&gt;# there is also the DECR and DECRBY command&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; DECRBY key decrement

&lt;span class="c"&gt;# for floating point incremet&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; INCRBYFLOAT key increment

&lt;span class="c"&gt;# what if the value of a key is a string?&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SET key:1 1000
OK
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; GET key:1
&lt;span class="s2"&gt;"1000"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; DECRBY key:1 1
&lt;span class="o"&gt;(&lt;/span&gt;integer&lt;span class="o"&gt;)&lt;/span&gt; 999
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; GET key:1
&lt;span class="s2"&gt;"999"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; TYPE key:1
string

&lt;span class="c"&gt;# so the DECRBY command casted the string value to integer and performed numerical operation on it&lt;/span&gt;
&lt;span class="c"&gt;# but the value still remains a string&lt;/span&gt;

&lt;span class="c"&gt;# the encoding of the value cn be checked using the OBJECT ENCODING command&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; OBJECT ENCODING key
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; OBJECT ENCODING key:1
&lt;span class="s2"&gt;"int"&lt;/span&gt;

&lt;span class="c"&gt;# so in the example above, the value is a string, but what is stored withing the string datatype is an integer value&lt;/span&gt;

&lt;span class="c"&gt;# redis supports polymorphism&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; SET key:1 &lt;span class="s2"&gt;"hello"&lt;/span&gt;
OK
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; OBJECT ENCODING key:1
&lt;span class="s2"&gt;"embstr"&lt;/span&gt; &lt;span class="c"&gt;# i.e. a text value&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; DECRBY key:1 10
&lt;span class="o"&gt;(&lt;/span&gt;error&lt;span class="o"&gt;)&lt;/span&gt; ERR &lt;span class="c"&gt;# since the encoded vaue is not an integer anymore&lt;/span&gt;


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

&lt;/div&gt;




&lt;p&gt;Hope you found this useful! Save the post for reference, Parts 2 and 3 will be out soon!&lt;/p&gt;

&lt;p&gt;Do follow &lt;a href="https://dev.to/espelar-dev"&gt;espelar.dev&lt;/a&gt; we're working on some pretty cool stuff and have exciting content for you in the works.😊&lt;br&gt;
Cheers!&lt;/p&gt;

</description>
      <category>redis</category>
      <category>cheatsheet</category>
      <category>rediscommand</category>
      <category>database</category>
    </item>
  </channel>
</rss>
