---
# System prepended metadata

title: Data structures

---

# Data structures
```bash
APPEND key value                  # append a value to a key
BITCOUNT key [start end]          # count set bits in a string
SET key value                     # set value in key
SETNX key value                   # set if not exist value in key
SETRANGE key offset value         # overwrite part of a string at key starting at the specified offset
STRLEN key                        # get the length of the value stored in a key
GET key                           # get value in key
GETRANGE key value                # get a substring value of a key and return its old value
INCR key                          # increment value in key
INCRBY key increment              # increment the integer value of a key by the given amount
INCRBYFLOAT key increment         # increment the float value of a key by the given amount
DECR key                          # decrement the integer value of key by one
DECRBY key decrement              # decrement the integer value of a key by the given number
DEL key                           # delete key

EXPIRE key 120                    # key will be deleted in 120 seconds
TTL key                           # returns the number of seconds until a key is deleted

# Multi key operations
MSET key value [key value ...]    # set multiple keys to multiple values
MSETNX key value [key value ...]  # set multiple keys to multiple values, only if none of the keys exist
MGET key [key ...]                # get the values of all the given keys

# Bit Operation on Strings(bitmap)
SETBIT key index value
GETBIT key index
BITOP operation destKey key [key...] # Perform a bitwise operation between multiple keys (containing string values) and store the result in the destination key.
BITCOUNT key [start end] # Count the number of set bits (population counting) in a string.
BITPOS key bit [start] end # Return the position of the first bit set to 1 or 0 in a string.


# Lists.
# A list is a series of ordered values.


RPUSH key value [value ...]           # put the new value at the end of the list
RPUSHX key value                      # append a value to a list, only if the exists
LPUSH key value [value ...]           # put the new value at the start of the list
LRANGE key start stop                 # give a subset of the list
LINDEX key index                      # get an element from a list by its index
LINSERT key BEFORE|AFTER pivot value  # insert an element before or after another element in a list
LLEN key                              # return the current length of the list
LPOP key                              # remove the first element from the list and returns it
LSET key index value                  # set the value of an element in a list by its index
LTRIM key start stop                  # trim a list to the specified range
RPOP key                              # remove the last element from the list and returns it
RPOPLPUSH source destination          # remove the last element in a list, prepend it to another list and return it
BLPOP key [key ...] timeout           # remove and get the first element in a list, or block until one is available
BRPOP key [key ...] timeout           # remove and get the last element in a list, or block until one is available


# Sets.
# A set is similar to a list, except it does not have a specific order and each element may only appear once. 


SADD key member [member ...]     # add the given value to the set
SCARD key                        # get the number of members in a set
SREM key member [member ...]     # remove the given value from the set
SISMEMBER myset value            # test if the given value is in the set.
SMEMBERS myset                   # return a list of all the members of this set
SUNION key [key ...]             # combine two or more sets and returns the list of all elements
SINTER key [key ...]             # intersect multiple sets
SMOVE source destination member  # move a member from one set to another
SPOP key [count]                 # remove and return one or multiple random members from a set


# Sorted Sets
# A sorted set is similar to a regular set, but now each value has an associated score.
# This score is used to sort the elements in the set.


ZADD key [NX|XX] [CH] [INCR] score member [score member ...]  # add one or more members to a sorted set, or update its score if it already exists

ZCARD key                           # get the number of members in a sorted set
ZCOUNT key min max                  # count the members in a sorted set with scores within the given values
ZINCRBY key increment member        # increment the score of a member in a sorted set
ZRANGE key start stop [WITHSCORES]  # returns a subset of the sorted set
ZRANK key member                    # determine the index of a member in a sorted set
ZREM key member [member ...]        # remove one or more members from a sorted set
ZREMRANGEBYRANK key start stop      # remove all members in a sorted set within the given indexes
ZREMRANGEBYSCORE key min max        # remove all members in a sorted set, by index, with scores ordered from high to low
ZSCORE key member                   # get the score associated with the given mmeber in a sorted set

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]  # return a range of members in a sorted set, by score


# Hashes
# Hashes are maps between string fields and string values, so they are the perfect data type to represent objects.


HGET key field          # get the value of a hash field
HGETALL key             # get all the fields and values in a hash
HSET key field value    # set the string value of a hash field
HSETNX key field value  # set the string value of a hash field, only if the field does not exists

HINCRBY key field increment  # increment value in hash by X
HDEL key field [field ...]   # delete one or more hash fields
HEXISTS key field            # determine if a hash field exists
HKEYS key                    # get all the fields in a hash
HLEN key                     # get all the fields in a hash
HSTRLEN key field            # get the length of the value of a hash field
HVALS key                    # get all the values in a hash

# Multi key operations
HMGET key field [field ...] # Returns the values associated with the specified fields in the hash stored at key.
HMSET key field value [field value ...]  # set multiple fields at once

# HyperLogLog
# HyperLogLog uses randomization in order to provide an approximation of the number of unique elements in a set using just a constant, and small, amount of memory


PFADD key element [element ...]  # add the specified elements to the specified HyperLogLog
PFCOUNT key [key ...]            # return the approximated cardinality of the set(s) observed by the HyperLogLog at key's)

PFMERGE destkey sourcekey [sourcekey ...]  # merge N HyperLogLogs into a single one
```

# Publication & Subscription
```bash

PSUBSCRIBE pattern [pattern ...]             # listen for messages published to channels matching the given patterns
PUBSUB subcommand [argument [argument ...]]  # inspect the state of the Pub/Sub subsystem
PUBLISH channel message                      # post a message to a channel
PUNSUBSCRIBE [pattern [pattern ...]]         # stop listening for messages posted to channels matching the given patterns
SUBSCRIBE channel [channel ...]              # listen for messages published to the given channels
UNSUBSCRIBE [channel [channel ...]]          # stop listening for messages posted to the given channels
```

# Transaction

```bash
WATCH key [key ...] # Marks the given keys to be watched for conditional execution of a transaction.
MULTI
# DISCARD
EXEC
```

# Server Side Script
```bash
SCRIPT LOAD
EVALSHA
EVAL
```

# Eviction
maxmemory
maxmemory-policy
maxmemory-samples

# persistence

## enable AOF
CONFIG SET appendonly yes
## snapshot
BGSAVE
CONFIG SET save '3 3'

## check its inode number
watch ls -ial dump.rdb

# replication
```bash
SYNC # deprecated
# Use `info replication` to find out master's replication id and offset
PSYNC [replication id] offset
```

# High Availability

## Chain replication
```bash
start 0
start 1 redis-server --replicaof "$(ip 0)" 6379
start 2 redis-server --replicaof "$(ip 1)" 6379
```