redis 常用操作

93 阅读3分钟

redis

  • Redis is the world’s fastest in-memory database for caching, vector search, and NoSQL applications.
  • redis.io/

command

# ping
redis-cli -h 127.0.0.1 -p 6379 PING
redis-cli --no-auth-warning -h 127.0.0.1 -p 6379 -a redis#123456 -n 1 PING
export REDISCLI_AUTH=redis#123 && redis-cli -h 127.0.0.1 -p 6379 PING

# TLS redis://user:password@host:port/dbnum
redis-cli -u redis://user:passwd@127.0.0.1:16379/0 PING

# status
# -r repeat -i delay one second
redis-cli -r 8 -i 1 info | grep rss_human
redis-cli -n 0 dbsize
redis-cli --stat -i 1
redis-cli --no-auth-warning -h 127.0.0.1 -p 6379 --stat
# --bigkeys scan key, byte(string) count(list,set,zset,hash)
# 元素个数少,不一定 value 不大;元素个数多,也不一定 value 就大
redis-cli --bigkeys
redis-cli memory usage mylist
redis-cli llen mylist
redis-cli strlen mystring
redis-cli hlen myhash
redis-cli scard myset
redis-cli type mystr
redis-cli --latency-history
redis-cli --intrinsic-latency 5
redis-cli monitor
redis-cli --replica

# scan
redis-cli -n 2 --scan | head -10
redis-cli -n 2 --scan --pattern '*user*' | wc -l

# string
redis-cli set mystr abcdef
redis-cli get mystr
redis-cli getrange mystr 0 2
redis-cli strlen mystr
redis-cli del mystr

redis-cli mset a "1" b "2" c "3" d "4"
redis-cli mget a b c
redis-cli del a b c

redis-cli set myincr 0
redis-cli incr myincr
redis-cli incrby myincr 10
redis-cli get myincr
redis-cli --raw incr mycount
redis-cli --no-raw incr mycount

echo "a text for redis" > text
redis-cli -x set mytext < text
redis-cli get mytext

echo -e "set item 100\n incr item\n get item" > data
cat data | redis-cli

# list
redis-cli lpush mylist apple
redis-cli lpop mylist
redis-cli lpush mylist apple orange banana grape pear
redis-cli llen mylist
redis-cli lrange mylist 0 -1
redis-cli --csv lrange mylist 0 -1
redis-cli lrange mylist 0 2

# set
redis-cli sadd myset grape watermelon pineapple strawberry
redis-cli sismember myset grape
redis-cli smembers myset
 redis-cli srandmember myset 1
redis-cli scard myset
redis-cli spop myset
redis-cli sadd myset1 apple watermelon pineapple strawberry
redis-cli sdiff myset myset1
redis-cli sunion myset myset1

# hash
redis-cli hlen myhash
redis-cli hget myhash fruit
redis-cli hget myhash price
redis-cli hincrby myhash price 10
redis-cli hmget myhash fruit price
redis-cli hdel myhash price
redis-cli hgetall myhash

redis-UI

# redisinsight
docker run -d --name redis_insight -p 5540:5540 m.daocloud.io/redis/redisinsight:latest -v /tmp/redis/insight:/data

FAQ

  • reids Error: Connection reset by peer

    sed -i 's/bind 127.0.0.1/bind 192.168.1.9/g' redis.conf
    sed -i 's/bind 127.0.0.1/bind 0.0.0.0/g' redis.conf
    
  • bigkeys

    redis-cli --bigkeys
    
    # 第三方工具 所有 > 10kb 的 key 输出到一个 csv 文件
    git clone https://github.com/sripathikrishnan/redis-rdb-tools
    cd redis-rdb-tools sudo && python setup.py install
    rdb dump.rdb -c memory --bytes 10240 -f live_redis.csv
    
    • bigkeys 阻塞

    • 客户端超时阻塞:由于 Redis 执行命令是单线程处理,操作 bigkey 会比较耗时会阻塞,从客户端看很久很久都没有响应

    • 网络阻塞:每次获取大 key 产生的网络流量较大,如果一个 key 的大小是 1 MB,每秒访问量为 1000,每秒产生 1000MB 的流量,这对于普通千兆网卡的服务器来说是灾难性的

    • 工作线程阻塞:如果使用 del 删除大 key 时,会阻塞工作线程,这样就没办法处理后续的命令

    • 处理 bigkey

    • 分割 bigkey:将一个 bigkey 分割为多个小 key。例如,将一个含有上万字段数量的 Hash 按照一定策略(比如二次哈希)拆分为多个 Hash

    • 手动清理:Redis 4.0+ 可以使用 UNLINK 命令来异步删除一个或多个指定的 key。Redis 4.0 以下可以考虑使用 SCAN 命令结合 DEL 命令来分批次删除

    • 采用合适的数据结构:例如,文件二进制数据不使用 String 保存、使用 HyperLogLog 统计页面 UV、Bitmap 保存状态信息(0/1)

    • 开启 lazy-free(惰性删除 / 延迟释放) :lazy-free 特性是 Redis 4.0 开始引入的,指的是让 Redis 采用异步方式延迟释放 key 使用的内存,将该操作交给单独的子线程处理,避免阻塞主线程

install

#!/bin/bash
# date: 2024/11/13

install() {
    # https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-from-source/
    mkdir /opt/soft &>/dev/null
    cd /opt/soft
    wget http://download.redis.io/releases/redis-5.0.7.tar.gz
    tar -zvxf redis-5.0.7.tar.gz
    cd /opt/soft/redis-5.0.7
    make
    # To install these binaries in /usr/local/bin
    make install
    redis-server redis.conf

    redis-cli ping

    # sed -i 's/daemonize no/daemonize yes/g' redis.conf
    # sed -i 's/# requirepass foobared/requirepass redis#123/g' redis.conf
    # sed -i 's/bind 127.0.0.1/bind 0.0.0.0/g' redis.conf
    # redis-server redis.conf
}

docker() {
    docker rm -f redis_6379
    docker run --name=redis_6379 \
        --restart=always \
        --log-opt max-size=100m \
        --log-opt max-file=10 \
        -p 6379:6379 \
        -v /tmp/redis/data:/tmp/redis/data \
        -v /tmp/redis/plugin:/tmp/redis/plugin \
        -v /opt/soft/redis-5.0.7/redis.conf:/tmp/redis/redis.conf \
        -d m.daocloud.io/redis:5.0.8 \
        redis-server /tmp/redis/redis.conf
}

case $1 in
install)
    install
    ;;
docker)
    docker
    ;;
*)
    echo "$0 install|docker"
    ;;
esac