关系数据库与非关系型数据库
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的读写,依旧是单进程处理。