关系数据库与非关系型数据库

redis非关系型数据库,又名缓存型数据库。
数据库类型:关系型数据库和非关系型数据库
关系型数据库是一 个机构化的数据库,行和列。
列:声明对象。
行:记录对象属性。
表与表之间的的关联。
sql语句,对指定的表,库,进行增删查改。
在创建表时,我们是设计好了表的结构。按照表结构来存储数据。数据与表结构不匹配,存储数据,会失败。

非关系型数据库:nosql not only sql
不需要定义数据库,也不需要定义表的结构,直接记录即可,而且每条记录都可以有不同的数据类型,字段(字段个数)
redis key:values 键值对形式储存。每个键之间没有直接关联,库与库之间相互独立。

关系型非关系区别
1、数据的储存方式不同。

关系型数据库:库———->表———–>行、列————>存储数据

非关系型数据库:库———>集合———->键值

2、扩展方向:性能上的提升。关系型数据库靠的是提升本机性能。非关系型关系型数据库可以横向扩展,加入节点服务器的方式提高性能。
3、对事物的支持性,mysql支持事务。
关系型数据库:原子性、隔离性、一致性、持久性
非关系型数据库:也可以支持事务,redise也可以支持事务,但稳定性和处理能力都不如关系型数据库。

非关系型数据的主要场景: 1、操作的扩展
2、海量数据处理

纯动态网站的三高问题:
1、对数据库高并发读写的需求。
2、对海量数据高效存储与访问的需求。
3、对数据库的高扩展性与高可用的需求。

redis非关系型数据库

数据库缓存:

redis的工作特点:

redis服务器程序是一个单进程模式,即只有一个主进程工作。也就是说在一台服务器上启多个redis(端口号不能冲突)
redis的实际处理速度是完全依靠主进程的执行效率。

服务器只部署了一个redis进程,多个客户端访问,可能会导致redis的处理能力下降
如果部署了多个redis进程,虽然能提高redis的并发处理能力, 但是会给服务器的cpu带来很大的压力。
一台服务器,一般部署3个redis进程。(更具情况来看,高并发要部署多个。)一般的情况,单进程足够)

redis的特点:

1、具有极高的读写速度,数据读取每秒110000次,写入数据每秒81000次写入。
2、支持丰富的数据类型。
3、支持持久化。平常的数据保存在内存中,持久化可以写入磁盘中,既可以保存在本地,也可以实现备份。
4、原子性,所有的操作都是原子性
5、支持数据主从模式——master slave模式

rdis为什么这么快?

1、redis纯内存结构,避免了磁盘I/O的耗时2、核心模块是一个单进程,减少了线程切换和回收线程的时间。3、redis采用的是I/O多路复用的机制,一条执行线路可以执行读也可以执行写,高并发。***特殊说明:redis的读写,依旧是单进程处理。

redis部署

yum install -y gcc gcc-c++ makecd /opt/将包拖到opt下tar -xf redis-5.0.7.tar.gzcd redis-5.0.7/make -j 4 make PREFIX=/usr/local/redis installcd utils/./install_server.sh---第四个回车后---/usr/local/redis/bin/redis-serverln -s /usr/local/redis/bin/* /usr/local/bin/vim /etc/redis/6379.conf70行 加本机ip

redis的服务控制命令:

/etc/init.d/redis_6379 restart/etc/init.d/redis_6379 status/etc/init.d/redis_6379 stop/etc/init.d/redis_6379 start

查看端口是否启动成功

ss -antp | grep redis

redis的命令工具:

redis-server:直接启动redis,只能启动redis-benchmark: 检测redis在本机的运行效率redis-cli:命令行工具redis-check-aof: 检测AOF文件是否正常redis-check-rdb: 检测rdb文件是否正常

redis-benchmark

-h指定服务器的主机名 ip地址
-p指定服务器的端口号
-c指定并发连接数
-n指定请求数
-a指定登陆密码

进入redis命令
1、redis-cil -h 192.168.10.80 -p6379
2、redis-cli 仅限制本地使用,远程访问需要指定ip和端口

redis的五大数据类型

1、 string(字符串)

string是redis最基本的类型,最大能存储512MB的数据,可以存储任何数据

格式:

创建 set 键名 键的值

删除del 键名

查看键值对的值get 键名

查看所有键值对keys *

模糊查询” />

APPEND 有则拼接,无则创建输入

APPEND 键名 键值

EXISTS

STRLEN 标记长度

STRLEN 键名

INCR自增一INCR 键名(只针对数字类型)

DECR 自减一DECR 键名(只针对数字类型)

incrby 键值对 数值


decrby 键值对数值

EXPIRE对已有键值对设置生命周期

EXPIRE 键值对名 周期时间


(integer) -1 表示永不过期
(integer) -2 表示已过期

新建时声明键值对的声明周期

setex 键名 生命周期时间 内容

mset 键名1值键名2值mset key1 hello key2 world#批量设置键 keys *#查看键 mget 键名1 键名2mget key1 key2#同时打印多个键的值

2、list数据类型

正序查看:RPUSH test1 a b c 1 2 3

倒叙查看:LPUSH test a b c 1 2 3

#创建列表 后面时内容,但是当中的元素还是string类型

192.168.10.80:6379> LPUSH test a b c 1 2 3 (integer) 6192.168.10.80:6379> lrange test 0 -11) "3"2) "2"3) "1"4) "c"5) "b"6) "a"192.168.10.80:6379> LINDEX test 0"3"192.168.10.80:6379> LINDEX test 1"2"192.168.10.80:6379> RPUSH test1 a b c 1 2 3(integer) 6192.168.10.80:6379> lrange test1 0 -11) "a"2) "b"3) "c"4) "1"5) "2"6) "3"192.168.10.80:6379> LINDEX test 0"3"192.168.10.80:6379> LINDEX test1 0"a"
192.168.10.80:6379> LPUSH test 1 2 3 4 5 6(integer) 6192.168.10.80:6379> LINDEX test -1"1"192.168.10.80:6379> LINDEX test 0"6"192.168.10.80:6379> LINDEX test 1"5"192.168.10.80:6379> LINDEX test 2"4"192.168.10.80:6379> LINDEX test 3"3"192.168.10.80:6379> LINDEX test 4"2"192.168.10.80:6379> 

list操作命令

lpush quoqi a b c d 12 13#创建列表 后面时内容,但是当中的元素还是lrange 键名 0 -1#查看列表中的数据(倒叙)lindex 键名 0#根据索引下标打印数据lindex 键名 索引号#根据索引下标打印数据rpush 键名 1 2 3 4#创建列表正序查看 从右到左 从右-1开始自增lrange 键名 0 -1#正序查看lrange 键名 1 2#指定范围查看RPUSHX test 值#在test其右侧加入一个值LPUSH test 值#在test其左侧加入一个值lpop键名lpop guoqi1#从左边开始删 lrange guoqi1 0 -1#范围查看键值对内部的值 rpop键名rpop guoqi1#从右边开始删 lrange guoqi1 0 -1 llen键名llen guoqi1#查询列表内的元素 lindex键名索引下标lindex guoqi1 3#指定索引下标查询 lrange guoqi1 0 -1 linsert 键名 before 索引下标范围linsert guoqi1 before 3 10#在指定位置前插入数据 

3、hash类型

hash类型用于存储对象,采用hash格式来进行操作。占用磁盘少,而且占用一个hash可以占用4294967295个键值对

创建:HSET 键名 字段 值查看:HGET 键名 字段创建多个:HSET 键名1 字段1 值2 字段2 值 字段3 值3查看多个:HMGET 键名 字段1 字段2查看所有字段:HGETALL 键名删除:HDEL 键名 字段1 字段2
192.168.10.80:6379> HSET test tall 150(integer) 1192.168.10.80:6379> HGET test tall"150"192.168.10.80:6379> HMSET test age yes sex nanOK192.168.10.80:6379> HMGET test tall age sex1) "150"2) "yes"3) "nan"192.168.10.80:6379> HGETALL test1) "tall"2) "150"3) "age"4) "yes"5) "sex"6) "nan"192.168.10.80:6379> HDEL test age(integer) 1192.168.10.80:6379> HGETALL test1) "tall"2) "150"3) "sex"4) "nan"192.168.10.80:6379>

4、set数据类型

无序集合元素类型也是string,元素是唯一的,不允许重复。多个集合类型可以进行并集。交集和差集运算.
set 元素类型是唯一的,可以跟踪一些唯一性的数据。只要把对应名称redis,set 可以

创建:SADD 集合名 查看:SMEMBERS 集合名随机给出一个元素:SRANDMEMBER 集合名随机移除一个元素:SPOP 集合名指定移除:SREM 集合名

5、有序集合

有序集合,元素类型也是string,元素唯一,不能重复,每个元素都会关联一个double (小数点)的分数(score,表示权重)可以通过权重的大小,进行排序。元素的权重可以相同。
zset:可以应用到在线积分的排行榜,可以实时更新用户的分数。

创建:ZADD 集合名 权重1 元素1权重2 元素2权重3 元素3ZADD test1 1 one 2 two 3 three查看+权重:ZRANGE 集合名 0 -1 WITHSCORES WITHSCORES安照权重来排序ZRANGE test1 0 -1 withscores查看不加权重:ZRANGE 集合名 0 -1ZRANGE test1 0 -1获取成员数量:ZCARD 集合名ZCARD test1获取成员数量权重范围 ZCOUNT 集合名 权重范围ZCOUNT test1 2 3删除集合元素ZREM 集合名 元素ZREM test1 three查看元素权重 ZSCORE 集合名 元素ZSCORE test1 two

操作过程

192.168.10.80:6379> ZADD test1 1 one 2 two 3 three(integer) 3192.168.10.80:6379> ZRANGE test1 0 -11) "one"2) "two"3) "three"192.168.10.80:6379> ZRANGE test1 0 -1 withscores1) "one"2) "1"3) "two"4) "2"5) "three"6) "3"192.168.10.80:6379> ZCARD test1(integer) 3192.168.10.80:6379> ZCOUNT test1 2 3(integer) 2192.168.10.80:6379> ZREM test1 three(integer) 1192.168.10.80:6379> ZRANGE test1 0 -1 withscores1) "one"2) "1"3) "two"4) "2"192.168.10.80:6379> ZSCORE test1 two"2"192.168.10.80:6379> 

查询redis库

redis的库都是创建好的,有16个库

数字排名:0-15

每个数据库之间互相独立,互不干扰

select [0-15]#切换库 dbsize#查看当前库中键的数量keys *查看键move 键名库的序号MOVE test1 1查看键的类型type 键名
192.168.10.80:6379> KEYS *1) "test"2) "test1"192.168.10.80:6379> KEYS *1) "test"192.168.10.80:6379> SELECT 1OK192.168.10.80:6379[1]> KEYS *1) "test1"192.168.10.80:6379[1]> 

密码

设置密码config set requirepass 密码config set requirepass 123456在内声明密码auth 密码auth 123456在外生声明密码redis-cli -h ip -p 6379 -a 密码redis-cli -h 192.168.10.80 -p 6379 -a 123456

清除库

FLUSHDB#清除当前库FLUSHALL#清空所有库

总结:

redis读写速度快

数据类型:

1、string
2、list
3、hash 对一个键进行多字段操作用于hash 节省内存空间
4、set 元素不能重复,可以定义唯一值
5、zset 元素不能重复,单权重可以重复

面试题:

rdis为什么这么快?
1、redis纯内存结构,避免了磁盘I/O的耗时
2、核心模块是一个单进程,减少了线程切换和回收线程的时间。
3、redis采用的是I/O多路复用的机制,一条执行线路可以执行读也可以执行写,高并发。
***特殊说明:redis的读写,依旧是单进程处理。