# Memcached

import { Tabs, TabsContent, TabsList, TabsTrigger } from "zudoku/ui/Tabs"

{/* vale off */}
{/* THIS FILE WAS AUTOGENERATED FROM THE PUBLIC EXAMPLE REPOSITORY. DO NOT EDIT THIS FILE DIRECTLY. */}


This guide shows you how to use [Memcached](https://memcached.org).
Memcached is an in-memory key-value store for small chunks of arbitrary data (strings, objects) from results of database calls, API calls, or page rendering.

To run it, follow these steps:

1. Install the CLI.
   Use the [unikraft CLI](/cli/unikraft) or the legacy [kraft CLI](https://unikraft.org/docs/cli/install).
   You need a [BuildKit](https://github.com/moby/buildkit) builder. The easiest way to get one is via [Docker](https://docs.docker.com/engine/install/).
   Alternatively, you can also directly set up and use BuildKit, see the [quick start](https://github.com/moby/buildkit#quick-start).

:::note
The unikraft CLI is the current standard, while kraft is the legacy version.
Choose one of the CLIs below and only run the commands associated with it for the rest of this guide.
:::

2. Clone the [`examples` repository](https://github.com/unikraft-cloud/examples) and `cd` into the `examples/memcached1.6/` directory:

```bash
git clone https://github.com/unikraft-cloud/examples
cd examples/memcached1.6/
```

Make sure to log into Unikraft Cloud and pick a [metro](/platform/metros) close to you.
This guide uses `fra` (Frankfurt, 🇩🇪):

<CodeTabs syncKey="cli">

```bash title="unikraft"
unikraft login
```

```bash title="kraft"
# Set Unikraft Cloud access token
export UKC_TOKEN=token
# Set metro to Frankfurt, DE
export UKC_METRO=fra
```

</CodeTabs>

When done, invoke the following command to deploy this app on Unikraft Cloud:

<CodeTabs syncKey="cli">

```bash title="unikraft"
unikraft build . --output <my-org>/memcached16:latest
unikraft run --scale-to-zero policy=off --metro fra -p 11211:11211/tls -m 256M --image <my-org>/memcached16:latest
```

```bash title="kraft"
kraft cloud deploy --scale-to-zero off -p 11211:11211/tls -M 256Mi .
```

</CodeTabs>

The output shows the instance address and other details:

<CodeTabs syncKey="cli">

```ansi title="unikraft"
metro:        fra
name:         memcached16-arkv7
uuid:         da436eca-bc64-46d7-a04c-72832652b10e
state:        [92mstarting[0m
image:        <my-org>/memcached16
resources:
  memory:     256MiB
  vcpus:      1
service:
  uuid:       ce58c122-62e5-b82d-955d-63053dbc13ec
  name:       weathered-smoke-hehsdinv
  domains:
  - fqdn:     weathered-smoke-hehsdinv.fra.unikraft.app
networks:
- uuid:       1e9e37f9-1ba5-7c92-350e-f399db32d93d
  private-ip: 10.0.6.5
  mac:        12:b0:e3:15:81:6b
timestamps:
  created:    just now
```

```ansi title="kraft"
[90m[[0m[92m●[0m[90m][0m Deployed successfully!
 [90m│[0m
 [90m├[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m [90mname[0m: memcached16-arkv7
 [90m├[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m [90muuid[0m: da436eca-bc64-46d7-a04c-72832652b10e
 [90m├[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m [90mmetro[0m: https://api.fra.unikraft.cloud/v1
 [90m├[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m [90mstate[0m: [92mstarting[0m
 [90m├[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m [90mdomain[0m: https://weathered-smoke-hehsdinv.fra.unikraft.app
 [90m├[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m [90mimage[0m: oci://unikraft.io/<my-org>/memcached16@sha256:f53cdbce4dc185e8acc8ecb93a0ab0ba99085ca0837a0ad2062aae9e31382e58
 [90m├[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m [90mmemory[0m: 256 MiB
 [90m├[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m[90m─[0m [90mservice[0m: weathered-smoke-hehsdinv
 [90m├[0m[90m─[0m [90mprivate fqdn[0m: memcached16-arkv7.internal
 [90m└[0m[90m─[0m[90m─[0m[90m─[0m [90mprivate ip[0m: 10.0.6.5
```

</CodeTabs>

In this case, the instance name is `memcached16-arkv7` which is different for each run.

To test the deployment, first forward the port with the `socat` command:

```bash
socat TCP-LISTEN:11211,reuseaddr,fork OPENSSL:weathered-smoke-hehsdinv.fra.unikraft.app:11211,verify=0
```

Now, on a separate console, run the following commands to test that it works (you should see output when incrementing):

```console
telnet 127.0.0.1 11211

set test 0 0 1
0

incr test 1

incr test 1
```

To exit telnet run:

```console
Ctrl + ]
Ctrl + C
```

To disconnect, kill the `socat` command with ctrl-C.

:::note
This guide uses `socat` for port forwarding only when a service doesn't support TLS and isn't HTTP-based (TLS/SNI determines the correct instance to send traffic to).
Also note that port forwarding isn't needed when connecting via an instance's private IP/FQDN.
For example, when a Memcached instance serves as a cache server to
another instance that acts as a frontend and which **does** support TLS.
:::

You can list information about the instance by running:

<CodeTabs syncKey="cli">

```bash title="unikraft"
unikraft instances list
```

```bash title="kraft"
kraft cloud instance list
```

</CodeTabs>

<CodeTabs syncKey="cli">

```ansi title="unikraft"
[1mMETRO[0m  [1mNAME[0m               [1mSTATE[0m    [1mIMAGE[0m                 [1mARGS[0m  [1mMEMORY[0m  [1mVCPUS[0m  [1mFQDN[0m                                    [1mCREATED[0m
fra    memcached16-arkv7  [92mrunning[0m  <my-org>/memcached16        256MiB  1      weathered-smoke-hehsdinv.fra.unikraft…  2 minutes ago
```

```ansi title="kraft"
[1mNAME[0m               [1mFQDN[0m                                       [1mSTATE[0m    [1mSTATUS[0m          [1mIMAGE[0m                                              [1mMEMORY[0m   [1mVCPUS[0m  [1mARGS[0m  [1mBOOT TIME[0m
memcached16-arkv7  weathered-smoke-hehsdinv.fra.unikraft.app  [92mrunning[0m  11 minutes ago  oci://unikraft.io/<my-org>/memcached16@sha256:...  256 MiB  1            19.27 ms
```

</CodeTabs>

When done, you can remove the instance:

<CodeTabs syncKey="cli">

```bash title="unikraft"
unikraft instances delete memcached16-arkv7
```

```bash title="kraft"
kraft cloud instance remove memcached16-arkv7
```

</CodeTabs>

## Customize your app

To customize the app, update the files in the repository, listed below:

* `Kraftfile`: the Unikraft Cloud specification, including command-line arguments
* `Dockerfile`: In case you need to add files to your instance's rootfs

## Learn more

Use the `--help` option for detailed information on using Unikraft Cloud:

<CodeTabs syncKey="cli">

```bash title="unikraft"
unikraft --help
```

```bash title="kraft"
kraft cloud --help
```

</CodeTabs>

Or visit the [CLI Reference](/cli/unikraft) or the [legacy CLI Reference](/cli/kraft/overview).
{/* vale on */}
