目录
部署Redis服务
NoSQL概述
数据库类型
RDBMS
RDBMS软件
NoSQL
NoSQL软件
部署Redis服务
部署Redis服务
Redis介绍
安装软件
初始配置
管理服务
连接服务
常用命令
配置文件解析
配置分类
数据单位
常用配置
内存管理
设置连接
服务管理脚本
测试配置
关系型数据库管理系统
—— Relational Database Management System
—— 按照预先设置的组织结构(建库,建表),将数据存储到物理介质(硬盘)上
—— 数据之间可以做关联操作(外键)
主流的RDBMS软件
—— MySQL
—— MariaDB
—— Oracle
—— DB2
—— SQL Server
NoSQL(NoSQL = Not Only SQL)
—— 意思是“不仅仅是SQL”
—— 泛指非关系型数据库
—— 不需要预先定义数据存储结构(不需预先建表、建库)
—— 每条记录可以有不同的数据类型和字段个数
主流软件
—— Memcached
—— Redis
—— MongoDB
—— CouchDB
—— Neo4j
—— FlockDB
//Redis 和 Memcached 都是把数据存储在内存中,Redis相比于Memcached优点在于,Redis会把数据先放在内存里,服务在运行过程中定期的将内存数据存储到硬盘中。
Remote Dictionary Server(远程字典服务器)
—— 是一款高性能的(Key/Values)分布式内存数据库
—— 支持数据持久化(定期把内存里的数据存储到硬盘)
—— 支持多种数据类型string、list、hash ... ...
—— 支持 master-slave 模式数据备份
—— 中文网站 www.redis.cn
源码编译安装
—— Redis-4.0.11下载地址:http://www.redis.cn/download.html
将下载好的软件包上传到操作系统中:
[root@host50 ~]# ls /root
[root@host50 ~]# rpm -q gcc //源码安装需要使用编译软件gcc
gcc-4.8.5-44.el7.x86_64
[root@host50 ~]# yum -y install gcc //若没有安装gcc,请安装gcc
[root@host50 ~]# tar -zxvf redis-4.0.11.tar.gz
[root@host50 ~]# cd redis-4.0.11
[root@host50 redis-4.0.11]# make
[root@host50 redis-4.0.11]# make install
主机192.168.233.51也需要安装redis服务,操作步骤和上面一样。
配置服务运行参数
—— ]# ./utils/install_serversh //初始化(使用默认初始化配置)
—— 端口 ---> 6379
—— 主配置文件 /etc/redis/6379.conf
—— 日志文件 /var/log/redis_6379.log
—— 数据库目录 /var/lib/redis/6379
—— 服务启动程序 /usr/local/bin/redis-server
—— 命令行连接命令 /usr/local/bin/redis-cli
[root@host50 redis-4.0.11]# ./utils/install_server.sh //使用默认初始化配置,全部选项都按回车
//如图所示,我们可以看见初始化配置参数。安装完成后Redis服务会自动开启
[root@host50 redis-4.0.11]# netstat -lntup | grep 6379 //查看服务是否运行
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 36969/redis-server
//Redis服务默认使用的地址是127.0.0.1,说明此服务只接收本机的访问。
[root@host50 redis-4.0.11]# ls /etc/redis/6379.conf //查看主配置文件
/etc/redis/6379.conf
[root@host50 redis-4.0.11]# ls /var/lib/redis/6379 //查看数据库目录,没有输出结果,数据库目录为空,因为还没有存储数据
[root@host50 redis-4.0.11]# ls /var/log/redis_6379.log //查看日志文件
/var/log/redis_6379.log
[root@host50 redis-4.0.11]# ls /usr/local/bin/ //查看与redis服务相关的命令
相关命令
—— ]# /etc/init.d/redis_6379 stop //停止服务
—— ]# /etc/init.d/redis_6379 start //启动服务
—— ]# /etc/init.d/redis_6379 status //查看服务状态
—— ]# ps -C redis-server //查看进程
—— ]# netstat -lntup | grep 6379 //查看端口
[root@host50 ~]# ls /etc/init.d/redis_6379 //调用这个脚本文件来启动或停止服务
/etc/init.d/redis_6379
[root@host50 ~]# /etc/init.d/redis_6379 stop //停止服务
Stopping ...
Redis stopped
[root@host50 ~]# netstat -lntup | grep 6379 //没有监听的端口,说明服务已经停止
[root@host50 ~]# /etc/init.d/redis_6379 start //启动服务
Starting Redis server...
[root@host50 ~]# netstat -lntup | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 37820/redis-server
[root@host50 ~]# /etc/init.d/redis_6379 status //查看服务状态
Redis is running (37820)
访问redis服务
—— redis-cli 默认连接本机的redis服务
[root@host50 ~]# redis-cli //连接redis服务
127.0.0.1:6379> ping //ping一下redis服务,输出结果显示PONG说明连接正常
PONG
127.0.0.1:6379> set name bob //存数据,目前存储在本机的内存中,会定期存储到硬盘里
OK
127.0.0.1:6379> get name //取数据
"bob"
127.0.0.1:6379> exit //断开连接
[root@host50 ~]# ls /var/lib/redis/6379/ //dump.rdb是硬盘里的数据,用来保存内存里数据的文件
dump.rdb
[root@host50 ~]# redis-cli
127.0.0.1:6379> get age //取数据时,如果输出结果显示(nil),说明服务器上没有这个变量
(nil)
127.0.0.1:6379> get name //如果有这个变量,就会返回这个变量的值
"bob"
127.0.0.1:6379> keys * //查看服务器上所有已存储的变量
1) "name"
—— set key名 key值 //存储1个key值
—— mset key名列表 //存储多个key值
—— get key名 //获取key值
—— mget //获取多个key值
—— select 数据库编号0-15 //切换库
—— keys * //显示所有key名
—— keys a? //显示指定key名
—— exists key名 //测试key名是否存在
—— ttl key名 //查看key生存时间
—— type key名 //查看key类型
—— move key名 库编号 //移动key到指定库
—— expire key名 数字 //设置key在内存里有效时间
—— del key名 //删除指定的key
—— flushall //删除内存里所有key
—— flushdb //删除当前所在库的所有key
—— save //保存所有key到硬盘
—— shutdown //停止服务
mset key名列表 //存储多个key值
127.0.0.1:6379> mset x 1 y 2 z 3
127.0.0.1:6379> keys *
1) "name"
2) "x"
3) "y"
4) "z"
mget //获取多个key值
127.0.0.1:6379> mget x y name z
1) "1"
2) "2"
3) "bob"
4) "3"
select 数据库编号0-15 //切换库
—— 默认一共有16个库,当面默认是在0号库中
127.0.0.1:6379> select 16 //数据库编号只有0-15,输入以外的编号会报错,报错意思是索引超出了范围
(error) ERR DB index is out of range
127.0.0.1:6379> select 1 //切换到1号库
OK
127.0.0.1:6379[1]> // 切换到2号库
127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]>
//如图所示,切换到几号库,前面就会显示库的编号,0号库不显示库的编号
keys a? //显示指定key名
—— ?是通配符,表示任意一个字符
127.0.0.1:6379> keys ? //查看1个字符的变量
1) "x"
2) "y"
3) "z"
127.0.0.1:6379> keys ???? //查看4个字符的变量
1) "name"
127.0.0.1:6379> keys n??? //查看一共有4个字符的变量,且变量名要以n开头
1) "name"
exists key名 //测试key名是否存在
127.0.0.1:6379> get y //此时变量y已经存在
"2"
127.0.0.1:6379> set y 200 //再次给变量y赋值
OK
127.0.0.1:6379> get y //y会被覆盖赋值,原来的值就不在了,变为新存储的值
"200"
127.0.0.1:6379> exists i //查看变量i是否已存在,输出结果是0表示不存在
(integer) 0
127.0.0.1:6379> exists y //查看变量y是否已存在,输出结果是1表示存在
(integer) 1
ttl key名 //查看key生存时间
—— 查看变量还能在内存里存多长时间,默认情况下我们存储变量时不会定义生存时间,即永不过期,只要不手动删除这个变量,这个变量就会一直存储在内存中。
127.0.0.1:6379> ttl y //查看变量y的生存时间,返回值为-1表示变量y永不过期
(integer) -1
expire key名 数字 //设置key在内存里有效时间
—— 设置key在内存里有效时间,即可以在内存里存多久,到时后会自动删除key
127.0.0.1:6379> expire y 20 //设置变量y,过期时间单位是秒,即20秒之后过期,过期后会自动把过期的变量删除
(integer) 1 //返回值为1表示设置成功
127.0.0.1:6379> ttl y //查看变量y的生存时间,过期时间还剩7秒
(integer) 7
127.0.0.1:6379> ttl y //查看变量y的生存时间,返回值为-2表示变量y已经过期了
(integer) -2
127.0.0.1:6379> keys * //查看已有所有变量,没有变量y,说明变量y因为过期已被自动删除
1) "name"
2) "x"
3) "z"
type key名 //查看key类型
—— 查看变量类型,默认情况下,用 set/mset 命令存储的变量类型都是字符型
127.0.0.1:6379> set f 99 //使用 set 命令存储变量 f
OK
127.0.0.1:6379> type f //查看变量 f 的类型为string,即字符型
string
127.0.0.1:6379> mset age 21 //使用 mset 命令存储变量 age
OK
127.0.0.1:6379> type age //查看变量 age 的类型为string,即字符型,即使赋的值是数字,也是字符型
string
127.0.0.1:6379> lpush xxx a b c //使用 lpush 命令存储变量 xxx
(integer) 3
127.0.0.1:6379> type xxx //查看变量 xxx 的类型为list,即列表型
list
del key名 //删除指定的key,一次删一个
127.0.0.1:6379> keys *
1) "age"
2) "name"
3) "f"
4) "xxx"
5) "x"
6) "z"
127.0.0.1:6379> del xxx //删除变量xxx,返回值为1说明删除成功
(integer) 1
127.0.0.1:6379> keys * //查看所有已有变量,没有变量xxx,说明已被删除
1) "age"
2) "name"
3) "f"
4) "x"
5) "z"
move key名 库编号 //移动key到指定库
127.0.0.1:6379> keys * //查看当前0号库里所有的变量
1) "age"
2) "name"
3) "f"
4) "x"
5) "z"
127.0.0.1:6379> move x 1 //将变量x从当前库(0号库)移动到1号库中,返回值为1说明移动成功
(integer) 1
127.0.0.1:6379> move z 1 //将变量z从当前库(0号库)移动到1号库中,返回值为1说明移动成功
(integer) 1
127.0.0.1:6379> keys * //查看当前0号库里所有的变量,发现没有变量x和z了
1) "age"
2) "name"
3) "f"
127.0.0.1:6379> select 1 //切换到1号库
OK
127.0.0.1:6379[1]> keys * //查看1号库中的变量,发现有变量x和z
1) "x"
2) "z"
flushdb //删除当前所在库的所有key
127.0.0.1:6379[1]> flushdb //删除当前所在库(1号库)的所有变量
OK
127.0.0.1:6379[1]> keys * //1号库中为空,说明1号库里的所有变量已被删除
(empty list or set)
flushall //删除内存里所有key,删除所有变量
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys * //查看0号库的所有变量
1) "age"
2) "name"
3) "f"
127.0.0.1:6379> flushall //删除内存里所有key,删除所有变量,即删除所有库里的所有变量
OK
127.0.0.1:6379> keys * //查看0号库的发现为空,说明0号库的所有变量已被删除
(empty list or set)
save //保存所有key到硬盘
—— 默认情况下,redis服务在运行过程中,定期将内存里的数据存储到硬盘中。管理员可以手动使用save命令,手动将现在的内存数据保存到硬盘里,不等服务按指定时间间隔去存。
shutdown //停止服务
—— 效果和使用脚本 /etc/init.d/redis_6379 stop 停止服务一样,都会将数据写入硬盘中。
—— 不管到没到定期存储数据到硬盘的时间,只要停止服务,都会将内存里的数据存储到硬盘。
127.0.0.1:6379> set x 99
OK
127.0.0.1:6379> keys * //此时变量x的数据是存储在内存里面的
1) "x"
127.0.0.1:6379> shutdown //停止服务
not connected> ping //此时服务已停止,还在redis服务的命令行中,连接提示符显示没连接上
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> exit //退出redis服务命令行
[root@host50 ~]# netstat -lntup | grep 6379 //没有监听接口,说明服务已经停止运行
[root@host50 ~]# /etc/init.d/redis_6379 start //启动服务
Starting Redis server...
[root@host50 ~]# redis-cli
127.0.0.1:6379> keys * //重新启动服务后,依旧可以看见数据,说明变量x的数据已存入硬盘中,且启动服务后,会将硬盘里的数据调到内存中。
1) "x"
具体如下
配置项名称 |
说明 |
INCLUDES |
装载配置 |
MODULES |
模块配置 |
NETWORK |
网络配置 |
GENERAL |
常规配置 |
SNAPSHOTTING |
快照配置 |
REPLICATION |
复制配置(主从同步) |
SECURITY |
安全配置 |
CLIENTS |
客户端配置 |
MEMORY MANAGEMENT |
内存管理配置 |
数据单位
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# units are case insensitive so 1GB 1Gb 1gB are all the same. #意思是数据单位不区分字母大小写
—— port 6379 //端口
—— bind 127.0.0.1 //IP地址
—— daemonize yes //守护进程方式运行
—— databases 16 //数据库个数
—— logfile /var/log/redis_6379.log //日志文件
—— maxclients 10000 //并发连接数量
—— dir /var/lib/redis/6379 //数据库目录
注:守护进程方式运行是指服务启动之后,会一直有一个进程在内存里活跃着,等待客户端来连接。
非守护进程方式运行是指服务启动之后,会有一个进程,当长时间没有客户端访问时,进程会进入休眠状态,当有客户端访问时,由另一个服务唤醒处于休眠状态的redis进程,然后再提供服务。
[root@host50 ~]# vim /etc/redis/6379.conf
70 bind 127.0.0.1 //IP地址的配置位于配置文件的第70行
93 port 6379 //端口的配置位于配置文件的第93行
137 daemonize yes //端口的配置位于配置文件的第137行
172 logfile /var/log/redis_6379.log //日志文件的配置位于配置文件的第172行
187 databases 16 //数据库个数的配置位于配置文件的第187行
264 dir /var/lib/redis/6379 //数据库目录的配置位于配置文件的第264行
533 # maxclients 10000 //并发连接数量的配置位于配置文件的第533行
内存清除策略
—— volatile-lru //最近最少使用(针对设置了TTL的key,即设置了有效期的变量)
—— allkeys-lru //删除最少使用的key(针对所有的key,即所有变量,包括设置与没设置有效期的)
—— allkeys-lfu //从所有key中清除使用频率最少的key
—— volatile-lfu //从所有配置了过期时间的key中清除使用频率最少的key
—— volatile-random //在设置了TTL的key里随机移除
—— allkeys-random //随机移除key,所有的key里进行随机删除
—— volatile-ttl(minor TTL) //移除最近过期的key
—— noeviction //不删除,写满时报错
[root@host50 ~]# vim /etc/redis/6379.conf
//如图所示,配置文件中第565~572是redis服务提供的内存清除策略,在安装软件的过程中,这些内存清除策略的程序也就安装在系统上了,我们只需要修改配置文件调用即可。策略名称 -> 策略解释
优化设置
—— maxmemory //最大内存
—— maxmemory-policy //定义使用策略
—— maxmemory-samples //选取key模板的个数(针对 lru 和 ttl 策略)
560 # maxmemory
591 # maxmemory-policy noeviction //在配置文件中第591行,定义了默认使用的策略,默认使用策略是noeviction,即不删除,写满时报错。
602 # maxmemory-samples 5 //删除内存中变量时,参照的标准变量的个数,默认模板个数是5。只对最近最少使用和过期时间这两个策略的变量有效。
设置密码、ip地址、端口
—— redis服务默认是不需要使用密码登录的
注意:生产环境中redis服务器是内存存储服务器,redis服务器一般不设置连接密码,redis服务的安全应该由linux操作系统来完成,通过系统设置防火墙服务,来允许谁来访问本机的redis服务。
1、设置密码、ip地址、端口
[root@host50 ~]# vim /etc/redis/6379.conf
70 bind 192.168.233.50 //修改配置文件第70行,修改允许连接redis服务的ip地址
93 port 6350 // 修改配置文件第93行,修改redis服务的端口号
501 requirepass 123456 //修改配置文件第501行,去掉注释并设置密码为123456
[root@host50 ~]# /etc/init.d/redis_6379 stop
[root@host50 ~]# /etc/init.d/redis_6379 start //重启服务,使修改的配置生效
[root@host50 ~]# netstat -lntup | grep 6350 //查看监听端口号和允许连接的ip地址
tcp 0 0 192.168.233.50:6350 0.0.0.0:* LISTEN 1046/redis-server 1
2、连接服务
错误连接方式说明
[root@host50 ~]# redis-cli //此命令连接时,默认的连接ip地址是127.0.0.1,默认的端口号是6379,由于修改了连接的ip地址和端口号,所以当不指定这两个参数时,连接请求被拒绝了。
Could not connect to Redis at 127.0.0.1:6379: Connection refused
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> exit
[root@host50 ~]# redis-cli -h 192.168.233.50 -p 6350 //-h指定连接的ip地址,-p指定连接的端口号,设置密码后不使用密码也能登录,但是登陆后不能进行任何操作。
192.168.233.50:6350> keys * //由于没有使用密码登录,所以显示认证错误
(error) NOAUTH Authentication required.
正确连接方式
—— 当修改了redis服务登录的密码、ip地址、端口中的任意一项,之后登录都需要指定修改后的登录的密码、ip地址、端口进行登录。
使用密码登录的方式一:
[root@host50 ~]# redis-cli -h 192.168.233.50 -p 6350 //进入redis服务后,使用密码登录
192.168.233.50:6350> auth 123456 //输入密码
OK
192.168.233.50:6350> exit
使用密码登录的方式二:
[root@host50 ~]# redis-cli -h 192.168.233.50 -p 6350 -a 123456 //使用选项-a指定密码登录,会警告你使用-a选项登录,密码会显示在命令行上不安全,并不是报错。
Warning: Using a password with '-a' option on the command line interface may not be safe.
192.168.233.50:6350>
注:当在配置文件中修改登录密码、ip地址、端口号中的任意一项之后,启动还是可以使用脚本启动服务,但是停止就不能使用脚本停止服务了,即不能使用 /etc/init.d/redis_6379 stop 这种方式停止服务,原因和解决方案如下:
[root@host50 ~]# /etc/init.d/redis_6379 stop
//如图所示,我们停止redis服务的ip地址是127.0.0.1、端口号是6379,由于我们修改了IP地址和端口号,所以使用脚本停止服务会失败。
停止服务的方法一:
192.168.233.50:6350> shutdown //在redis服务的命令行里使用命令 shutdown 停止服务
停止服务的方法二:
[root@host50 ~]# redis-cli -h 192.168.233.50 -p 6350 shutdown //停止服务,在操作系统命令行后面,加shutdown停止服务,注意需要指定修改后的密码、ip地址、端口。
脚本常见配置(变量)
—— EXEC=/usr/local/bin/redis-server //变量EXEC是启动服务的命令
—— CLIEXEC=/usr/local/bin/redis-cli //变量CLIEXEC是用来连接服务的命令
—— PIDFILE=/var/run/redis_6379.pid //变量PIDFILE是存放redis服务pid号的文件
—— CONF="/etc/redis/6379.conf" //变量CONF是redis服务的主配置文件
—— REDISPORT="6379" //变量REDISPORT是redis服务的默认端口号
[root@host50 ~]# vim /etc/init.d/redis_6379
修改redis服务管理脚本
—— ]# vim /etc/init.d/redis_6379
—— 当在配置文件中修改登录密码、ip地址、端口号中的任意一项之后,停止服务就不能使用脚本停止服务了。通过修改脚本,使得修改密码、ip地址、端口后,依旧可以使用脚本停止服务
[root@host50 ~]# vim /etc/init.d/redis_6379
43 $CLIEXEC -h 192.168.233.50 -p 6350 -a 123456 shutdown //将配置文件中的第43行修改成这个样子,需要指定修改后密码、ip地址、端口,该哪一项配置就添加哪一项。
//红圈圈起来的地方是配置文件中需要修改的地方。
[root@host50 ~]# netstat -lntup | grep 6350
tcp 0 0 192.168.233.50:6350 0.0.0.0:* LISTEN 3473/redis-server 1
[root@host50 ~]# /etc/init.d/redis_6379 stop //使用脚本关闭服务,输出结果是警告使用-a选项输入密码不安全,不是报错。
Stopping ...
Warning: Using a password with '-a' option on the command line interface may not be safe.
Waiting for Redis to shutdown ...
Redis stopped
[root@host50 ~]# netstat -lntup | grep 6350 //查看监听端口,没有输出结果说明服务已停止
测试配置方法
—— 通过主机51连接redis服务器50,并插入数据
—— 查看redis服务器50数据是否插入成功
1、关闭主机50和51的防火墙和SELinux
[root@host50 ~]# systemctl stop firewalld
[root@host50 ~]# setenforce 0
[root@host51 ~]# systemctl stop firewalld
[root@host51 ~]# setenforce 0
2、客户端51连接redis服务器50
主机192.168.233.51:
[root@host51 ~]# redis-cli -h 192.168.233.50 -p 6350 -a 123456
192.168.233.50:6350> keys *
1) "x"
3、客户端51存入数据
主机192.168.233.51:
192.168.233.50:6350> set name bob
OK
192.168.233.50:6350> set age 19
OK
192.168.233.50:6350> set sex boy
OK
192.168.233.50:6350> keys *
1) "x"
2) "name"
3) "sex"
4) "age"
192.168.233.50:6350> exit
4、redis服务器50登录验证客户端51存入的数据
主机192.168.233.50
[root@host50 ~]# redis-cli -h 192.168.233.50 -p 6350 -a 123456
192.168.233.50:6350> keys *
1) "x"
2) "name"
3) "sex"
4) "age"