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