聊一聊Centos 7中的Redis(非关系型数据库)
博文目录
一、关系型数据库与非关系型数据库
二、Redis数据库简介
三、Redis安装部署
四、Redis命令工具
Redis数据库是一个非关系型数据库,在讨论Redis之前,我们先了解关系型数据库与非关系型数据库的概念。
一、关系型数据库与非关系型数据库
数据库按照其结构可以分为关系型数据库与其他数据库,而这些其他数据库我们将其统称为非关系型数据库。
1、关系型数据库
关系型数据库是一个结构化的数据库,创建在关系模型基础上,一般面向记录。它借助于集合代数等数学概念和方法来处理数据库中的数据。关系模型指二维表格模型,因而一个关系型数据库就由二维表及其之间的联系组成的一个数据组织。实际中,各种实体与实体之间的各种联系都可以用关系模型来表示。SQL语句就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据中数据的检索和操作。
主流的关系型数据库包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等。
2、非关系型数据库
NoSQL(NoSQL = Not Only SQL),意思是“不仅仅是SQL”,是非关系型数据库的总称。主流的NoSQL数据库有Redis、MongBD、CouhDB等。以上这些数据库,它们的存储方式、存储结构以及使用的场景都是完全不同的。所有我们认为它是一个非关系型数据库的集合,而不是像关系型数据库一样,是一个统称。换言之,主流的关系型数据库以外的数据库,都是非关系型的。NoSQL数据库凭借着其非关系型、分布式、开源和横向扩展等优势,被认为是下一代数据库产品。
3、非关系型数据库可以解决关系型数据库产生的三高问题
-
High performance——对数据库高并发读写需求;
-
Huge Storage——对海量数据高效存储与访问需求;
- High Scalability && High Availability——对数据库高可扩展性与高可用性需求;
关系型数据库和非关系型数据库都有各自的特点与应用场景,两者精密结合将会给Web 2.0的数据库发展带来新的思路。让关系型数据库关注在关系上,非关系型数据库关注在存储上。
二、Redis数据库简介
Redis是一个开源的、使用C语言编写、支持网络、可基于内存也可持久化的日志类型、key-value(键值对)数据库,是目前分布式架构中不可或缺的一环。
Redis服务器是单进程模型,也就是在一台服务器上可以同时启动多个Redis进程,而Redis的实际处理速度则完全依靠主进程的执行效率。若在服务器上只运行一个Redis进程,当多个客户端同时访问时,服务器的处理能力会有一定程度的下降;若在同一台服务器上开启多个Redis进程,Redis在提高并发处理能力的同时会给服务器的CPU造成很大的压力。也就是说,在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程。若对高并发要求更高些,可能会考虑在同一台服务器上开启多个进程;若CPU资源比较紧张,采用单进程即可。
Redis具有以下几个特点:
具有极高的读写速度,数据读取的速度最高可达到110000次/s,数据的写入速度最高可以达到81000次/s;
支持丰富的数据类型,不仅仅支持简单的key-value数据类型,还支持strings、lists、hashes、sets及ordered sets等数据类型操作;
支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用;
原子性,Redis所有操作都是原子性的;
- 支持数据备份,即master-salve模式的数据备份;
Redis作为基于内存运行的数据库,缓存是其比较常应用的场景之一,除此之外,Redis常见应用场景还包括获取最新N个数据的操作、排行榜类应用、计数器应用、存储关系、实时分析系统、日志记录等。
三、Redis安装部署
Redis官网:https://www.redis.io 或者:https://pan.baidu.com/s/1xdDZzTGdOOWFwpJtZtwRaw
提取码:xuqg 下载相应的源码软件包,然后上传至Linux系统的服务器中进行解压、安装。
通常情况下在Linux系统中进行源码编译安装,需要先执行./configure进行环境检查与配置,从而生成Makefile文件,再执行make &&make install命令进行编译安装。而Redis源码包中直接提供了Makefile文件,所以再解压完软件包后,可直接进入解压缩后的软件包目录,执行make与make install命令进行安装即可。
[aaa@qq.com ~]# tar zxvf redis-3.2.9.tar.gz -C /usr/src/<!--解包-->
[aaa@qq.com ~]# mv /usr/src/redis-3.2.9/ /usr/src/redis/
<!--将redis所有配置文件剪切到/usr/src/redis/目录-->
[aaa@qq.com ~]# cd /usr/src/redis/ <!--进入redis目录-->
[aaa@qq.com redis]# ls
00-RELEASENOTES COPYING Makefile redis.conf runtest-sentinel tests
BUGS deps MANIFESTO runtest sentinel.conf utils
CONTRIBUTING INSTALL README.md runtest-cluster src
[aaa@qq.com redis]# make && make install <!--编辑及安装redis-->
<!--(若想更改安装路径,可以使用make PREFIX=安装路径 install命令格式来进行安装)-->
make install只是安装了二进制文件到系统中,并没有启动脚本和配置文件。软件包中默认提供了一个install_server.sh脚本文件,通过该脚本文件可以设置Redis服务所需要的相关配置文件。当脚本运行完毕,Redis服务就已经启动,默认侦听端口为6379。
[aaa@qq.com ~]# cd /usr/src/redis/utils/ <!--进入utils目录-->
[aaa@qq.com utils]# ./install_server.sh <!--初始化redis-->
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]<!--回车键即可-->
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
<!--回车键即可-->
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
<!--回车键即可-->
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
<!--回车键即可-->
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]
<!--回车键即可-->
Selected config:
Port : 6379 <!--端口号,默认允许6379-->
Config file : /etc/redis/6379.conf <!--redis主配置文件-->
Log file : /var/log/redis_6379.log <!--redis日志文件-->
Data dir : /var/lib/redis/6379 <!--设置数据目录-->
Executable : /usr/local/bin/redis-server <!--执行命令-->
Cli Executable : /usr/local/bin/redis-cli <!--客户端命令-->
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[aaa@qq.com ~]# netstat -anptu | grep redis<!--监听redis是否启动-->
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 5141/redis-server 1
安装完成后,可通过Redis的服务控制脚本/etc/init.d/redis_6379来对Redis服务进行控制,如停止Redis服务、启动Redis服务、重启Redis服务、查看Redis运行状态。
[aaa@qq.com ~]# /etc/init.d/redis_6379 start <!--启动Refis服务-->
[aaa@qq.com ~]# /etc/init.d/redis_6379 stop <!--停止Redis服务-->
[aaa@qq.com ~]# /etc/init.d/redis_6379 restart <!--重启Redis服务-->
[aaa@qq.com ~]# /etc/init.d/redis_6379 status <!--查看Redis运行状态-->
1、配置参数
Redis主配置文件为/etc/redis/6379.conf,由注释行与设置行两部分组成。与大多数Linux配置文件一样,注释性的文字以“#”开始,包含了对相关配置内容进行的说明和解释。注释行与空行以外的内容即为设置行。可根据生产环境的需求调整相关参数。如:
[aaa@qq.com ~]# vim /etc/redis/6379.conf
<!--修改redis主配置文件启动群集功能-->
62 bind 192.168.100.10 <!--监听的主机地址-->
85 port 6379 <!--监听端口号-->
129 daemonize yes <!--启动守护进程-->
pidfile /var/run/redis_6379.pid <!--指定PID文件-->
loglevel notice <!--日志级别-->
logfile "/var/log/redis_6379.log" <!--指定日志文件-->
[aaa@qq.com ~]# /etc/init.d/redis_6379 restart <!--重启redis服务-->
除了上述配置参数外,Redis主配置文件中还包含很多其他的配置参数,具体内如下:
四、Redis命令工具
Redis软件提供了多个命令工具,当Redis安装时,所包含的软件工具会同时被安装到系统中,在系统中可以直接使用。这些命令工具的作用分别如下所示:
redis-server:用于启动Redis的工具;
redis-benchmark:用于检测Redis在本机的运行效率;
redis-check-aof:修复AOF持久化文件;
redis-check-rdb:修复RDB持久化文件;
redis-cli:Redis命令行工具;
- redis-setinel:redis-server文件的软连接;
1、redis-cli命令行工具
Redis数据库系统也是一个典型的C/S(客户端/服务器端)架构的应用,要访问Redis数据库需要使用专门的客户端软件。Redis服务的客户端软件就是其自带的redis-cli命令行工具。使用redis-cli连接指定数据库,连接成功后会进入提示符为“远程主机IP地址:端口号>” 的数据库操作环境。
用户可以输入各种操作语句对数据库进行管理,如执行ping命令可以检测redis服务是否启动。
[aaa@qq.com ~]# redis-cli <!-- 登录本地redis数据库-->
192.168.100.10:6379> ping <!--检测redis服务是否启动-->
PONG
192.168.100.10:6379> exit <!--退出数据库-->
在进行数据库连接操作时,可以通过选项来指定远程主机上的Redis数据库,命令语法为redis-cli -h host -p port -a password。其中,“-h”指定远程主机;“-p指定服务的端口号”,若设置了密码,可以用“-a”指定密码,若没设置连接密码,则可以省略“-a”选项。
[aaa@qq.com ~]# redis-cli -h 192.168.100.10 -p 6379
<!--登录远程主机100.10的6379端口redis实例-->
192.168.100.10:6379> info
# Server
redis_version:3.2.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:2cc10a3065b1ebc2
............ <!--此处省略部分内容-->
db0:keys=1,expires=0,avg_ttl=0
192.168.100.10:6379> exit <!--退出数数据库-->
在数据库操作环境中,使用help命令可以获取命令类型的帮助。其中,有三种获取命令帮助的方式:
help @<group>:获取<group>中的命令列表;
help <command>:获取某个命令的帮助;
- help <tab>:获取可能帮助的主题列表;
具体操作方式如下所示:
[aaa@qq.com ~]# redis-cli
192.168.100.10:6379> help @list <!--查看所有与List数据类型有关的命令-->
BLPOP key [key ...] timeout
summary: Remove and get the first element in a list, or block until one is available
since: 2.0.0
BRPOP key [key ...] timeout
summary: Remove and get the last element in a list, or block until one is available
since: 2.0.0
BRPOPLPUSH source destination timeout
summary: Pop a value from a list, push it to another list and return it; or block until one is available
since: 2.2.0
LINDEX key index
summary: Get an element from a list by its index
since: 1.0.0
LINSERT key BEFORE|AFTER pivot value
summary: Insert an element before or after another element in a list
since: 2.2.0
LLEN key
summary: Get the length of a list
since: 1.0.0
LPOP key
summary: Remove and get the first element in a list
since: 1.0.0
LPUSH key value [value ...]
summary: Prepend one or multiple values to a list
since: 1.0.0
LPUSHX key value
summary: Prepend a value to a list, only if the list exists
since: 2.2.0
LRANGE key start stop
summary: Get a range of elements from a list
since: 1.0.0
LREM key count value
summary: Remove elements from a list
since: 1.0.0
LSET key index value
summary: Set the value of an element in a list by its index
since: 1.0.0
LTRIM key start stop
summary: Trim a list to the specified range
since: 1.0.0
RPOP key
summary: Remove and get the last element in a list
since: 1.0.0
RPOPLPUSH source destination
summary: Remove the last element in a list, prepend it to another list and return it
since: 1.2.0
RPUSH key value [value ...]
summary: Append one or multiple values to a list
since: 1.0.0
RPUSHX key value
summary: Append a value to a list, only if the list exists
since: 2.2.0
127.0.0.1:6379> help set <!--查看set命令的命令帮助-->
SET key value [EX seconds] [PX milliseconds] [NX|XX]
summary: Set the string value of a key
since: 1.0.0
group: string
127.0.0.1:6379> help get <!--查看get命令的命令帮助-->
GET key
summary: Get the value of a key
since: 1.0.0
group: string
2、redis-benchmark测试工具
redis-benchmark是官方自带的Redis性能测试工具,可以有效地测试Redis服务的性能。基本的测试语法为redis-benchmark [option] [option value]。常用选项如下所示:
-h:指定服务器主机名;
-p:指定服务器端口;
-s:指定服务器socket;
-c:指定并发连接数;
-n:指定请求数;
-d:以字节(B)的形式指定SET/GET值的数据大小;
-k:1=keep alive 0=reconnect;
-r:SET/GET/INCR 使用随机key,SADD使用随机值;
-p:通过管道传输<numreq>请求;
-q:强制退出redis。仅显示query/sec值;
--csv:以CSV格式输出;
-l:生成循环,永久执行测试;
-t:仅运行以逗号分隔的测试命令列表;
- -i:idle模式。仅打开N个idle连接并等待;
结合上述选项,可以针对某台Redis服务器进行性能检测,如执行redis-benchmark -h 192.168.100.10 -p 6379 -c 100 -n 10000命令即可向IP地址192.168.100.10、端口为6379的Redis服务器发送100个并发连接与10000个请求测试性能:
[aaa@qq.com ~]# redis-benchmark -h 192.168.100.10 -p 6379 -c 100 -n 10000
………… <!--此处省略部分内容-->
5165.29 requests per second
====== MSET (10 keys) ======
10000 requests completed in 0.18 seconds
100 parallel clients
3 bytes payload
keep alive: 1
0.01% <= 1 milliseconds
98.93% <= 2 milliseconds
100.00% <= 2 milliseconds
55555.55 requests per second
执行redis-benchmark -h 192.168.100.10 -p 6379 -q -d 100命令的作用是测试存取大小为100B的数据包性能:
[aaa@qq.com ~]# redis-benchmark -h 192.168.100.10 -p 6379 -q -d 100
PING_INLINE: 100603.62 requests per second
PING_BULK: 98231.83 requests per second
SET: 87412.59 requests per second
GET: 90991.81 requests per second
INCR: 94786.73 requests per second
LPUSH: 86206.90 requests per second
RPUSH: 82987.55 requests per second
LPOP: 84245.99 requests per second
RPOP: 87108.02 requests per second
SADD: 90744.10 requests per second
SPOP: 90661.83 requests per second
LPUSH (needed to benchmark LRANGE): 85251.49 requests per second
LRANGE_100 (first 100 elements): 23912.00 requests per second
LRANGE_300 (first 300 elements): 6502.37 requests per second
LRANGE_500 (first 450 elements): 3816.07 requests per second
LRANGE_600 (first 600 elements): 2778.09 requests per second
MSET (10 keys): 54141.85 requests per second
还可以测试某些操作的性能,例如,执行redis-benchmark -t set,lpush -n 100000 -q命令的作用是测试本机上Redis服务在运行set与lpush操作时的性能:
[aaa@qq.com ~]# redis-benchmark -t set,lpush -n 100000 -q
SET: 81037.28 requests per second
LPUSH: 88652.48 requests per second
五、Redis数据库常用命令
Redis数据库采用key-value(键值对)的数据存储形式,所使用的命令是set和get。
set:存放数据,命令格式为set key value;
- get:获取数据,命令格式为get key;
例如,在Redis的命令行模式下执行“set xingming liyanxin”,表示在当前数据库下存放一个key为xingming,value为liyanxin的数据,而执行“get xingming”命令即可查看存放的数据。
[aaa@qq.com ~]# redis-cli
192.168.100.10:6379> set xingming liyanxin
OK
192.168.100.10:6379> set xingbie nan
OK
192.168.100.10:6379> get xingming
"liyanxin"
192.168.100.10:6379> get xingbie
"nan"
1、Key相关命令
1)keys
*使用keys命令可以获取符合规则的键值列表,通常情况可以结合、?等选项来使用。**
192.168.100.10:6379> set k1 1
OK
192.168.100.10:6379> set k2 2
OK
192.168.100.10:6379> set v1 3
OK
192.168.100.10:6379> set v2 4
OK
192.168.100.10:6379> set v33 6
OK
192.168.100.10:6379> KEYS *
<!--查看当前数据库中所有键-->
1) "xingming"
2) "xingbie"
3) "k1"
4) "k2"
5) "v1"
6) "v2"
7) "v33"
192.168.100.10:6379> KEYS v*
<!--查看当前数据库中以v开头的所有数据-->
1) "v1"
2) "v2"
3) "v33"
192.168.100.10:6379> KEYS v?
<!--查看当前数据库中以v开头后面包含任意一位的数据-->
1) "v1"
2) "v2"
192.168.100.10:6379> KEYS v??
<!--查看当前数据库中以v开头后面包含任意两位的数据-->
1) "v33"
192.168.100.10:6379> KEYS k*
<!--查看当前数据库中以k开头的所有数据-->
1) "k2"
2) "k1"
192.168.100.10:6379> KEYS k?
<!--查看当前数据库中以k开头后面包含任意一位的数据-->
1) "k2"
2) "k1"
2)exists
使用exists命令可以判断键值是否存在。
192.168.100.10:6379> EXISTS xingming
(integer) 1
192.168.100.10:6379> EXISTS xingbie
(integer) 1
192.168.100.10:6379> EXISTS danwei
(integer) 0
192.168.100.10:6379> EXISTS nianling
(integer) 0
3)del
使用del命令可以删除当前数据库的指定key。
192.168.100.10:6379> KEYS * <!--查看当前数据库中所有键-->
1) "xingming"
2) "xingbie"
3) "k1"
4) "k2"
5) "v1"
6) "v2"
7) "v33"
192.168.100.10:6379> del k2 <!--删除当前数据库中的k2键-->
(integer) 1
192.168.100.10:6379> del v2 <!--删除当前数据库中的v2键-->
(integer) 1
4)type
使用type命令可以获取key对应的value值类型。
192.168.100.10:6379>> type v33
string
192.168.100.10:6379> type xingbie
string
5)rename
使用rename命令对已有key进行重命名。(使用rename命令进行重命名时,无论目标key是否存在都进行重命名,且源key的值会覆盖目标key的值;在实际工作当中,建议先使用exists命令查看目标key是否存在,再决定是否执行rename命令,以避免覆盖重要数据)。
192.168.100.10:6379> KEYS * <!--查看当前数据库中所有键-->
1) "xingming"
2) "xingbie"
3) "k1"
4) "k2"
5) "v1"
6) "v2"
7) "v33"
192.168.100.10:6379> rename v33 v3
OK
192.168.100.10:6379> keys v*
1) "v1"
2) "v3"
192.168.100.10:6379> get v1
"3"
192.168.100.10:6379> get v3
"6"
192.168.100.10:6379> rename v1 v3
OK
192.168.100.10:6379> get v1
(nil)
192.168.100.10:6379> get v3
"3"
6)renamenx
使用renamenx命令对已有key进行重命名,并检测新名是否存在。(使用renamenx命令进行重命名时,如果目标key存在则不进行重命名)。
192.168.100.10:6379> KEYS * <!--查看当前数据库中所有键-->
1) "xingming"
2) "xingbie"
3) "k1"
4) "v3"
192.168.100.10:6379> get xingming
"liyanxin"
192.168.100.10:6379> get k1
"1"
127.0.0.1:6379> renamenx k1 xingming
(integer) 0
192.168.100.10:6379> KEYS * <!--查看当前数据库中所有键-->
1) "xingming"
2) "xingbie"
3) "k1"
4) "v3"
192.168.100.10:6379> get k1
"1"
7)dbsize
使用dbsize命令查看当前数据库中key的数目。
192.168.100.10:6379> dbsize
(integer) 6
2、多数据库常用命令
1)多数据库间切换
Redis支持多数据库,Redis在没有任何改动的情况下默认包含16个数据库,数据库名使用数字0--15来依次命名。使用select命令可以进行Redis的多数据库之间的切换,命令格式为“select index”。其中,index表示数据库的序号。而使用redis-cli连接redis数据库后,默认使用的是***为0的数据库
如下所示,使用select命令切换数据库后,会在前端的提示符中显示当前所在的数据库序号,如“192.168.100.10:6379 [5]>”表示当前使用的是***为5的数据库;若当前使用的数据库是***为0的数据库,提示符中则不显示序号,如“192.168.100.10:6379>”表示当前使用的是序号为0的数据库。
192.168.100.10:6379> select 5 <!--切换至***为5的数据库-->
OK
192.168.100.10:6379 [5]> keys * <!--查看所有键-->
(empty list or set)
192.168.100.10:6379 [5]> select 10 <!--切换至***为10的数据库-->
OK
192.168.100.10:6379 [10]> keys *
(empty list or set)
192.168.100.10:6379 [10]> select 0 <!--切换至***为0的数据库-->
OK
192.168.100.10:6379> keys * <!--查看所有键-->
1) "k1"
2) "xingming"
3) "v3"
4) "key:__rand_int__"
5) "xingbie"
6) "mylist"
2)多数据库间移动数据
Redis的多数据库在一定程度上是相当独立的。例如,在数据库0上面存放的w1的数据,在其它的1~15的数据库上是无法看到的。
192.168.100.10:6379> set w1 100 <!--在数据库0上面存放w1的数据-->
OK
192.168.100.10:6379> get w1 <!--在当前数据库可以看到-->
"100"
192.168.100.10:6379> select 1 <!--切换到数据库1-->
OK
192.168.100.10:6379 [1]> get w1 <!--查看w1数据,显然是看不到的-->
(nil)
192.168.100.10:6379 [1]> select 0 <!--切换回数据库0-->
OK
192.168.100.10:6379> get w1 <!--查看w1数据,可以看到 -->
"100"
192.168.100.10:6379> move w1 1 <!--将数据库0中的w1移动到数据库1中-->
(integer) 1
192.168.100.10:6379> select 1 <!--切换到数据库1-->
OK
192.168.100.10:6379 [1]> get w1 <!--查看被移动的数据 -->
"100"
192.168.100.10:637979[1]> select 0 <!--切换回数据库0-->
OK
192.168.100.10:6379> get w1 <!--在数据库0中无法查看到w1的值-->
3)清除数据库内数据
Redis数据库的整库数据删除主要分为两个部分:清空当前数据库中的数据,使用flushdb命令实现;清空所有库中的数据,使用flushall命令。数据库清空操作比较危险,生产环境下一般不建议使用!
192.168.100.10:6379> FLUSHALL
OK
—————— 本文至此结束,感谢阅读 ——————