# cd /usr/local/src/ # wget https://download.redis.io/releases/redis-6.2.1.tar.gz # tar -zxvf redis-6.2.1.tar.gz # cd redis-6.2.1 # make -j 4 && make -j 4 install
验证安装:
1 2
# redis-server -v Redis server v=6.2.1 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=6561781fbc748ebe
其他服务器可以直接拷贝redis命令进行安装:
1 2
# ls /usr/local/bin/redis-* /usr/local/bin/redis-benchmark /usr/local/bin/redis-check-aof /usr/local/bin/redis-check-rdb /usr/local/bin/redis-cli /usr/local/bin/redis-sentinel /usr/local/bin/redis-server
# cat /data/redis/redis.log 18480:C 16 Dec 2023 21:10:51.127 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 18480:C 16 Dec 2023 21:10:51.127 # Redis version=6.2.1, bits=64, commit=00000000, modified=0, pid=18480, just started 18480:C 16 Dec 2023 21:10:51.127 # Configuration loaded 18480:M 16 Dec 2023 21:10:51.128 * Increased maximum number of open files to 10032 (it was originally set to 1024). 18480:M 16 Dec 2023 21:10:51.128 * monotonic clock: POSIX clock_gettime 18480:M 16 Dec 2023 21:10:51.128 * Running mode=standalone, port=6379. 18480:M 16 Dec 2023 21:10:51.128 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 18480:M 16 Dec 2023 21:10:51.128 # Server initialized 18480:M 16 Dec 2023 21:10:51.128 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 18480:M 16 Dec 2023 21:10:51.128 * Ready to accept connections
修改最大文件打开数:
1 2 3
# vim /etc/security/limits.conf # 尾行,添加配置 * - nofile 102400
# systemctl restart redis # cat /data/redis/redis.log 18480:signal-handler (1702732346) Received SIGTERM scheduling shutdown... 18480:M 16 Dec 2023 21:12:26.562 # User requested shutdown... 18480:M 16 Dec 2023 21:12:26.562 * Saving the final RDB snapshot before exiting. 18480:M 16 Dec 2023 21:12:26.563 * DB saved on disk 18480:M 16 Dec 2023 21:12:26.563 * Removing the pid file. 18480:M 16 Dec 2023 21:12:26.563 # Redis is now ready to exit, bye bye... 20400:C 16 Dec 2023 21:12:26.566 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 20400:C 16 Dec 2023 21:12:26.566 # Redis version=6.2.1, bits=64, commit=00000000, modified=0, pid=20400, just started 20400:C 16 Dec 2023 21:12:26.566 # Configuration loaded 20400:M 16 Dec 2023 21:12:26.567 * Increased maximum number of open files to 10032 (it was originally set to 1024). 20400:M 16 Dec 2023 21:12:26.567 * monotonic clock: POSIX clock_gettime 20400:M 16 Dec 2023 21:12:26.567 * Running mode=standalone, port=6379. 20400:M 16 Dec 2023 21:12:26.567 # Server initialized 20400:M 16 Dec 2023 21:12:26.567 * Loading RDB produced by version 6.2.1 20400:M 16 Dec 2023 21:12:26.567 * RDB age 0 seconds 20400:M 16 Dec 2023 21:12:26.567 * RDB memory usage when created 0.77 Mb 20400:M 16 Dec 2023 21:12:26.567 * DB loaded from disk: 0.000 seconds 20400:M 16 Dec 2023 21:12:26.567 * Ready to accept connections
redis字符串类型基本操作
node1
redis-cli登陆redis:
1
# redis-cli
-h:指定ip。
-p:指定端口。
-a:认证。
密码认证:
1 2
127.0.0.1:6379> auth 123456 OK
查看信息:
1
127.0.0.1:6379> info
字符串操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
127.0.0.1:6379> set name student OK
127.0.0.1:6379> get name "student"
127.0.0.1:6379> set name teacher OK
127.0.0.1:6379> get name "teacher"
127.0.0.1:6379> del name (integer) 1
127.0.0.1:6379> get name (nil)
退出redis:
1
127.0.0.1:6379> quit
命令区不分大小写,key-value区分大小写。
非交互式操作redis,将warnning报错重定向:
1 2 3 4 5 6 7
# redis-cli -a 123456 info # redis-cli -a 123456 set name classmate 2> /dev/null OK # redis-cli -a 123456 get name 2> /dev/null "classmate" # redis-cli -a 123456 del name 2> /dev/null (integer) 1
shell批量写入数据:
1 2 3 4
# for i in $(seq -w 10);do redis-cli -a 123456 set name${i} student${i} redis-cli -a 123456 get name${i} done 2> /dev/null
r = redis.Redis(host='127.0.0.1', port=6379, password='123456', db=0) result = r.scan(0) print(result) while result[0] != 0: result = r.scan(result[0]) print(result) time.sleep(0.2)
# for line in $(seq -w 1000); do redis-cli -a 123456 set name_${line} aof_redis_${line} done 2> /dev/null # ll -h /data/redis/appendonly.aof -rw-r--r-- 1 root root 72K Dec 16 23:17 /data/redis/appendonly.aof
手动重写aof减少aof文件大小:
1 2 3 4 5 6
# redis-cli -a 123456
127.0.0.1:6379> bgrewriteaof Background append only file rewriting started
127.0.0.1:6379> set name xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx OK
127.0.0.1:6379> lpush names keynum (integer) 1
127.0.0.1:6379> lpush names keynum (integer) 2
127.0.0.1:6379> lpush names keynum (integer) 3
127.0.0.1:6379> lpush names keynum (integer) 4
127.0.0.1:6379> lpush names keynum (integer) 5
127.0.0.1:6379> lpush names keynum (integer) 6
127.0.0.1:6379> lpush names keynum (integer) 7
127.0.0.1:6379> lpush names keynum (integer) 8
127.0.0.1:6379> lpush names keynum (integer) 9
127.0.0.1:6379> lpush names keynum (integer) 10
127.0.0.1:6379> lpush names keynum (integer) 11
127.0.0.1:6379> lpush names keynum (integer) 12
127.0.0.1:6379> lpush names keynum (integer) 13
127.0.0.1:6379> lpush names keynum (integer) 14
127.0.0.1:6379> lpush names keynum (integer) 15
127.0.0.1:6379> lpush names keynum (integer) 16
127.0.0.1:6379> llen names (integer) 16
新建终端,登录monitor:
1
# redis-cli -a 123456 monitor
返回旧终端,查看大key:
1 2 3
127.0.0.1:6379> quit
# redis-cli -a 123456 --bigkeys
查看数据大小,删除mylist,减少redis内存使用:
1 2 3
# redis-cli -a 123456 type mylist # redis-cli -a 123456 llen mylist # redis-cli -a 123456 del mylist
# vim /data/redis6380/redis.conf # 3行,修改配置 port 6380 # 20行,修改配置 dir "/data/redis6380" # 72行,删除配置 masterauth "123456" # 倒数3行,删除配置 user default on sanitize-payload #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~* &* +@all
# redis-cli -a 123456 info replication Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:master connected_slaves:0 master_failover_state:no-failover master_replid:97553861535158f556163c7c618c2556361d6e36 master_replid2:a41e1695c95a3a30f582880a8a42540b73bd8977 master_repl_offset:8964 second_repl_offset:6702 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:547 repl_backlog_histlen:8418
# systemctl start redis # redis-cli -a 123456 info replication Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:slave master_host:10.80.10.2 master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:12627 slave_priority:100 slave_read_only:1 connected_slaves:0 master_failover_state:no-failover master_replid:97553861535158f556163c7c618c2556361d6e36 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:12627 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:12325 repl_backlog_histlen:303
# redis-cli -a studentpassword --cluster create 10.80.10.1:7000 10.80.10.2:7001 10.80.10.3:7002 yes # redis-cli -a studentpassword -p 7000 cluster info Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. cluster_state:fail cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:3 cluster_size:3 cluster_current_epoch:3 cluster_my_epoch:1 cluster_stats_messages_ping_sent:6 cluster_stats_messages_pong_sent:9 cluster_stats_messages_sent:15 cluster_stats_messages_ping_received:7 cluster_stats_messages_pong_received:6 cluster_stats_messages_meet_received:2 cluster_stats_messages_received:15
查看节点状态:
1 2 3 4 5
# redis-cli -a studentpassword -p 7000 cluster nodes Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. c35f61612453dd267f7d7519e3badcac70e87b8b 10.80.10.3:7002@17002 master - 0 1702742249749 3 connected 10923-16383 13bc03bced79aebb410df9aa291402d60b0f8811 10.80.10.2:7001@17001 master - 0 1702742250752 2 connected 5461-10922 c85afaff1dfbca5287a25eec868c58042826c2a8 10.80.10.1:7000@17000 myself,master - 0 1702742250000 1 connected 0-5460
一共16384个插槽。
登录继续需要添加-c参数:
1 2 3 4 5 6 7
# redis-cli -p 7000 -a studentpassword -c
127.0.0.1:7000> set name teacher -> Redirected to slot [5798] located at 10.80.10.2:7001 OK
10.80.10.2:7001> exit
node2
10.80.10.2:7001有数据产生:
1 2 3 4
# redis-cli -a studentpassword -p 7001 info keyspace Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Keyspace db0:keys=1,expires=0,avg_ttl=0
node1
批量写入数据:
1 2 3
# for line in $(seq -w 1000); do redis-cli -a studentpassword -p 7000 -c set name_${line} teacher_${line} done 2> /dev/null
node1、node2、node3
查看数据分布:
1 2 3 4 5 6
# node1 # redis-cli -a studentpassword -p 7000 info keyspace # node2 # redis-cli -a studentpassword -p 7001 info keyspace # node3 # redis-cli -a studentpassword -p 7002 info keyspace
node1
获取数据:
1 2 3
# for line in $(seq -w 1000); do redis-cli -a studentpassword -p 7000 -c get name_${line} done 2> /dev/null
redis分片集群高可用性
node1
配置8000:
1 2
# cp /data/cluster/7000/redis.conf /data/cluster/8000/redis.conf # sed -i 's/7000/8000/g' /data/cluster/8000/redis.conf
node2
配置8001:
1 2
# cp /data/cluster/7001/redis.conf /data/cluster/8001/redis.conf # sed -i 's/7001/8001/g' /data/cluster/8001/redis.conf
node3
配置8002:
1 2
# cp /data/cluster/7002/redis.conf /data/cluster/8002/redis.conf # sed -i 's/7002/8002/g' /data/cluster/8002/redis.conf
node1、node2、node3
启动redis:
1 2 3 4 5 6 7 8 9
# node1 # redis-server /data/cluster/8000/redis.conf # redis-cli -a studentpassword -p 8000 info # node2 # redis-server /data/cluster/8001/redis.conf # redis-cli -a studentpassword -p 8001 info # node3 # redis-server /data/cluster/8002/redis.conf # redis-cli -a studentpassword -p 8002 info
node1
获取集群状态:
1 2 3 4 5
# redis-cli -a studentpassword -p 7000 cluster nodes Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. c35f61612453dd267f7d7519e3badcac70e87b8b 10.80.10.3:7002@17002 master - 0 1702742472456 3 connected 10923-16383 13bc03bced79aebb410df9aa291402d60b0f8811 10.80.10.2:7001@17001 master - 0 1702742473460 2 connected 5461-10922 c85afaff1dfbca5287a25eec868c58042826c2a8 10.80.10.1:7000@17000 myself,master - 0 1702742473000 1 connected 0-5460
# redis-cli -a studentpassword -p 7000 cluster nodes Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. a4341e2782b688779c8b0ac6ccb883e887b633e8 10.80.10.2:8001@18001 slave c85afaff1dfbca5287a25eec868c58042826c2a8 0 1702742958915 1 connected 88d8ad9d3e32d13d335e3eb68d5a4b6635476ef0 10.80.10.3:8002@18002 slave 13bc03bced79aebb410df9aa291402d60b0f8811 0 1702742957912 2 connected 13bc03bced79aebb410df9aa291402d60b0f8811 10.80.10.2:7001@17001 master - 0 1702742958000 2 connected 5461-10922 c35f61612453dd267f7d7519e3badcac70e87b8b 10.80.10.3:7002@17002 master - 0 1702742956910 3 connected 10923-16383 91c8c4aad68d0b70d8d17750dca755a7f29b8673 10.80.10.1:8000@18000 slave c35f61612453dd267f7d7519e3badcac70e87b8b 0 1702742956000 3 connected c85afaff1dfbca5287a25eec868c58042826c2a8 10.80.10.1:7000@17000 myself,master - 0 1702742955000 1 connected 0-5460
node1、node2、node3
查看节点数据,已经同步过去了:
1 2 3 4 5 6
# node1 # redis-cli -a studentpassword -p 8000 info keyspace # node2 # redis-cli -a studentpassword -p 8001 info keyspace # node3 # redis-cli -a studentpassword -p 8002 info keyspace
node1
获取数据正常:
1 2 3
# for line in $(seq -w 1000); do redis-cli -a studentpassword -p 7000 -c get name_${line} done 2> /dev/null
node2
主库有问题时从库会自动切换为主库:
1
# redis-cli -a studentpassword -p 7001
node3
8002变为主库,需要等待一段时间:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# redis-cli -a studentpassword -p 8002 info replication Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:master connected_slaves:0 master_failover_state:no-failover master_replid:7a63c0d592537fb316f20c9385a0b41c3f2bf299 master_replid2:6d6ab082dc462eafbfc087c71a41690badb66666 master_repl_offset:252 second_repl_offset:253 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:252
node1
获取数据正常:
1 2 3
# for line in $(seq -w 1000); do redis-cli -a studentpassword -p 7000 -c get name_${line} done 2> /dev/null
写入数据正常:
1
# for line in $(seq -w 1000); do redis-cli -a studentpassword -p 7000 -c set name_${line} teacher_${line}; done 2> /dev/null
# redis-server /data/cluster/7001/redis.conf # redis-cli -a studentpassword -p 7001 info replication Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:slave master_host:10.80.10.3 master_port:8002 master_link_status:up master_last_io_seconds_ago:2 master_sync_in_progress:0 slave_repl_offset:15799 slave_priority:100 slave_read_only:1 connected_slaves:0 master_failover_state:no-failover master_replid:7a63c0d592537fb316f20c9385a0b41c3f2bf299 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:15799 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:15786 repl_backlog_histlen:14
从库手动提升为主库的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
# redis-cli -a studentpassword -p 7001 cluster failover Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. OK # redis-cli -a studentpassword -p 7001 info replication Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:master connected_slaves:1 slave0:ip=10.80.10.3,port=8002,state=online,offset=15813,lag=1 master_failover_state:no-failover master_replid:dde4d3d7ffdde2ca1f6f6c5880a6f66fc9bf8c53 master_replid2:7a63c0d592537fb316f20c9385a0b41c3f2bf299 master_repl_offset:15813 second_repl_offset:15814 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:15786 repl_backlog_histlen:28
redis集群移除从库,主库ip端口+从库id,暂不移除:
1
redis-cli -a sjgpwd --cluster del-node xxx:xxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# vim test.py from rediscluster import RedisCluster
nodes=[{"host":"10.80.10.1","port":7000}, {"host":"10.80.10.2","port":7001}, {"host":"10.80.10.3","port":7002} ] rc = RedisCluster(startup_nodes=nodes,password='studentpassword') for i in range(15): result=rc.set('studentkey{0}'.format(i),'studentclustervalue{0}'.format(i)) result=rc.get('studentkey{0}'.format(i)) print(result)