注:笔记整理来源 B站UP主狂神说Java
什么是NoSQL?
关系型数据库:列表,行,列 (POI:通过java查询exl表格)
非关系型数据库:NoSQL = not only SQL(不仅仅是SQL)
泛指非关系型数据库.随着web2.0互联网的诞生,传统的关系型数据库很难对付web2.0,尤其是超大规模的高并发社区.
NoSQL在大数据发展的十分迅速,Redis是发展最快的,是当下必须掌握的技术.
很多的数据类型用户的个人信息,社交网络,地理位置(数据的存数不需要固定的格式,不需要多余的操作就可以横向扩展)
Map<String,Object> NoSql的表现 使用键值对来控制
为什么要用NoSQL
用户的个人信息,社交网络,地理位置,用户自己生产的数据,用户日志等爆发式增长.
NoSQL数据库可以很好的处理以上情况!
NoSQL的特点:
1.方便扩展(数据之间没有关系,很好扩展)
2.大数据量高性能(Redis 1s可以写8w字,读11w字, NoSQL的缓存机记录级,是一种细粒度缓存,性能高)
3.数据类型多样型(不需要事先设计数据库,随取随用. 数据库量十分大的表,很多人无法设计)
4.传统RDBMS和NoSQL的区别
传统的RDBMS -结构化组织 -SQL -数据和关系都存在单独的表中 -数据操作,数据定义语言 -严格的一致性 -基础的事务 -.... NoSQL -不仅仅是数据 -没有固定的查询语言 -键值对存储,列存储,文档存储,图形数据库(社交关系) -最终一致性 -CAP定理 和 BASE (异地多活) -高性能,高可用,高可扩展性 -....
Nosql分为4大类
KV键值对:
-新浪:Redis
-美团:Redis+Tair
-阿里,百度:Redis+Memycache
文档数据库(bson格式 和json一样)
-MongoDB(一般必须要掌握)
-MongoDB是一个基于分布式文件存储的数据库,c++编写, 主要处理大量的文档
-MongoDB是一个介于关系型数据库和非关系型数据库中间的产品
-MongoDB是非关系型数据库中功能最丰富,最像关系型数据库的
-CouchDB
列存储数据库
-HBase
-分布式文件系统
图关系数据型
他不是存储图型,放的是关系. 比如:朋友圈社交网络,广告推荐
-Neo4j , InfiGrid
Redis:非关系型数据库
Remote Dictionary Server:是一个开源的,支持网络的,可基于内存持久化的日志型,K-V数据库,并提供多种语言的API.
Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并在基础上实现了master-slave(主从)同步.
免费,开源,当下最热门的NoSql技术之一.
Redis可以干什么?
1.内存存储,持久化,内存是断电即失,所以说持久化很重要(rdb,aof).
2.效率高,可用于高速缓存
3.发布订阅信息
4.地图信息分析
5.计时器,计数器(浏览量)
6.....
特性
1.多样的数据类型
2.持久化
3.集群
4.事务
Redis的基础知识
redis默认有16个数据库 (默认使用第0个)
select 进行切换数据库
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]>
DBSIZE 查看数据库大小
127.0.0.1:6379> DBSIZE
(integer) 1
flushdb 清空当前数据库
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> dbsize
(integer) 0
flushall 清空所有数据库的内容
遇到的问题:
127.0.0.1:6379> set name fei
(error) MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.
这是由于强制停止redis快照,不能持久化引起的
解决方案:连接redis后运行 config set stop-writes-on-bgsave-error no 命令
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
OK
127.0.0.1:6379> set name fei
拓展:
为什么redis端口号使用6379? (女明星名字缩写)
Redis是单线程的
Redis是很快的,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,
既然可以使用单线程来实现,就使用单线程了
Redis是用C语言写的,官方提供的数据 100000+ QPS(Queries-per-second每秒查询率),说明不比同样使用key-value的memycache差!
为什么单线程还这么快?
1.误区1:高性能的服务器一定是多线程的
2.误区2:多线程(CPU会上下文切换),一定比单线程效率高!
CPU>内存>硬盘的速度有所了解
核心:redis将所有数据放在内存中,所以说使用单线程效率就是最高的,多线程(CPU上下文切换:就是一个耗时的操作!)
对于内存系统来说,如果没有上下文切换,效率就是最高的,多次读写都是在一个CPU上的操作,在内存区的情况下,redis为最佳方案!
Redis安装(Linux服务器)
Redis推荐都是在Linux服务器上搭建
默认端口:6379
Linux安装:
1.下载安装包 redis-6.0.3
2.解压
3.进入解压后的redis.conf文件
4.yum install gcc -c
5.make
6.make install
7.默认安装目录:
8.将redis配置文件,复制到当前目录下
以后使用这个conf 不用源文件.
9.启动(redis默认不是后台启动的,修改配置文件)
10.启动redis服务
fly@fly-PC /usr/local/bin redis-server config/redis.conf //通过指定配置文件启动服务
4789:C 28 May 2020 16:24:05.259 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4789:C 28 May 2020 16:24:05.259 # Redis version=6.0.3, bits=64, commit=00000000, modified=0, pid=4789, just started
4789:C 28 May 2020 16:24:05.259 # Configuration loaded
11.客户端进行连接
fly@fly-PC /usr/local/bin redis-cli -p 6379
127.0.0.1:6379> ping //测试连接
PONG
127.0.0.1:6379> set name fly //存储
OK
127.0.0.1:6379> get name //取值
"fly"
127.0.0.1:6379> keys * //查看所有key
1) "name"
127.0.0.1:6379>
12.查看redis进程是否开启
fly@fly-PC /usr/local/bin ps -ef|grep redis
fly 4790 1 0 16:24 ? 00:00:00 redis-server 127.0.0.1:6379
fly 6911 18261 0 16:29 pts/0 00:00:00 redis-cli -p 6379
fly 6930 6717 0 16:29 pts/1 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn redis
13.如何关闭redis服务 shutdown
127.0.0.1:6379> shutdown
not connection> exit
测试性能
redis-benchmark是一个压力测试工具!
官方自带的的性能测试工具.
redis-benchmark 命令参数!
-h 指定服务器主机名 默认:127.0.0.1
-p 指定服务器端口号 默认:6379
-a 指定服务器socket
-c 指定并发连接数 默认:50
-n 指定请求数 默认:10000
-d 以字节的形式指定SET/GET值的数据大小 默认:2
-k 1=keep alive 0=reconnect 默认:1
-r SET/GET/INCR使用随机key ,SADD使用随机值
-p 通过管道传输请求 默认:1
-q 强制退出redis,显示query/sec值
–csv 以csv格式输出
-l 生成循环,永久执行测试
-t 仅运行以逗号分隔的测试命令列表
测试100个并发连接 100000个请求
redis-benchmark -p 6379 -c 100 -n 100000
如何看这些分析?
100.00% <= 54 milliseconds 54毫秒内完成处理
10810.81 requests per second 每秒处理10810.81个请求
3 bytes payload : 每次写入3个字节
keep alive:只有一个服务器来处理