一、Redis管理命令

1.info命令

#查看redis相关信息
127.0.0.1:6379> info
#服务端信息
# Server
#版本号
redis_version:3.2.12
#redis版本控制安全hash算法
redis_git_sha1:00000000
#redis版本控制脏数据
redis_git_dirty:0
#redis建立id
redis_build_id:3b947b91b7c31389
#运行模式:单机(如果是集群:cluster)
redis_mode:standalone
#redis所在宿主机的操作系统
os:Linux 2.6.32-431.el6.x86_64 x86_64
#架构(64位)
arch_bits:64
#redis事件循环机制
multiplexing_api:epoll
#GCC的版本
gcc_version:4.4.7
#redis进程的pid
process_id:33007
#redis服务器的随机标识符(用于sentinel和集群)
run_id:46b07234cf763cab04d1b31433b94e31b68c6e26
#redis的端口
tcp_port:6379
#redis服务器的运行时间(单位秒)
uptime_in_seconds:318283
#redis服务器的运行时间(单位天)
uptime_in_days:3
#redis内部调度(进行关闭timeout的客户端,删除过期key等等)频率,程序规定serverCron每秒运行10次
hz:10
#自增的时钟,用于LRU管理,该时钟100ms(hz=10,因此每1000ms/10=100ms执行一次定时任务)更新一次
lru_clock:13601047
#服务端运行命令路径
executable:/application/redis-3.2.12/redis-server
#配置文件路径
config_file:/etc/redis/6379/redis.conf

#客户端信息
# Clients
#已连接客户端的数量(不包括通过slave的数量)
connected_clients:2
##当前连接的客户端当中,最长的输出列表,用client list命令观察omem字段最大值
client_longest_output_list:0
#当前连接的客户端当中,最大输入缓存,用client list命令观察qbuf和qbuf-free两个字段最大值
client_biggest_input_buf:0
#正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量
blocked_clients:0

#内存信息
# Memory
#由redis分配器分配的内存总量,以字节为单位
used_memory:845336
#以人类可读的格式返回redis分配的内存总量
used_memory_human:825.52K
#从操作系统的角度,返回redis已分配的内存总量(俗称常驻集大小)。这个值和top命令的输出一致
used_memory_rss:1654784
#以人类可读方式,返回redis已分配的内存总量
used_memory_rss_human:1.58M
#redis的内存消耗峰值(以字节为单位)
used_memory_peak:845336
#以人类可读的格式返回redis的内存消耗峰值
used_memory_peak_human:825.52K
#整个系统内存
total_system_memory:1028517888
#以人类可读的格式,显示整个系统内存
total_system_memory_human:980.87M
#Lua脚本存储占用的内存
used_memory_lua:37888
#以人类可读的格式,显示Lua脚本存储占用的内存
used_memory_lua_human:37.00K
#Redis实例的最大内存配置
maxmemory:0
#以人类可读的格式,显示Redis实例的最大内存配置
maxmemory_human:0B
#当达到maxmemory时的淘汰策略
maxmemory_policy:noeviction
#内存分裂比例(used_memory_rss/ used_memory)
mem_fragmentation_ratio:1.96
#内存分配器
mem_allocator:jemalloc-4.0.3

#持久化信息
# Persistence
#服务器是否正在载入持久化文件
loading:0
#离最近一次成功生成rdb文件,写入命令的个数,即有多少个写入命令没有持久化
rdb_changes_since_last_save:131
#服务器是否正在创建rdb文件
rdb_bgsave_in_progress:0
#最近一次rdb持久化保存时间
rdb_last_save_time:1540009420
#最近一次rdb持久化是否成功
rdb_last_bgsave_status:ok
#最近一次成功生成rdb文件耗时秒数
rdb_last_bgsave_time_sec:-1
#如果服务器正在创建rdb文件,那么这个域记录的就是当前的创建操作已经耗费的秒数
rdb_current_bgsave_time_sec:-1
#是否开启了aof
aof_enabled:0
#标识aof的rewrite操作是否在进行中
aof_rewrite_in_progress:0
#rewrite任务计划,当客户端发送bgrewriteaof指令,如果当前rewrite子进程正在执行,那么将客户端请求的bgrewriteaof变为计划任务,待aof子进程结束后执行rewrite
aof_rewrite_scheduled:0
#最近一次aof rewrite耗费的时长
aof_last_rewrite_time_sec:-1
#如果rewrite操作正在进行,则记录所使用的时间,单位秒
aof_current_rewrite_time_sec:-1
#上次bgrewriteaof操作的状态
aof_last_bgrewrite_status:ok
#上次aof写入状态
aof_last_write_status:ok

#统计信息
# Stats
#新创建连接个数,如果新创建连接过多,过度地创建和销毁连接对性能有影响,说明短连接严重或连接池使用有问题,需调研代码的连接设置
total_connections_received:19
#redis处理的命令数
total_commands_processed:299
#redis当前的qps,redis内部较实时的每秒执行的命令数
instantaneous_ops_per_sec:0
#redis网络入口流量字节数
total_net_input_bytes:10773
#redis网络出口流量字节数
total_net_output_bytes:97146
#redis网络入口kps
instantaneous_input_kbps:0.00
#redis网络出口kps
instantaneous_output_kbps:0.00
#拒绝的连接个数,redis连接个数达到maxclients限制,拒绝新连接的个数
rejected_connections:0
#主从完全同步次数
sync_full:0
#主从完全同步成功次数
sync_partial_ok:0
#主从完全同步失败次数
sync_partial_err:0
#运行以来过期的key的数量
expired_keys:5
#过期的比率
evicted_keys:0
#命中次数
keyspace_hits:85
#没命中次数
keyspace_misses:17
#当前使用中的频道数量
pubsub_channels:0
#当前使用的模式的数量
pubsub_patterns:0
#最近一次fork操作阻塞redis进程的耗时数,单位微秒
latest_fork_usec:0
#是否已经缓存了到该地址的连接
migrate_cached_sockets:0

#主从复制信息
# Replication
#角色主库
role:master
#连接slave的个数
connected_slaves:0
#主从同步偏移量,此值如果和上面的offset相同说明主从一致没延迟,与master_replid可被用来标识主实例复制流中的位置
master_repl_offset:0
#复制积压缓冲区是否开启
repl_backlog_active:0
#复制积压缓冲大小
repl_backlog_size:1048576
#复制缓冲区里偏移量的大小
repl_backlog_first_byte_offset:0
#此值等于 master_repl_offset - repl_backlog_first_byte_offset,该值不会超过repl_backlog_size的大小
repl_backlog_histlen:0

#CPU信息
# CPU
#将所有redis主进程在内核态所占用的CPU时求和累计起来
used_cpu_sys:203.44
#将所有redis主进程在用户态所占用的CPU时求和累计起来
used_cpu_user:114.57
#将后台进程在内核态所占用的CPU时求和累计起来
used_cpu_sys_children:0.00
#将后台进程在用户态所占用的CPU时求和累计起来
used_cpu_user_children:0.00

#集群信息
# Cluster
#实例是否启用集群模式
cluster_enabled:0

#库相关统计信息
# Keyspace
#db0的key的数量,以及带有生存期的key的数,平均存活时间
db0:keys=17,expires=0,avg_ttl=0

#单独查看某一个信息(例:查看CPU信息)
127.0.0.1:6379> info cpu
# CPU
used_cpu_sys:203.45
used_cpu_user:114.58
used_cpu_sys_children:0.00
used_cpu_user_children:0.00

2. client命令

#查看客户端连接数
127.0.0.1:6379> CLIENT LIST
id=2 addr=127.0.0.1:39376 fd=7 name= age=146 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
id=3 addr=172.16.1.61:39112 fd=8 name= age=4 idle=4 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=command
127.0.0.1:6379>

3.select命令

在Redis中也是有库这个概念的,不过不同于MySQL,Redis的库是默认的,并不是我们手动去创建的,在Redis中一共有16(0-15)个库。在MySQL中进入某一个库,我们需要使用use dbname,在Redis中,只需要select即可。默认情况下,我们是在0库中进行操作,每个库之间都是隔离的。

#查看0库数据
127.0.0.1:6379> keys *

#切换到1库
127.0.0.1:6379> SELECT 1
OK
#查看1库数据
127.0.0.1:6379[1]> keys *
(empty list or set)

4.flush(flushall、flushdb)命令

#删除所有库(0-15)
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty list or set)

#删除当前库(0)
127.0.0.1:6379> flushdb
OK

5.monitor命令

#窗口1监控
127.0.0.1:6379> MONITOR
OK

#窗口2 执行命令
[root@db01 ~]# redis-cli -a 123
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> set k3 v3
OK

#窗口1 查看
127.0.0.1:6379> MONITOR
OK
1589245546.086470 [0 127.0.0.1:39378] "AUTH" "123"
1589245546.086537 [0 127.0.0.1:39378] "keys" "*"
1589245558.400459 [0 127.0.0.1:39378] "set" "k1" "v1"
1589245565.759616 [0 127.0.0.1:39378] "set" "k2" "v2"
1589245578.585385 [0 127.0.0.1:39378] "SELECT" "1"
1589245583.754403 [1 127.0.0.1:39378] "set" "k3" "v3"
1589245627.079624 [0 127.0.0.1:39380] "AUTH" "123"
1589245627.082768 [0 127.0.0.1:39380] "COMMAND"

二、redis消息队列

1.什么是消息队列

消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保信息的可靠传递,消息生产者只管把消息发布到MQ中而不管谁来取,消息消费者只管从MQ中取消息而不管谁发布的,这样发布者和使用者都不用知道对方的存在。

2.为什么要使用消息队列

首先,我们可以知道,消息队列是一种异步的工作机制,比如说日志收集系统,为了避免数据在传输过程中丢失,还有订单系统,下单后,会生成对应的单据,库存的扣减,消费信息的发送,一个下单,产生这么多的消息,都是通过一个操作的触发,然后将其他的消息放入消息队列中,依次产生。再就是很多网站的,秒杀活动之类的,前多少名用户会便宜,都是通过消息队列来实现的。

这些例子,都是通过消息队列,来实现,业务的解耦,最终数据的一致性,广播,错峰流控等等,从而完成业务的逻辑

3.reids发布消息-任务队列模式

任务队列:顾名思义,就是“传递消息的队列”。与任务队列进行交互的实体有两类,一类是生产者(producer),另一类则是消费者(consumer)。生产者将需要处理的任务放入任务队列中,而消费者则不断地从任务队列中读入任务信息并执行。

任务队列的好处
1)松耦合。
生产者和消费者只需按照约定的任务描述格式,进行编写代码。
2)易于扩展。
多消费者模式下,消费者可以分布在多个不同的服务器中,由此降低单台服务器的负载。

4.发布-订阅模式

其实从Pub/Sub的机制来看,它更像是一个广播系统,多个订阅者(Subscriber)可以订阅多个频道(Channel),多个发布者(Publisher)可以往多个频道(Channel)中发布消息。

可以这么简单的理解:
1)Subscriber:收音机,可以收到多个频道,并以队列方式显示
2)Publisher:电台,可以往不同的FM频道中发消息
3)Channel:不同频率的FM频道

5.redis发布订阅模拟

1)订阅单个频道

#登录redis,订阅一个频道
127.0.0.1:6379> SUBSCRIBE read
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "read"
3) (integer) 1

#再开一个窗口,发布消息
127.0.0.1:6379> PUBLISH read "look look me"
(integer) 1

#回到第一个窗口看消息
127.0.0.1:6379> SUBSCRIBE read
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "read"
3) (integer) 1

1) "message"
2) "read"
3) "look look me"

2)订阅多个频道

#订阅多个频道
127.0.0.1:6379> SUBSCRIBE read test lalala 
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "read"
3) (integer) 1
1) "subscribe"
2) "test"
3) (integer) 2
1) "subscribe"
2) "lalala"
3) (integer) 3

#订阅所有频道
127.0.0.1:6379> PSUBSCRIBE *
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "*"
3) (integer) 1

三、redis事务介绍

1.mysql中事务

begin;
事件1....
事件2....
commit;

begin;
事件1....
事件2....
rollback;

2.redis事务相关命令

#开启事务
127.0.0.1:6379> MULTI

#结束事务(执行事务中的命令)
127.0.0.1:6379> EXEC

#取消事务(放弃执行事务中的命令)
127.0.0.1:6379> DISCARD

#监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
WATCH key [key ...]

#取消 WATCH 命令对所有 key 的监视。
UNWATCH

3.事务的使用

#开启事务,执行事件
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set shijian1 1
QUEUED
127.0.0.1:6379> set shijian2 2
QUEUED
127.0.0.1:6379> get shijian1
QUEUED
127.0.0.1:6379> get shijian2
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
3) "1"
4) "2"

#再次查看
127.0.0.1:6379> get shijian1
"1"
127.0.0.1:6379> get shijian2
"2"

#监控一个key  k1
127.0.0.1:6379> WATCH k1
OK

#开启事务 修改k1
127.0.0.1:6379> MULTI 
OK
127.0.0.1:6379> set k1 vvvv1
QUEUED

#在另一个窗口修改k1的值
172.16.1.51:6379> set k1 v3445
OK

#回来结束事务,没有任何修改
127.0.0.1:6379> EXEC
(nil)

4.注意

1.redis只支持乐观锁
2.事务在不开启watch时,谁后提交谁为准
3.事务在开启watch时,谁先提交谁为准
4.watch只能对接下来执行的一个事务进行监控,执行第二个事务的时候要重新watch

四、redis多实例

1.创建多实例目录

[root@db01 ~]# mkdir /server/redis/{6379,6380,6381} -p

2.配置多实例

[root@db01 ~]# vim /server/redis/6379/redis.conf 
daemonize yes
bind 172.16.1.51 127.0.0.1
port 6379
pidfile /server/redis/6379/redis.pid
logfile /server/redis/6379/redis.log
protected-mode no
dir /server/redis/6379
dbfilename dump.rdb
save 900 1
save 300 10
save 60 10000

[root@db01 ~]# vim /server/redis/6380/redis.conf 
daemonize yes
bind 172.16.1.51 127.0.0.1
port 6380
pidfile /server/redis/6380/redis.pid
logfile /server/redis/6380/redis.log
protected-mode no
dir /server/redis/6380
dbfilename dump.rdb
save 900 1
save 300 10
save 60 10000

[root@db01 ~]# vim /server/redis/6381/redis.conf 
daemonize yes
bind 172.16.1.51 127.0.0.1
port 6381
pidfile /server/redis/6381/redis.pid
logfile /server/redis/6381/redis.log
protected-mode no
dir /server/redis/6381
dbfilename dump.rdb
save 900 1
save 300 10
save 60 10000

3.启动多实例

[root@db01 ~]# redis-server /server/redis/6379/redis.conf 
[root@db01 ~]# redis-server /server/redis/6380/redis.conf 
[root@db01 ~]# redis-server /server/redis/6381/redis.conf

4.检查启动

[root@db01 ~]# ps -ef | grep redis
root      15642      1  0 11:15 ?        00:00:00 redis-server 172.16.1.51:6379
root      15646      1  0 11:15 ?        00:00:00 redis-server 172.16.1.51:6380
root      15650      1  0 11:15 ?        00:00:00 redis-server 172.16.1.51:6381
root      15655  15208  0 11:16 pts/0    00:00:00 grep --color=auto redis

五、redis主从复制

1.主从复制特点

1)使用异步复制。
2)一个主服务器可以有多个从服务器。
3)从服务器也可以有自己的从服务器。
4)复制功能不会阻塞主服务器。
5)可以通过复制功能来让主服务器免于执行持久化操作,由从服务器去执行持久化操作即可。

2.主从复制原理

1.从服务器开启主从
2.从向主服务器发送 SYNC 命令
3.接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件
4.主库会将RDB文件传输到从库
5.主库在生成和传送RDB文件过程中,使用缓冲区记录接下来执行的所有写命令
6.从服务器接收到主库传来的rdb文件以后,会清空自己的数据
7.从库载入这个RDB文件。
8.主服务器将缓冲区储存的所有写命令发送给从服务器执行

3.主从复制机制

1)PSYNC只会将从服务器断线期间缺失的数据发送给从服务器。两个例子的情况是相同的,但SYNC 需要发送包含整个数据库的 RDB 文件,而PSYNC 只需要发送三个命令。

2)如果主从服务器所处的网络环境并不那么好的话(经常断线),那么请尽量使用 Redis 2.8 或以上版本:通过使用 PSYNC 而不是 SYNC 来处理断线重连接,可以避免因为重复创建和传输 RDB文件而浪费大量的网络资源、计算资源和内存资源。

4.redis主从实践

1)环境准备

角色 主机 端口
主库 172.16.1.51 6379
从库 172.16.1.51 6380
从库 172.16.1.51 6381

2)连接三台redis实例

#连接三台多实例
[root@db01 ~]# redis-cli -p 6379
[root@db01 ~]# redis-cli -p 6380
[root@db01 ~]# redis-cli -p 6381

3)查看三台实例主从状态

#查看三台主从状态,发现都是自己的主库
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379>

4)配置主从

#灵台从库都配置主从
127.0.0.1:6380> SLAVEOF 172.16.1.51 6379
OK

#查看主库状态
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.1.51,port=6380,state=online,offset=71,lag=1
slave1:ip=172.16.1.51,port=6381,state=online,offset=71,lag=1
master_repl_offset:71
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:70

#查看从库状态
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:172.16.1.51
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:57
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
#通过配置文件配置主从
    slaveof 172.16.1.51 6379

5)如果主库出现问题

#做完主从,从库默认只读权限
127.0.0.1:6380> set k6380 v6380
(error) READONLY You can't write against a read only slave.

#如果主库故障
127.0.0.1:6379> shutdown
not connected> quit

#选一台从库取消主从
127.0.0.1:6380> SLAVEOF no one
OK
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

#另一台redis修改主库同步
127.0.0.1:6381> SLAVEOF 172.16.1.51 6380
OK
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:172.16.1.51
master_port:6380
master_link_status:up
Copyright © 高程程 all right reserved,powered by Gitbook修订于: 2021-05-18 21:15:03

results matching ""

    No results matching ""