-redis其他数据管理命令——keys
******key相关命令 keys——获取符合规则的键值列表(*?) *——表示任意字符 ?——表示一个字符 [root@redis ~]# redis-cli (创建多个键值) 127.0.0.1:6379> set a1 1 OK 127.0.0.1:6379> set a2 2 OK 127.0.0.1:6379> set a3 3 OK 127.0.0.1:6379> set a4 4 OK 127.0.0.1:6379> set a5 5 OK 127.0.0.1:6379> keys * (查看所有键) 1) "a4" 2) "a5" 3) "mylist" 4) "a2" 5) "a1" 6) "key:__rand_int__" 7) "aaa" 8) "a3" 9) "counter:__rand_int__" 127.0.0.1:6379> set b1 1 (创建一个以b开头的键) OK 127.0.0.1:6379> keys b* (查看以b开头的键) 1) "b1" 127.0.0.1:6379> set b222 222 (创建一个新的键) OK 127.0.0.1:6379> keys b? (查看以b开头的后面任意一个字符的键) 1) "b1" 127.0.0.1:6379> keys b??? (查看以b开头的后面任意三个字符的键) 1) "b222"
-redis其他数据管理命令——exists
******exists——判断键值是否存在 integer——返回值1表示存在,0表示不存在 [root@redis ~]# redis-cli 127.0.0.1:6379> EXISTS aaa (判断aaa键值是否存在) (integer) 1 (返回1说明存在) 127.0.0.1:6379> EXISTS bbb (integer) 0 (返回0说明不存在) 127.0.0.1:6379> keys * (查看所有键值,确认bbb是不存在的,aaa存在) 1) "a4" 2) "a5" 3) "mylist" 4) "a2" 5) "b222" 6) "a1" 7) "key:__rand_int__" 8) "aaa" 9) "a3" 10) "b1" 11) "counter:__rand_int__"
-redis其他数据管理命令——del
******del——删除当前数据库的指定键值 [root@redis ~]# redis-cli 127.0.0.1:6379> keys * (先查看所有键值) 1) "a4" 2) "a5" 3) "mylist" 4) "a2" 5) "b222" 6) "a1" 7) "key:__rand_int__" 8) "aaa" 9) "a3" 10) "b1" 11) "counter:__rand_int__" 127.0.0.1:6379> del aaa (删除aaa这个键值) (integer) 1 127.0.0.1:6379> get aaa (使用get查看aaa键的值发现无法查看) (nil) 127.0.0.1:6379> keys * (再次查看所有键值发现aaa键值已经没了) 1) "a4" 2) "a5" 3) "mylist" 4) "a2" 5) "b222" 6) "a1" 7) "key:__rand_int__" 8) "a3" 9) "b1" 10) "counter:__rand_int__"
-redis其他数据管理命令——type
******type——获取键对应的值的类型 [root@redis ~]# redis-cli 127.0.0.1:6379> keys * (查看所有键值) 1) "a4" 2) "a5" 3) "mylist" 4) "a2" 5) "b222" 6) "a1" 7) "key:__rand_int__" 8) "a3" 9) "b1" 10) "counter:__rand_int__" 127.0.0.1:6379> TYPE a1 (查看a1键值的类型) string (string表示字符串类型)
-redis其他数据管理命令——rename
******rename——重命名 rename 源键 目标键 ——————————————————————————————————————注意—————————————————————————————————————— 使用rename会直接覆盖目标键,无论是否存在,即不管有没有数据都会被最后输入的新键名覆盖,就是说就算有了这个键命,也会被刚刚输入的新键名覆盖。 在真实环境中一定要先使用exists先查看目标是否存在然后在决定是否使用rename ———————————————————————————————————————————————————————————————————————————————— [root@redis ~]# redis-cli 127.0.0.1:6379> keys * (查看所有的键值) 1) "a4" 2) "a5" 3) "mylist" 4) "a2" 5) "b222" 6) "a1" 7) "key:__rand_int__" 8) "a3" 9) "b1" 10) "counter:__rand_int__" 127.0.0.1:6379> get a4 (查看a4的值) "4" 127.0.0.1:6379> rename a4 b4 (重命名a4为b4) OK 127.0.0.1:6379> keys * (再次查看所有的键发现没有a4,但是有b4) 1) "a5" 2) "mylist" 3) "a2" 4) "b222" 5) "a1" 6) "key:__rand_int__" 7) "b4" 8) "a3" 9) "b1" 10) "counter:__rand_int__" 127.0.0.1:6379> get b4 (查看b4的值,发现被a4的值覆盖了) "4" 127.0.0.1:6379> get a4 (查看a4的值,发现无法查询) (nil) 127.0.0.1:6379> get a1 (查看a1键的值) "1" 127.0.0.1:6379> get a2 (查看a2键的值) "2" 127.0.0.1:6379> rename a1 a2 (修改a1键名为a2) OK 127.0.0.1:6379> get a2 (查看a2的值发现呗原来a1的值覆盖了) "1" 127.0.0.1:6379> get a1 (查看a1的值发现无法查询) (nil)
-redis其他数据管理命令——renamenx
******renamenx——对已有键进行重命名,并且检测新的名称是否存在,如果新的名称存在,那么则不进行重命名,在真实环境中推荐使用,避免了rename错误覆盖键值 renamenx 源键 目标键 (返回1为成功,0为失败) [root@redis ~]# redis-cli 127.0.0.1:6379> keys * (查看所有键值) 1) "a5" 2) "mylist" 3) "a2" 4) "b222" 5) "key:__rand_int__" 6) "b4" 7) "a3" 8) "b1" 9) "counter:__rand_int__" 127.0.0.1:6379> RENAMENX a5 a6 (把a5键名改为a6) (integer) 1 (返回1表示修改成功) 127.0.0.1:6379> renamenx a2 b1 (把a2键名改为b1) (integer) 0 (返回0表示修改失败) 127.0.0.1:6379> keys * (再次查看所有键值,发现没有了a5,多了a6,a2存在,b1也存在) 1) "mylist" 2) "a2" 3) "b222" 4) "key:__rand_int__" 5) "a6" 6) "b4" 7) "a3" 8) "b1" 9) "counter:__rand_int__"
-redis其他数据管理命令——dbsize
******dbsize——查看当前数据库中键的数量 [root@redis ~]# redis-cli 127.0.0.1:6379> dbsize (查看数据库中所有键的数量) (integer) 9 127.0.0.1:6379> keys * (查看所有键值发现有9个) 1) "mylist" 2) "a2" 3) "b222" 4) "key:__rand_int__" 5) "a6" 6) "b4" 7) "a3" 8) "b1" 9) "counter:__rand_int__"
-redis多数据常用命令
******redis默认的数据库有16个即0——15,即使用db 0 —— db 15来表示,默认连接的数据库为db 0 (1)select 数据库序号 ————切换到指定数据库 [root@redis ~]# redis-cli 127.0.0.1:6379> SELECT 10 (切换到10号数据库) OK 127.0.0.1:6379[10]> SELECT 15 (切换到15号数据库) OK 127.0.0.1:6379[15]> SELECT 0 (切换到0号数据库) OK 127.0.0.1:6379> (2)move 键名 数据库序号 ————移动当前数据库的指定键值到指定的数据库,返回1表示成功,返回0表示失败。 ————————————————————————————注意—————————————————————————— 如果移动的键名在目标数据库中存在,那么是无法移动成功的 —————————————————————————————————————————————————————————— [root@redis ~]# redis-cli 127.0.0.1:6379> select 15 (切换到15号数据库) OK 127.0.0.1:6379[15]> keys * (查看当前数据库的所有键值,发现没有任何键值) (empty list or set) 127.0.0.1:6379[15]> set aaa 1 (创建一个键名为aaa值为1的键值) OK 127.0.0.1:6379[15]> keys * (查看所有键值) 1) "aaa" 127.0.0.1:6379[15]> move aaa 10 (移动aaa这个键到10号数据库) (integer) 1 (返回1说明移动成功) 127.0.0.1:6379[15]> keys * (再次查看当前数据的所有键值,发现没有任何键值) (empty list or set) 127.0.0.1:6379[15]> select 10 (切换到10号数据库) OK 127.0.0.1:6379[10]> keys * (查看当前数据库所有键值,发现多了aaa键) 1) "aaa" 127.0.0.1:6379[10]> SELECT 5 (切换到5号数据库) OK 127.0.0.1:6379[5]> set aaa 1 (创建名为aaa的键值为1) OK 127.0.0.1:6379[5]> move aaa 10 (移动aaa键值到10号库) (integer) 0 (返回0说明移动失败) 127.0.0.1:6379[5]> keys * (查看当前数据库的所有键,发现有一个aaa键值) 1) "aaa" (3)flushdb ————清除当前数据库内所有数据 ————————————————————————注意———————————————————————— 执行flushdb会清空当前数据库的所有数据要谨慎使用 ———————————————————————————————————————————————————— [root@redis ~]# redis-cli 127.0.0.1:6379> select 10 (切换到10号数据库) OK 127.0.0.1:6379[10]> keys * (查看所有键值) 1) "aaa" 127.0.0.1:6379[10]> flushdb (清除当前数据库内所有数据) OK 127.0.0.1:6379[10]> keys * (再次查看所有键值,发现什么都没有了) (empty list or set)
三、redis实战——搭建redis群集
(1)redis群集原理
redis群集架构:
redis 群集采用虚拟槽分区,将所有的数据根据算法映射到0~16383整数槽中,并且是一个无中心的结构,每个节点都保存数据和整个群集的状态
群集角色
Master:Master之间分配虚拟槽slots
Slave:Slave向它指向的Master同步数据
群集节点使用的TCP端口
6379端口用于客户端的连接,16379端口用于群集总线
(2)搭建redis群集
为了节省资源,本次实验在单台服务器上搭建redis群集,通过不同的TCP端口去启动多个实例,模拟多台独立的redis服务器组成的群集
注意:至少需要六个实例也就是六个redis服务器才能组成群集,3主3从会自动分配
******本次实验思路为:在根目录下创建一个新目录,用于存放多实例配置文件,即使用多个redis主配置文件,但是每台实例的端口都不同,使用这六个主配置文件启动实例,并且搭建redis群集 ******(1)首先先关闭redis服务器 [root@redis ~]# /etc/init.d/redis_6379 stop (关闭redis) Stopping ... Redis stopped [root@redis ~]# netstat -anpt | grep redis (检查是否成功关闭) ******(2)创建新的群集目录,并且分别创建不同的redis目录 [root@redis ~]# mkdir -p /redis/{6001..6006} (这里利用6001——6006来区分多态实例) [root@redis ~]# ll /redis/ 总用量 0 drwxr-xr-x 2 root root 6 3月 8 01:42 6001 drwxr-xr-x 2 root root 6 3月 8 01:42 6002 drwxr-xr-x 2 root root 6 3月 8 01:42 6003 drwxr-xr-x 2 root root 6 3月 8 01:42 6004 drwxr-xr-x 2 root root 6 3月 8 01:42 6005 drwxr-xr-x 2 root root 6 3月 8 01:42 6006 ******(3)复制多个主配置文件 [root@redis ~]# cat /usr/src/redis-3.2.9/redis.conf | grep -v "^#"| grep -v "^$" > redis.conf (先保存一份当家目录) [root@redis ~]# vim redis.conf (修改为:也可以之间复制,修改的行分别为1、3、7、9、11、20、35、36、37) bind 192.168.100.7 #根据实际情况去修改ip地址,群集节点间必须可以进行正常通信,网络层面需要开启相应端口的访问权限 protected-mode yes port 6001 #修改端口号 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes #运行redis在后台运行 supervised no pidfile /var/run/redis_6001.pid #修改pid文件,每个实例都要修改成指定的 loglevel notice logfile "/redis/6001/redis_6001.log" #修改日志文件,每个实例都要修改成指定的 databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir /redis/6001 #每个实例要修改成对应的目录 slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes lua-time-limit 5000 cluster-enabled yes #开启群集 cluster-config-file nodes-6001.conf #群集配置文件,每个实例都要有相对应的配置文件 cluster-node-timeout 15000 #请求超时时长,默认15秒,根据实际情况修改 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes 保存退出 [root@redis ~]# cp redis.conf /redis/6001(依次复制文件到各个实例的目录) [root@redis ~]# cp redis.conf /redis/6002 [root@redis ~]# cp redis.conf /redis/6003 [root@redis ~]# cp redis.conf /redis/6004 [root@redis ~]# cp redis.conf /redis/6005 [root@redis ~]# cp redis.conf /redis/6006 [root@redis ~]# sed -i 's/6001/6002/g' /redis/6002/redis.conf (使用sed替换配置文件中的6001为各个实例的端口号) [root@redis ~]# sed -i 's/6001/6003/g' /redis/6003/redis.conf [root@redis ~]# sed -i 's/6001/6004/g' /redis/6004/redis.conf [root@redis ~]# sed -i 's/6001/6005/g' /redis/6005/redis.conf [root@redis ~]# sed -i 's/6001/6006/g' /redis/6006/redis.conf ******(4)启动各个实例 [root@redis ~]# redis-server /redis/6001/redis.conf (依次使用redis-server启动各个实例) [root@redis ~]# redis-server /redis/6002/redis.conf [root@redis ~]# redis-server /redis/6003/redis.conf [root@redis ~]# redis-server /redis/6004/redis.conf [root@redis ~]# redis-server /redis/6005/redis.conf [root@redis ~]# redis-server /redis/6006/redis.conf [root@redis ~]# netstat -anpt | grep redis (检查端口,确定各个实例都已经正常启动) tcp 0 0 192.168.100.7:6001 0.0.0.0:* LISTEN 1461/redis-server 1 tcp 0 0 192.168.100.7:6002 0.0.0.0:* LISTEN 1465/redis-server 1 tcp 0 0 192.168.100.7:6003 0.0.0.0:* LISTEN 1470/redis-server 1 tcp 0 0 192.168.100.7:6004 0.0.0.0:* LISTEN 1474/redis-server 1 tcp 0 0 192.168.100.7:6005 0.0.0.0:* LISTEN 1478/redis-server 1 tcp 0 0 192.168.100.7:6006 0.0.0.0:* LISTEN 1482/redis-server 1 tcp 0 0 192.168.100.7:16001 0.0.0.0:* LISTEN 1461/redis-server 1 tcp 0 0 192.168.100.7:16002 0.0.0.0:* LISTEN 1465/redis-server 1 tcp 0 0 192.168.100.7:16003 0.0.0.0:* LISTEN 1470/redis-server 1 tcp 0 0 192.168.100.7:16004 0.0.0.0:* LISTEN 1474/redis-server 1 tcp 0 0 192.168.100.7:16005 0.0.0.0:* LISTEN 1478/redis-server 1 tcp 0 0 192.168.100.7:16006 0.0.0.0:* LISTEN 1482/redis-server 1 至此redis群集搭建完成!!!
(3)配置Ruby环境-redis-trib.rb脚本
因为redis3.0之后开始支持群集功能,官方退出了一个管理集群的工具,一个Ruby脚本————redis-trib.rb
该脚本集成在redis的源码SRC目录下,所以需要系统安装配置ruby环境,才可以使用该脚本进行redis群集的创建、配置和管理。
******(1)安装ruby工具 [root@redis ~]# yum -y install ruby rubygems 。。。。。。 完毕! ******(2)上传文件,使用脚本安装redis群集 [root@redis ~]# ll 总用量 1596 -rw-------. 1 root root 1220 9月 3 2020 anaconda-ks.cfg -rw-r--r-- 1 root root 76 3月 8 01:50 dump.rdb -rw-r--r-- 1 root root 71168 3月 8 02:20 redis-3.2.0.gem -rw-r--r-- 1 root root 1547695 3月 7 06:01 redis-3.2.9.tar.gz -rw-r--r-- 1 root root 1293 3月 8 01:57 redis.conf [root@redis ~]# gem install redis --version 3.2.0 (安装) Successfully installed redis-3.2.0 Parsing documentation for redis-3.2.0 Installing ri documentation for redis-3.2.0 1 gem installed [root@redis ~]# cd /usr/src/redis-3.2.9/src/ (安装完成后会发现/usr/src下多了一个redis目录) [root@redis src]# ./redis-trib.rb create --replicas 1 192.168.100.7:6001 192.168.100.7:6002 192.168.100.7:6003 192.168.100.7:6004 192.168.100.7:6005 192.168.100.7:6006 (使用脚本安装redis群集,1就是nodeid号) >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 192.168.100.7:6001 192.168.100.7:6002 192.168.100.7:6003 Adding replica 192.168.100.7:6004 to 192.168.100.7:6001 Adding replica 192.168.100.7:6005 to 192.168.100.7:6002 Adding replica 192.168.100.7:6006 to 192.168.100.7:6003 M: 86e8a7f5a7c6aa465ee8d20b8a9be340f2fc51b7 192.168.100.7:6001 slots:0-5460 (5461 slots) master M: 536694c3cb5084ca424fd8c5f7b39591e5f7dac0 192.168.100.7:6002 slots:5461-10922 (5462 slots) master M: c3df16a5c876eca9dc4b409e1a17fa7295c0f88d 192.168.100.7:6003 slots:10923-16383 (5461 slots) master S: c3b870daf4dc533c8483b40ea08dde38def5f753 192.168.100.7:6004 replicates 86e8a7f5a7c6aa465ee8d20b8a9be340f2fc51b7 S: 065d7fbb560dd8cda9a493400eda463bdb1e2e97 192.168.100.7:6005 replicates 536694c3cb5084ca424fd8c5f7b39591e5f7dac0 S: 3d3d404951283622d56ae045350a04d831825782 192.168.100.7:6006 replicates c3df16a5c876eca9dc4b409e1a17fa7295c0f88d Can I set the above configuration? (type 'yes' to accept): yes (输入yes) >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join..... >>> Performing Cluster Check (using node 192.168.100.7:6001) M: 86e8a7f5a7c6aa465ee8d20b8a9be340f2fc51b7 192.168.100.7:6001 slots:0-5460 (5461 slots) master 1 additional replica(s) S: c3b870daf4dc533c8483b40ea08dde38def5f753 192.168.100.7:6004 slots: (0 slots) slave replicates 86e8a7f5a7c6aa465ee8d20b8a9be340f2fc51b7 S: 065d7fbb560dd8cda9a493400eda463bdb1e2e97 192.168.100.7:6005 slots: (0 slots) slave replicates 536694c3cb5084ca424fd8c5f7b39591e5f7dac0 M: 536694c3cb5084ca424fd8c5f7b39591e5f7dac0 192.168.100.7:6002 slots:5461-10922 (5462 slots) master 1 additional replica(s) M: c3df16a5c876eca9dc4b409e1a17fa7295c0f88d 192.168.100.7:6003 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: 3d3d404951283622d56ae045350a04d831825782 192.168.100.7:6006 slots: (0 slots) slave replicates c3df16a5c876eca9dc4b409e1a17fa7295c0f88d [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. ******(3)查看群集状态 [root@redis src]# ./redis-trib.rb check 192.168.100.7:6001 (查看群集状态) >>> Performing Cluster Check (using node 192.168.100.7:6001) M: 86e8a7f5a7c6aa465ee8d20b8a9be340f2fc51b7 192.168.100.7:6001 slots:0-5460 (5461 slots) master 1 additional replica(s) S: c3b870daf4dc533c8483b40ea08dde38def5f753 192.168.100.7:6004 slots: (0 slots) slave replicates 86e8a7f5a7c6aa465ee8d20b8a9be340f2fc51b7 S: 065d7fbb560dd8cda9a493400eda463bdb1e2e97 192.168.100.7:6005 slots: (0 slots) slave replicates 536694c3cb5084ca424fd8c5f7b39591e5f7dac0 M: 536694c3cb5084ca424fd8c5f7b39591e5f7dac0 192.168.100.7:6002 slots:5461-10922 (5462 slots) master 1 additional replica(s) M: c3df16a5c876eca9dc4b409e1a17fa7295c0f88d 192.168.100.7:6003 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: 3d3d404951283622d56ae045350a04d831825782 192.168.100.7:6006 slots: (0 slots) slave replicates c3df16a5c876eca9dc4b409e1a17fa7295c0f88d [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
(4)测试
******(1)登录redis群集,进行键值测试 -h:主机 -p:端口 -c:激活群集模式 [root@redis src]# redis-cli -h 192.168.100.7 -p 6001 -c 192.168.100.7:6001> set aaa 111 -> Redirected to slot [10439] located at 192.168.100.7:6002 OK 192.168.100.7:6002> get aaa "111" 192.168.100.7:6002> exit
(5)结论
通过这次实验我们可以得知,登录群集的任意一个实例创建键值时,会重定向到其他的服务器上,是按照slot槽点进行分配的
四、扩展——trib.rb脚本的使用
[root@redis ~]# cd /usr/src/redis-3.2.9/src/ [root@redis src]# ./redis-trib.rb help (下列选项使用格式为./redis-trib.rb 选项) Usage: redis-trib <command> <options> <arguments ...> create host1:port1 ... hostN:portN ——(创建群集,格式为 主机地址:端口号) --replicas <arg> ——(replicas参数指定当前创建的redis群集有几个slave节点) check host:port ——(检查群集,验证节点是否可用,格式为: 主机地址:端口号) info host:port ——(查看群集信息,节点信息,格式为: 主机地址:端口号) fix host:port ——(修复群集,格式为: 主机地址:端口号) --timeout <arg> reshard host:port ——(在线迁移群集,格式为: form 主机地址:端口号 to 主机地址:端口号 ) --from <arg> --to <arg> --slots <arg> --yes --timeout <arg> --pipeline <arg> rebalance host:port ——(平衡群集节点的槽点数量,格式为: 主机地址:端口号) --weight <arg> --auto-weights --use-empty-masters --timeout <arg> --simulate --pipeline <arg> --threshold <arg> add-node new_host:new_port existing_host:existing_port ——(在线添加新的群集节点,格式为: 新的主机地址:新的端口号 现有的主机地址:现有的端口号) --slave --master-id <arg> del-node host:port node_id ——(在线删除群集节点,格式为: 主机地址:端口号 nodeid号) set-timeout host:port milliseconds ——(redis群集节点心跳超时设置,默认为15秒,格式为: 主机地址:端口号 指定的超时时间单位是毫秒) call host:port command arg arg .. arg ——(使命令在所有节点一起执行,谨慎使用) import host:port ——(将外部redis节点数据导入群集中) --from <arg> --copy --replace help (show this help) ——(显示脚本使用帮助) For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
如果本文章有不对的地方,请在评论区留言,谢谢!!~