关系型数据库与非关系型数据库(Redis数据库)
关系型数据库与非关系型数据库
数据库按照其结构可以分为关系型数据库与其他数据库,而这些其他数据库我们统称为非关系型数据库。
1.关系型数据库
关系型数据库是一个结构化的数据库,创建在关系模型基础上,一般面向记录。它借助于集合代数等数学概念和方法来处理数据库中的数据。关系模型指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织,现实世界中,各种实体与实体之间的各种联系都可以用关系模型来表示。SQL(结构化查询语言)语句就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。
主流的关系型数据库包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等。
2.非关系数据库
NoSQL,意思是“不仅仅是SQL”,是非关系型数据库的总称。主流的NoSQL数据库有Redis、MongDB、Hbase、CouhDB等。这些数据库,他们的存储方式,存储结构以及使用场景都是完全不同的。所以我们认为它是一个非关系型数据库的集合,而不是像关系型数据库一样,是一个统称。换言之,主流的关系型数据库之外的数据库,都可以成为非关系型数据库。NoSQL数据库凭借着其非关系型、分布式、开源和横向扩展等优势,被认为是下一代数据库产品。
主流的NoSQL数据库有Redis、MongDB、Hbase、CouhDB等
3.非关系型数据库产生背景
随着Web 2.0网站的兴起,关系型数据库在应对Web 2.0网站,特别是海量数据和高并发的SNS(社交网络服务)类型的Web 2.0网站时,暴露出很多难以解决的问题。主要有一下三大问题。
1)对数据库高并发读写需求
Web 2.0网站会根据用户的个性化信息来实时生成动态页面和提供动态信息。因此,无法使用动态页面静态化技术,所以数据库的并发负载非常高,一般会达到10000次/s以上的读写请求。关系型数据库对于上万次的查询请求还是可以勉强支撑的。当出现上万次的写数据请求时,硬盘I/O就已经无法承受了。对于普通的BBS网站,往往也会存在高并发的写数据请求,如明星在微博上公布恋情,结果因为流量过大而引发微博瘫痪。
2)对海量数据高效存储于访问需求
类似Facebook、Friendfeed这样的sns网站。每天都会产生大型的用户动态信息。例如:Facebook一个月就会产生2.5亿条用户动态信息。对于关系型数据库来说,在一个包含2.5亿条记录的表中执行SQL查询。效率是非常低的。
3)对数据库高可扩展性与高可用需求
在Web架构中,数据库是最难进行横向扩展的。当应用系统的用户量与访问量与日俱增时,数据库是没办法像Web服务器一样,简单得通过添加硬件和服务器节点来扩展其性能和负载能力的。尤其对于一些需要24小时对外提供服务器的网站来说,数据库的升级与扩展往往会伴随着停机维护与数据迁移,其工作量是非常庞大的。
关系型数据库和非关系型数据库都有各自的特点与应用场景。两者的紧密结合将会给Web 2.0的数据库发展带来新的思路。让关系型数据库关注在关系上,非关系型数据库关注在存储上。
Redis数据库
1.Redis简介
Redis是一个开源的、使用C语言编写、支持网络、可基于内存亦可持久化的日志型、key-value(键值对)数据库,是目前分布式架构中不可或缺的一环。
Redis服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个Redis进程,而Redis的实际处理速度则完全依靠于主进程的的执行效率。若在服务器上只运行一个Redis进程,当多个客户端同时访问时,服务器的处理能力会有一定程度的下降,若在同一台服务器上开启多个Redis进程,Redis在提高并发处理能力的同时会给服务器的CPU造成很大压力。也就是说,在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程。若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个进程。若CPU资源比较紧张,采用单进程即可。
2.redis具有以下显著的优点:
- 具有极高的读写速度,数据读取的速度最高可达到110000次/s;数据写入速度最高可达到81000次/s;
- 支持丰富的数据类型,不仅仅支持简单的key-value数据类型,还支持Strings、Lists、Hashes、Sets及Ordered Sets等数据类型操作;
- 支持数据的持久化,可以将内存中的数据保存在硬盘中,重启时可以再次加载使用;
- 原子性,Redis所有的操作都是原子性的;
- 支持数据备份,及master-salve模式的数据备份;
安装部署Redis
网盘下载:https://pan.baidu.com/s/1cYe4qW8TZge7jDeUHehWtw
官方下载:https://redis.io/
1.编译安装
[aaa@qq.com ~]# tar zxf redis-3.2.9.tar.gz -C /usr/src/
[aaa@qq.com ~]# cd /usr/src/
[aaa@qq.com src]# cd redis-3.2.9/
[aaa@qq.com redis-3.2.9]# make && make install
再安装过程中,想要更改默认路径,可以使用下列格式实现
make && make PREFIX=安装路径install
make install 只是安装了二进制文件到系统中,并没有启动脚本和配置文件。软件包中默认提供了一个install_server.sh脚本文件。通过该脚本文件可以设置Redis服务所需要的相关配置文件。当脚本执行完毕,Redis服务就已经启动,默认侦听端口为6379
[aaa@qq.com redis-3.2.9]# cd utils/
[aaa@qq.com utils]# ./install_server.sh
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
Config file : /etc/redis/6379.conf //设置默认配置文件
Log file : /var/log/redis_6379.log //日志文件
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 utils]#
[aaa@qq.com utils]# netstat -anput | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 7012/redis-server 1
2.Redis控制
[aaa@qq.com ~]# /etc/init.d/redis_6379 stop //关闭
[aaa@qq.com ~]# /etc/init.d/redis_6379 restart //重启
[aaa@qq.com ~]# /etc/init.d/redis_6379 status //查看状态
Redis is running (6396)
3.配置参数
Redis主配置文件为/etc/redis/6379.conf
[aaa@qq.com ~]# vim /etc/redis/6379.conf
bind 127.0.0.1 //监听的主机地址
port 6379 //监听端口
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-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地址:端口号>”的数据库操作环境。用户就可以输入各种操作语句对数据库进行管理
[aaa@qq.com ~]# redis-cli
127.0.0.1:6379> ping
PONG
远程连接其它主机
-h”指定远程主机“-p”指定Redis服务的端口号、“-a”指定redis数据库的密码
[aaa@qq.com ~]# redis-cli -h 192.168.1.1 -p 6379
192.168.1.1:6379> info // info可以查看Redis服务器的详细信息
2.查看命令
在数据库操作环境中,使用help命令可以获取命令的相应帮助。有三种获取命令帮助的方式:
- help @<group>:获取<group>中的命令列表
- help <command>:获取某个命令的帮助
- help <tab>:获取可能帮助的主题列表
[aaa@qq.com ~]# redis-cli 127.0.0.1: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
3.redis-benchmark 测试工具
[aaa@qq.com ~]# redis-benchmark -h 192.168.1.1 -p 6379 -c 100 -n 10000
//针对IP地址为192.168.1.1、端口号为6379的Redis服务器发送100个并发连接与10000个请求测试性能
====== MSET (10 keys) ======
10000 requests completed in 0.26 seconds
100 parallel clients
3 bytes payload
keep alive: 1
16.44% <= 1 milliseconds
95.07% <= 2 milliseconds
96.67% <= 3 milliseconds
97.93% <= 4 milliseconds
99.24% <= 5 milliseconds
99.44% <= 6 milliseconds
99.67% <= 7 milliseconds
99.92% <= 8 milliseconds
100.00% <= 9 milliseconds
38759.69 requests per second
[aaa@qq.com ~]# redis-benchmark -h 192.168.1.1 -p 6379 -q -d 100
//针对IP地址为192.168.1.1、端口号为6379的Redis服务器测试存取大小为100B的数据包的性能
[aaa@qq.com ~]# redis-benchmark -h 192.168.1.1 -p 6379 -t set,lpush -n 10000 -q
SET: 37313.43 requests per second
LPUSH: 45248.87 requests per second
//针对IP地址为192.168.1.1、端口号为6379的Redis服务器在进行set与lpush操作时的性能
Redis数据库常用命令
- set:存放数据,基本格式:set key value
- get:获取数据,基本格式:get key
1)keys
使用keys命令可以获取符合规则的键值列表,通常可以结合“*”、“?”等选项使用。
127.0.0.1:6379> keys * //查看当前数据库的所有键
1) "mylist"
2) "k2"
3) "k11"
4) "counter:__rand_int__"
5) "key:__rand_int__"
6) "k1"
7) "k3"
//不光是自己设置的键,还有系统默认的键
127.0.0.1:6379> keys k* //查看当前数据库中以“k”开头的键
1) "k2"
2) "k11"
3) "key:__rand_int__"
4) "k1"
5) "k3"
127.0.0.1:6379> keys k? //查看当前数据库中以“k”开头后面包含任意一位的键
1) "k2"
2) "k1"
3) "k3"
127.0.0.1:6379> keys k?? //查看当前数据库中以“k”开头后面包含任意两位的键
1) "k11"
2)exists
使用exists命令可以判断键值是否存在。
127.0.0.1:6379> exists k1
(integer) 1
127.0.0.1:6379> exists k0
(integer) 0
//返回值1表示存在;0表示不存在
3)del
使用del命令可以删除当前数据库的指定key。
127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> get k1
(nil)
4)type
使用type命令可以获取key对应的value值类型。
127.0.0.1:6379> type k2
string
//字符串类型
5)rename
rename命令是对已有key进行重命名,格式为:“rename 源key 目标key”。使用rename命令进行重命名操作时,无论目标key是否存在都进行重命名,而且源key的值会覆盖目标key的值。在实际使用过程中,建议使用exists命令查看目标key是否存在,再决定是否执行rename命令,避免覆盖重要数据。
127.0.0.1:6379> get k2
"1qq"
127.0.0.1:6379> get k3
"1q"
127.0.0.1:6379> rename k2 k3
OK
127.0.0.1:6379> get k3
"1qq"
6)renamenx
renamenx命令语法格式、作用与rename命令相同,不同点在于使用renamex命令进行重命名是,如果目标key存在则不进行重命名
127.0.0.1:6379> keys k??
1) "k11"
127.0.0.1:6379> renamenx k3 k11
(integer) 0
//返回值是0,表示失败
7)dbsize
dbsize命令的作用是查看当前数据库中key的数目
127.0.0.1:6379> dbsize
(integer) 5
多数据库常用命令
1)多数据库间切换
Redis支持多数据库,默认有16个数据库,数据库名称是用数字0-15来表示的。
27.0.0.1:6379> SELECT 10 //切换至序号为10的数据库
OK
127.0.0.1:6379[10]> SELECT 15
OK
127.0.0.1:6379[15]> SELECT 0
OK
2)多数据库之间移动数据
Redis的多数据库在一定程度上是相对独立的,在1创建的数据,在10上是没有的
127.0.0.1:6379> set q1 1
OK
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get q1
(nil)
Redis数据库提供了一个“move”命令,可以进行多数据库的数据移动
127.0.0.1:6379> move qzt1 1
(integer) 1
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get qzt1
"1"
3)清除数据库内数据
清空当前数据库数据:flushdb
清空所有数据库数据:flushall(谨慎使用)
推荐阅读
-
关系型数据库与非关系型数据库(Redis数据库)
-
Redis非关系型数据库学习
-
JavaWeb——Redis(非关系型数据库)
-
Mongodb在windows下的安装和启动 博客分类: Mongodb mongodbnosql数据库非关系型
-
数据库连接JDBC与数据库连接池c3p0、dhcp的关系
-
Mongodb相对于关系型数据库的优缺点 博客分类: mongodb & hadoop
-
NoSQL数据库探讨之一 - 为什么要用非关系数据库?(转) 博客分类: 非关系型数据库 NoSQL数据结构CassandraRedisMongoDB
-
非关系型数据库—Cassandra cassandra云计算
-
NoSQL数据库,何解要用非关系数据库? 博客分类: Unix类 NoSQL数据结构CassandraRedisMongoDB
-
mybatis整合ehcache以及spring整合redis非关系型数据库