{"id":19656384,"url":"https://github.com/daggerok/redis-getting-started","last_synced_at":"2026-05-12T22:35:57.568Z","repository":{"id":151041985,"uuid":"172406648","full_name":"daggerok/redis-getting-started","owner":"daggerok","description":"Redis playground with docker","archived":false,"fork":false,"pushed_at":"2019-03-01T01:17:42.000Z","size":9352,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-27T02:20:30.435Z","etag":null,"topics":["redis","redis-cli","redis-client"],"latest_commit_sha":null,"homepage":"https://daggerok.github.io/redis-getting-started/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/daggerok.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-02-25T00:16:27.000Z","updated_at":"2019-03-01T01:15:38.000Z","dependencies_parsed_at":null,"dependency_job_id":"0fe423b6-0c46-4265-a7d9-045721e52b6c","html_url":"https://github.com/daggerok/redis-getting-started","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/daggerok/redis-getting-started","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daggerok%2Fredis-getting-started","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daggerok%2Fredis-getting-started/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daggerok%2Fredis-getting-started/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daggerok%2Fredis-getting-started/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/daggerok","download_url":"https://codeload.github.com/daggerok/redis-getting-started/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daggerok%2Fredis-getting-started/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32960295,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-12T09:19:52.626Z","status":"ssl_error","status_checked_at":"2026-05-12T09:17:33.438Z","response_time":102,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["redis","redis-cli","redis-client"],"created_at":"2024-11-11T15:27:38.384Z","updated_at":"2026-05-12T22:35:57.550Z","avatar_url":"https://github.com/daggerok.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# redis getting started\nRedis playground...\n\nTravis CI build status: [![Build Status](https://travis-ci.org/daggerok/redis-getting-started.svg?branch=master)](https://travis-ci.org/daggerok/redis-getting-started/)\n\nGitHub [daggerok/redis-getting-started](https://github.com/daggerok/redis-getting-started/) repository\n\nRead docs on [GitHub Pages](https://daggerok.github.io/redis-getting-started/)\n\n## run database\n\n_run single node instance_\n\n![Single instance mode](./mode-single-instance.png)\n\n```bash\ndocker run -d --rm --name redis redis:alpine\n```\n\n_not shown: master-slaves approach_\n\n![Master-slave mode](./mode-master-slaves.png)\n\nI this case you going to read from your slaves until you not restarted your master\n\n_also not shown: most reliable is run in sentinel mode_\n\n![Sentinel mode](./mode-sentinels.png)\n\n_finally must have mode is clustered_\n\n![Clustered mode](./mode-cluster.png)\n\ncreate `redis.conf` file and start cluster\n\n```bash\n# change dir to safe place\ncd /tmp/\n\n# create redis config\ncat \u003c\u003c EOF \u003e ./redis.conf\nport 6379\ncluster-enabled yes\ncluster-config-file nodes.conf\ncluster-node-timeout 5000\nappendonly yes\nEOF\n\n# create docker network\ndocker network rm redis-net ; \\\n  docker network create redis-net\n\n# run 6 redis nodes\nfor i in `seq 1 6`; do \\\n  docker run -d \\\n    --net redis-net --name redis-$i -p 6379 \\\n    -v $PWD/redis.conf:/usr/local/etc/redis/redis.conf \\\n    redis:alpine redis-server /usr/local/etc/redis/redis.conf; \\\ndone\n\n# find container ip\n#for i in `seq 1 6`; do \\\n#  docker inspect -f '{{ (index .NetworkSettings.Networks \"redis-net\").IPAddress }}' redis-$i ; \\\n#done\n# 172.26.0.2, 172.26.0.3, 172.26.0.4, 172.26.0.5, 172.26.0.6, 172.26.0.7\n\n# build cluster node:port items list\nexport nodes=$(for i in `seq 1 6`; do \\\n  echo -n \"$(docker inspect -f '{{ (index .NetworkSettings.Networks \"redis-net\").IPAddress }}' redis-$i):6379 \" ; done)\n\n# initialize redis cluster\necho 'yes' | docker exec -i redis-1 ash -c \"\\\n  redis-cli --cluster create $nodes --cluster-replicas 1\"\n\n# connect with additional flag: '-c'\ndocker exec -it redis-4 redis-cli -c\n\n# we can created keys and we will be redirected to proper node if needed\n127.0.0.1:6379\u003e set key-2 trololo\n-\u003e Redirected to slot [12422] located at 192.168.240.4:6379\nOK\n192.168.240.4:6379\u003e set key-1 ololo\n-\u003e Redirected to slot [229] located at 192.168.240.2:6379\nOK\n\n# we can get key-1 or key-2 separately\n192.168.240.2:6379\u003e get key-1\n\"ololo\"\n192.168.240.2:6379\u003e get key-2\n-\u003e Redirected to slot [12422] located at 192.168.240.4:6379\n\"troololo\"\n\n# but we cannot use mget for sharded data\n192.168.240.4:6379\u003e mget key-1 key-2\n(error) CROSSSLOT Keys in request don't hash to the same slot\n# so redis dose not serve cross slot data\n# so spring data can help here us with that!\n# spring-data can connect to all redis nodes to collect all info... \n```\n\n::: tip \nDont not create `nodes.conf` file.\nWe don’t need to do anything except adding this line.\n:::\n\n## prepare redis-cli command alias fot using docker\n\n```bash\nfunction redis-cli { bash -c \"docker exec -it redis ash -c 'redis-cli $1'\"; }\n```\n\n## basics\n\n### show keys `keys`\n\n```bash\nredis-cli 'keys *'\n# (empty list or set)\n```\n\n### set value `set`\n\n```bash\nredis-cli redis-cli 'set message hi'\n# OK\n```\n\n### get value `get`\n\n```bash\nredis-cli 'get message'\n# \"hi\"\nredis-cli 'keys *'\n# 1) \"message\"\n```\n\n### delete data `del`\n\n```bash\nredis-cli 'del message'\n# (integer) 1\n```\n\n### delete all data `flushall`\n\n```bash\nredis-cli redis-cli 'set k1 v1'\nredis-cli redis-cli 'set k2 v2'\n \nredis-cli 'keys *'\n# 1) \"k2\"\n# 2) \"k1\"\nredis-cli 'flushall'\n# OK\nredis-cli 'keys \\*' # escaping star... in real terminal, command should be: redis-cli keys *\n# (empty list or set)\n```\n\n### set value with expire of the key `setex`\n\n```bash\nredis-cli 'setex temporal 60 this-value-will-exire-after-60-secons'\n# OK\nredis-cli 'ttl temporal'\n# (integer) 58\nsleep 6s ; redis-cli 'get temporal'\n# \"this-value-will-exire-after-60-secons\"\nsleep 60s ; redis-cli 'get temporal'\n# (nil)\nredis-cli 'ttl temporal'\n# (integer) -2\n```\n\n_NOTE: if you wanna set expire in millis, use `psetex` command instead:_\n\n```bash\nredis-cli 'psetex key milliseconds value'\n```\n\n### set value if key is not available with `setnx`\n\n```bash\nredis-cli 'get new-key'\n# (nil)\nredis-cli 'setnx new-key a-value'\n# (integer) 1\nredis-cli 'get new-key'\n# \"a-value\"\nredis-cli 'setnx new-key this-value-wont-be-present'\n# (integer) 0\nredis-cli 'get new-key'\n# \"a-value\"\n```\n\n### get value size with `strlen` command\n\n```bash\nredis-cli 'set ololo trololo'\n# OK\nredis-cli 'strlen ololo'\n# (integer) 7\n```\n\n### setting multiple key-values\n\n```bash\nredis-cli 'flushall'\n# OK\nredis-cli 'mset k1 v1 k2 v2 k3 v3'\n# OK\nredis-cli 'keys \\*'\n# 1) \"k3\"\n# 2) \"k2\"\n# 3) \"k1\"\n```\n \n_NOTE:  command `ttl` stands for `time to live`_\n\n### increment with `incr` and decrement with `decr`  commands\n\n```bash\nredis-cli 'set salary 4444'\n# OK\nredis-cli 'decr salary'\n# (integer) 4443\nredis-cli 'incr salary'\n# (integer) 4444\nredis-cli 'incr salary'\n# (integer) 4445\n```\n\n### customize previous flow with `incrby` / `decrby`\n\n```bash\nredis-cli 'set salary 1000'\n# OK\nredis-cli 'decrby salary 5'\n# (integer) 995\nredis-cli 'incrby salary 500'\n# (integer) 1495\nredis-cli 'incrby salary 100500'\n# (integer) 101995\n```\n\n### append\n\n```bash\nredis-cli 'set message hello'\n# OK\nredis-cli 'append message -world!'\n# (integer) 12\nredis-cli 'get message'\n# \"hello-world!\"\n```\n\n![Strings](./feature-strings.png)\n\n## hashes\n\nWhy? Limitations for strings (key-value pairs) are about 512 Mb.\nBut in case of hashes (field-value pairs) limits up to 4 billions field-value pairs\n\n### set key field-value pair with `hmset`\n\n```bash\nredis-cli 'hmset person username maksimko password very-secret'\n# OK\nredis-cli 'hget person password'\n# \"very-secret\"\nredis-cli 'hmget person password'\n# 1) \"very-secret\"\nredis-cli 'hgetall person'\n# 1) \"username\"\n# 2) \"maksimko\"\n# 3) \"password\"\n# 4) \"very-secret\"\n```\n\n### `hexists`\n\n```bash\nredis-cli 'hexists person age'\n# (integer) 0\nredis-cli 'hexists person username'\n# (integer) 1\n```\n\n_age dose not exists in person object_\n\n### `hdel`\n\n```bash\nredis-cli 'hdel person password'\n# (integer) 1\nredis-cli 'hgetall person'\n# 1) \"username\"\n# 2) \"maksimko\"\n```\n\n### `hsetnx`\n\nset field value if it's does not exists\n\n```bash\nredis-cli 'hsetnx person age 18' # will set new field\n# (integer) 1\nredis-cli 'hsetnx person age 19' # will ignore because age field already exists\n# (integer) 0\n```\n\n### `hkeys`\n\n```bash\nredis-cli 'hkeys person'\n# 1) \"username\"\n# 2) \"age\"\n```\n\n_NOTE: returns only key fields of object_\n\n### `hincrby` similar to strings\n\n```bash\nredis-cli 'hincrby person age 1'\n# (integer) 19\nredis-cli 'hincrby person age 5'\n# (integer) 24\n```\n\n### others\n\n```bash\nredis-cli 'hstrlen person username'\n# (integer) 8\nredis-cli  'hvals person'\n# 1) \"maksimko\"\n# 2) \"24\"\nredis-cli 'hlen person' # number of fields in object hash\n# (integer) 2\nredis-cli 'hmget person username age'\n# 1) \"maksimko\"\n# 2) \"24\"\n```\n\n![Hashes](./feature-hashes.png)\n\n## list\n\nstrings sorted in a some order\n\n```bash\nhead \u003c--\u003e value1 \u003c--\u003e value2 \u003c--\u003e ... \u003c--\u003e valueN \u003c--\u003e tail\n```\n\n### debug redis-cli\n\n```bash\nredis-cli 'monitor'\n```\n\n### and do playground in a parallel terminal...\n\n```bash\n# create: my-list = List(3 2 1 0)\nredis-cli 'lpush my-list 0 1 2 3'\n\n# show first 10 elements of my-list moving from left to right\nredis-cli 'lrange my-list 0 10'\n\n# add 4 and 5 from left: List(5 4 3 2 1)\nredis-cli 'lpush my-list 4 5'\n\n# take out 1st left element (\"5\") from list: List(4 3 2 1)\nredis-cli 'lpop my-list'\n\n# update to palindrome: List(4 3 2 1 0 1 2 3 4)\nredis-cli 'rpush my-list 0 1 2 3 4'\n\n# show list items from 0th index till 10th index\nredis-cli 'lrange my-list 0 10'\n\n# show el of index 3 (4th element moving from left to right): \"1\"\nredis-cli 'lindex my-list 3'\n\n# set el in a middle to \"X\": List(4 3 2 1 X 1 2 3 4) \nredis-cli 'lset my-list 4 X'\n\n# show whole list (from begin: 0, to last: -1)\nredis-cli 'lrange my-list 0 -1'\n\n# this will be not push because list does not exists \nredis-cli 'lpushx skip this one - it does not exists'\n\n# but this will push both elements: List(6 5 4 3 2 1 X 1 2 3 4 5 6)\nredis-cli 'lpushx my-list 5 6'\nredis-cli 'rpushx my-list 5 6'\n\n# insert XX to make XXX in a middle\nredis-cli 'linsert my-list after X X' #  List(6 5 4 3 2 1 X X 1 2 3 4 5 6)\nredis-cli 'linsert my-list before X X' # List(6 5 4 3 2 1 X X X 1 2 3 4 5 6)\n```\n\n![Lists](./feature-lists.png)\n\n## sets\n\n```bash\n# create: my-set = Set(one two three)\nredis-cli 'sadd my-set one two three'\n\n# view\nredis-cli 'smembers my-set'\n# 1) \"two\"\n# 2) \"one\"\n# 3) \"three\"\n\nredis-cli 'sadd my-other-set two three four'\nredis-cli 'sdiff my-set my-other-set'\n# 1) \"one\"\nredis-cli 'sdiff my-other-set my-set'\n# 1) \"four\"\n\nredis-cli 'sunion my-other-set my-set'\n# 1) \"two\"\n# 2) \"one\"\n# 3) \"three\"\n# 4) \"four\"\n\nredis-cli 'sunionstore result-set my-other-set my-set'\nredis-cli 'smembers result-set'\n# 1) \"two\"\n# 2) \"one\"\n# 3) \"three\"\n# 4) \"four\"\n\nredis-cli 'srem result-set four'\nredis-cli 'smembers result-set'\n# 1) \"two\"\n# 2) \"one\"\n# 3) \"three\"\n\n# remove last value from result-set\nredis-cli 'spop result-set'\n# 3) \"three\"\n\nredis-cli 'sadd result-set ololo trololo hohoho'\n# remove random 2 values from result-set\nredis-cli 'spop result-set 2'\n# 1) \"ololo\"\n# 2) \"two\"\nredis-cli 'smembers result-set'\n# 1) \"one\"\n# 2) \"hohoho\"\n# 3) \"trololo\"\n```\n\nalso see: `sinter` - intersection and `smove` - move value from some set to another...\n\n![Sets](./feature-sets.png)\n\n## transactions\n\n![Multi](./feature-multi.png)\n\nokay, enough...\n\n## cleanup\n\n```bash\ndocker rm -f -v redis\n```\n\n## build VuePress documentation\n\n```bash\nnpm i ; npm run build\n```\n\n## resources\n\n- [YouTube: Next Level Redis with Spring](https://www.youtube.com/watch?v=VvK-uLWDHFo)\n- [Redis cluster](https://medium.com/commencis/creating-redis-cluster-using-docker-67f65545796d)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaggerok%2Fredis-getting-started","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdaggerok%2Fredis-getting-started","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaggerok%2Fredis-getting-started/lists"}