Redis数据库

什么是redis?

redis是一个开源,C语言编写的高级键值缓存和持久性存储的Nosql数据库产品,它可以作为数据库,也可以作为缓存作用的消息中间人

redis与memcache和tair的比较

memcache:高性能的读写能力,支持客户端式分布式集群,多线程读写性能高,但是数据单一,无持久化,节点故障容易出现问题,因为分布式需要客户端实现,所以跨机房数据同步困难,架构扩容难度高 tair:高性能读写,支持高可用和分布式分片集群,淘宝在使用,但是单机的情况,它的读写能力比memcache和redis都要慢 redis:高性能读写,多数据类型,数据持久化,高可用架构,可以自定义虚拟内存,支持分布式分片集群,单线程读写能力极高,但是多线程读写比mencache差

redis的特点:

  • 高速读写的能力,存储数据的类型丰富
  • 能够支持持久化(把内存上的数据写到磁盘上实现持久存储)
  • 支持多事务,消息队列、消息订阅的功能
  • 支持高可用以及分布式分片集群

TOC

一、redis安装

★准备工作★

安装包:redis-6.2.7.tar.gz
安装包下载地址:https://download.redis.io/releases/redis-6.2.7.tar.gz
安装编译工具

yum -y install make
#或者apt安装
apt -y install make

★开始安装★

1.解压和安装redis安装包
(官方已经编译了redis源码包生成Makefile文件了,所以这里直接安装就行了)

tar zxf redis-6.2.7.tar.gz
cd redis-6.2.7
make PREFIX=/redis install

2.创建工作目录和配置文件

mkdir -p /redis/{conf,data,logs}
vim /redis/conf/redis.conf
--------------------------
bind 0.0.0.0
protected-mode yes
port 6396
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis.pid
loglevel notice
logfile "/redis/logs/redis.log"
dir /redis/data
requirepass "cxgbpgGwAfx6Jw3+Zeb"
masterauth "cxgbpgGwAfx6Jw3+Zeb"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
replica-serve-stale-data yes
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
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
aof-use-rdb-preamble yes
lua-time-limit 5000
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
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes

3.启动服务

/redis/bin/redis-server /redis/conf/redis.conf

查看启动状态登录redis

[root@felix ~]# netstat -anptu |grep redis
tcp        0      0 0.0.0.0:6396            0.0.0.0:*               LISTEN      22110/redis-server
tcp        0      0 0.0.0.0:16396           0.0.0.0:*               LISTEN      22110/redis-server
[root@felix ~]# ps -aux |grep redis |grep -v grep
root     22110  0.0  0.1 165592  3108 ?        Ssl  10:19   0:00 /redis/bin/redis-server 0.0.0.0:6396 [cluster]
[root@felix ~]# /redis/bin/redis-cli -a 'cxgbpgGwAfx6Jw3+Zeb' -p 6396
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6396> 

二、redis基本语法

redis-cli工具

登陆命令

redis-cli -h hostname -p 6379 -a ‘xxxx’

执行内部命令

redis-cli -h hostname -p 6379 -a ‘xxxx’ -c flushall

-h:地址
-p:端口号
-a:密码
-c:执行的命令
显示key数量、内存、客户端数量、QPS情况:redis-cli --stat
查看redis延迟:redis-cli --latency
监控当前redis接受的命令和数据内容:redis-cli monitor
(这个命令会比较消耗资源,根据官网的测试,QPS会下降到原先的50%,需要谨慎使用)
使用bigkeys查找占用空间较大的key:redis-cli --bigkeys

增删改查

#清除所有缓存
127.0.0.1:6396> flushall
#插入key值
127.0.0.1:6396> set test_key "key_values"
#查询所有键
127.0.0.1:6396> keys *
#查询指定键
127.0.0.1:6396> keys test_key
#获取键的值
127.0.0.1:6396> get test_key
#删除键
127.0.0.1:6396> del test_key
#修改键名字
127.0.0.1:6396> rename test_key new_name
# 查询key的过期时间
127.0.0.1:6396> ttl test_key
#以毫秒为单位的整数值TTL或负值,TTL以毫秒为单位
#-1, 如果key没有到期超时
#-2, 如果键不存在

批量删除数据

redis单机实例

/redis/bin/redis-cli -a 'cxgbpgGwAfx6Jw3+Zeb' -p 7001 -c "del test_*"

redis群集

/redis/bin/redis-cli -a 'cxgbpgGwAfx6Jw3+Zeb' -p 7001 -n 0 keys "test_*" |xargs -i /redis-cluster/7001/bin/redis-cli -a 'cxgbpgGwAfx6Jw3+Zeb' -n 0 -p 7001 del {}

三、redis群集搭建

redis6.0版本

环境信息:
一台服务器多实例实现三主三从,一共6台实例
192.168.31.101:(7001、7002、7003、7004、7005、7006)
安装包:redis-6.2.7.tar.gz
1.安装redis,创建每个实例的工作目录

tar zxf redis-6.2.7.tar.gz
cd redis-6.2.7
make PREFIX=/redis install
mkdir -p /redis/conf
mkdir -p /redis/7001/{data,logs}
mkdir -p /redis/7002/{data,logs}
mkdir -p /redis/7003/{data,logs}
mkdir -p /redis/7004/{data,logs}
mkdir -p /redis/7005/{data,logs}
mkdir -p /redis/7006/{data,logs}

2.配置redis配置文件
redis群集的配置文件需要添加以下配置项

cluster-enabled yes  \\开启集群把注释#去掉
cluster-config-file nodes-6379.conf  \\集群的配置
cluster-node-timeout  15000  \\设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换

注意:这里以7001端口的实例配置文件为参考,根据配置项修改其他配置文件
配置文件的名字为redis-端口号.conf

vim /redis/conf/redis-7001.conf
------------------------------------
bind 0.0.0.0
protected-mode yes
port 7001
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_7001.pid
loglevel notice
logfile "/redis/7001/logs/redis-7001.log"
dir /redis/7001/data
dbfilename dump-7001.rdb
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout  15000
requirepass "cxgbpgGwAfx6Jw3+Zeb"
masterauth "cxgbpgGwAfx6Jw3+Zeb"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
replica-serve-stale-data yes
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
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
aof-use-rdb-preamble yes
lua-time-limit 5000
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
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes

修改其他端口实例的配置文件,这里只需要在redis-7001.conf的基础上修改几个配置项就行,下面就只列出需要修改的配置项
192.168.31.101:7002

vim /redis/conf/redis-7002.conf
-----------------------------------
port 7002
pidfile /var/run/redis_7002.pid
logfile "/redis/7002/logs/redis-7002.log"
dir /redis/7002/data
dbfilename dump-7002.rdb
cluster-config-file nodes-7002.conf

192.168.31.101:7003

vim /redis/conf/redis-7003.conf
-----------------------------------
port 7003
pidfile /var/run/redis_7003.pid
logfile "/redis/7003/logs/redis-7003.log"
dir /redis/7003/data
dbfilename dump-7003.rdb
cluster-config-file nodes-7003.conf

192.168.31.101:7004

vim /redis/conf/redis-7004.conf
-----------------------------------
port 7004
pidfile /var/run/redis_7004.pid
logfile "/redis/7004/logs/redis-7004.log"
dir /redis/7004/data
dbfilename dump-7004.rdb
cluster-config-file nodes-7004.conf

192.168.31.101:705

vim /redis/conf/redis-7005.conf
-----------------------------------
port 7005
pidfile /var/run/redis_7005.pid
logfile "/redis/7005/logs/redis-7005.log"
dir /redis/7005/data
dbfilename dump-7005.rdb
cluster-config-file nodes-7005.conf

192.168.31.101:7006

vim /redis/conf/redis-7006.conf
-----------------------------------
port 7006
pidfile /var/run/redis_7006.pid
logfile "/redis/7006/logs/redis-7006.log"
dir /redis/7006/data
dbfilename dump-7006.rdb
cluster-config-file nodes-7006.conf

启动所有实例

/redis/bin/redis-server /redis/conf/redis-7001.conf
/redis/bin/redis-server /redis/conf/redis-7002.conf
/redis/bin/redis-server /redis/conf/redis-7003.conf
/redis/bin/redis-server /redis/conf/redis-7004.conf
/redis/bin/redis-server /redis/conf/redis-7005.conf
/redis/bin/redis-server /redis/conf/redis-7006.conf

查看服务启动状态

[root@redis ~]# ps -aux |grep redis |grep -v grep
root       5744  0.1  0.3 165076 10080 ?        Ssl  23:03   0:00 /redis/bin/redis-server 0.0.0.0:7001 [cluster]
root       5753  0.1  0.3 165076 10368 ?        Ssl  23:03   0:00 /redis/bin/redis-server 0.0.0.0:7002 [cluster]
root       5762  0.1  0.3 165076 10164 ?        Ssl  23:03   0:00 /redis/bin/redis-server 0.0.0.0:7003 [cluster]
root       5771  0.1  0.3 165076 10280 ?        Ssl  23:03   0:00 /redis/bin/redis-server 0.0.0.0:7004 [cluster]
root       5780  0.1  0.3 165076 10276 ?        Ssl  23:03   0:00 /redis/bin/redis-server 0.0.0.0:7005 [cluster]
root       5789  0.1  0.3 165076 10232 ?        Ssl  23:03   0:00 /redis/bin/redis-server 0.0.0.0:7006 [cluster]

配置集群状态,设置三主三从
6.0版本使用redis-cli工具,4.0版本使用redis-trib.rb工具
配置集群命令

/redis/bin/redis-cli -a 'cxgbpgGwAfx6Jw3+Zeb' --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1

如下所示

[root@redis ~]#/redis/bin/redis-cli -a 'cxgbpgGwAfx6Jw3+Zeb' --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
Adding replica 127.0.0.1:7006 to 127.0.0.1:7002
Adding replica 127.0.0.1:7004 to 127.0.0.1:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: a395b2915c35eeb519d92cebcdb39b1ae22873a2 127.0.0.1:7001
   slots:[0-5460] (5461 slots) master
M: fe4de7a19f807a8f1d8619d952dd238d1de032e0 127.0.0.1:7002
   slots:[5461-10922] (5462 slots) master
M: 416805f483bf902241f4cba6486a0522843be1b0 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
S: d1a749c3c01057a6ab893b4d3d6a37992c56f491 127.0.0.1:7004
   replicates 416805f483bf902241f4cba6486a0522843be1b0
S: 819862902afd8967c11c74b5cbb7a74da2f9104e 127.0.0.1:7005
   replicates a395b2915c35eeb519d92cebcdb39b1ae22873a2
S: ed211aef715726eab475d1c2a366504ad20ad326 127.0.0.1:7006
   replicates fe4de7a19f807a8f1d8619d952dd238d1de032e0
Can I set the above configuration? (type 'yes' to accept): 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 127.0.0.1:7001)
M: a395b2915c35eeb519d92cebcdb39b1ae22873a2 127.0.0.1:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 819862902afd8967c11c74b5cbb7a74da2f9104e 127.0.0.1:7005
   slots: (0 slots) slave
   replicates a395b2915c35eeb519d92cebcdb39b1ae22873a2
S: ed211aef715726eab475d1c2a366504ad20ad326 127.0.0.1:7006
   slots: (0 slots) slave
   replicates fe4de7a19f807a8f1d8619d952dd238d1de032e0
M: 416805f483bf902241f4cba6486a0522843be1b0 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: d1a749c3c01057a6ab893b4d3d6a37992c56f491 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 416805f483bf902241f4cba6486a0522843be1b0
M: fe4de7a19f807a8f1d8619d952dd238d1de032e0 127.0.0.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

–cluster-replicas 1:表示我们希望为集群中的每个主节点创建一个从节点
我们可以在随便一个实例的data目录下查看nodes-7001.conf文件来查看集群信息

[root@redis ~]# cat /redis/7001/data/nodes-7001.conf
819862902afd8967c11c74b5cbb7a74da2f9104e 127.0.0.1:7005@17005 slave a395b2915c35eeb519d92cebcdb39b1ae22873a2 0 1658286249600 1 connected
ed211aef715726eab475d1c2a366504ad20ad326 127.0.0.1:7006@17006 slave fe4de7a19f807a8f1d8619d952dd238d1de032e0 0 1658286251633 2 connected
416805f483bf902241f4cba6486a0522843be1b0 127.0.0.1:7003@17003 master - 0 1658286250617 3 connected 10923-16383
d1a749c3c01057a6ab893b4d3d6a37992c56f491 127.0.0.1:7004@17004 slave 416805f483bf902241f4cba6486a0522843be1b0 0 1658286250000 3 connected
fe4de7a19f807a8f1d8619d952dd238d1de032e0 127.0.0.1:7002@17002 master - 0 1658286248000 2 connected 5461-10922
a395b2915c35eeb519d92cebcdb39b1ae22873a2 127.0.0.1:7001@17001 myself,master - 0 1658286248000 1 connected 0-5460
vars currentEpoch 6 lastVoteEpoch 0

redis低版本群集创建(4.0)

安装包:redis-4.0.9.tar.gz
redis提供了redis-trib.rb工具,在安装包里的src目录中,将该工具复制到/usr/local/bin/目录下就可以使用

cp redis-4.0.9/src/redis-trib.rb /usr/local/bin/

如果redis版本比较低,则需要安装ruby

yum -y install ruby ruby-devel rubygems rpm-build

安装redis集群接口:

gem install redis

如果需要安装更高版本的话

yum -y install centos-release-scl-rh

注意:在centos7.2中yum默认安装的ruby的版本是2.0.0,有的需要更高版本
会在/etc/yum.repos.d/目录下多出一个CentOS-SCLo-scl-rh.repo源

yum -y install rh-ruby23
scl enable rh-ruby23 bash

查看安装版本:ruby -v
再次执行安装:

gem install redis

集群创建命令

redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006