NoSQL
什么是NoSQL
NoSQL = not only sql
泛指非关系型数据库
关系型数据库:表格,行、列记录
为什么用NoSQL
用户的个人信息、地理位置、用户数据等爆发式增长,这些数据类型的存储不需要一个固定的格式,不需要多余的操作就可以横向扩展,就需要用NoSQL数据库。
特点
1、方便扩展,数据之间无关系
2、大数据量高性能
3、数据类型多样型,不需事先设计数据库
4、没有固定的查询语言
5、一致性
四大分类
KV键值对
Redis
文档型数据库
BSON格式,和JSON一样
MongoDB,一个基于分布式文件存储的数据库,主要用于处理大量的文档,是一个介于关系型数据库和非关系型数据库中间的产品,是非关系型数据库中功能最丰富、最像关系型数据库的产品
列存储
HBase
分布式文件系统
图形关系数据库
不是存图形,放的是关系,比如社交网络、广告推荐
Neo4j,InfoGrid
Redis
文档:https://redis.io/docs/about/
安装
安装教程:https://www.runoob.com/redis/redis-install.html
Windows
下载地址:https://github.com/tporadowski/redis/releases
Linux
wget http://download.redis.io/releases/redis-7.2.4.tar.gz
或
#下载文件重命名为redis-7.2.4.tar.gz
wget https://github.com/redis/redis/archive/7.2.4.tar.gz
tar -zxvf redis-7.2.4.tar.gz
cd redis-7.2.4
#安装依赖环境
# yum install gcc-c++
#安装服务
#redis默认安装目录/usr/local/bin
make
# make install
#redis默认不是后台启动,需修改配置
vi redis.conf
daemonize yes
用处
1、内存存储、持久化。内存中是断电即失的,所以持久化很必要(机制:rdb、aof)
2、效率高,可以用于高速缓存
3、发布订阅系统
4、地图信息分析
5、计时器、计数器(浏览量)
特性
1、多样的数据类型
2、持久化
3、集群
4、事务
命令/Redis Key
#测试连接
ping
#存
set key value
#取
get key
#查看数据库所有key
keys *
#清空当前数据库
flushdb
#清空全部数据库
flushall
#判断key是否存在,返回1存在0不存在
exists key
#删除key
del key
#移动key到指定数据库,1表示目标数据库,返回1表示移动成功
move key 1
#设置过期时间,10s后过期
expire key 10
#展示key剩余过期时间,返回-2表示已过期
ttl key
#查看key是什么类型
type key
性能测试
redis-benchmark
redis-benchmark [option] [option value]
选项 | 描述 | 默认值 |
---|---|---|
-h | 指定服务器主机名 | 127.0.0.1 |
-p | 指定服务器端口 | 6379 |
-s | 指定服务器 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(小写字母L) | 生成循环,永久执行测试 | |
-t | 仅运行以逗号分隔的测试命令列表。 | |
-I(大写字母i) | Idle 模式。仅打开 N 个 idle 连接并等待。 |
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
====== SET ======
100000 requests completed in 1.46 seconds #对10w个写入请求进行测试
100 parallel clients #100个并发客户端
3 bytes payload #每次写入3个字节
keep alive: 1 #只有1台服务器处理请求,单机性能
89.61% <= 1 milliseconds
99.58% <= 2 milliseconds
99.70% <= 8 milliseconds
99.73% <= 9 milliseconds
99.77% <= 10 milliseconds
99.81% <= 11 milliseconds
99.86% <= 12 milliseconds
99.90% <= 13 milliseconds
99.90% <= 18 milliseconds
99.92% <= 19 milliseconds
99.95% <= 20 milliseconds
100.00% <= 21 milliseconds
100.00% <= 21 milliseconds #所有请求在21ms处理完成
68540.09 requests per second #每秒处理68540.09个请求
基础知识
Redis默认有16个数据库
redis.conf中
# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16
默认使用第0个数据库,可以使用select进行切换
127.0.0.1:6379> select 3 #切换数据库
OK
127.0.0.1:6379[3]> dbsize #查看数据库大小
(integer) 0
Redis是单线程的
Redis是基于内存操作,CPU不是Redis的性能瓶颈。Redis的瓶颈是根据机器的内存和网络带宽
Redis 不同版本之间采用的线程模型是不一样的,Redis4.0 版本之前使用的是单线程模型,4.0 版本之后增加了多线程的支持。
在4.0之前虽然Redis是单线程,也只是说它的网络 I/O 线程以及 Set 和 Get 操作是由一个线程完成的。持久化、集群同步还是使用其他线程来完成。
4.0 之后添加了多线程的支持,主要是体现在大数据的异步删除功能上,例如 unlink key、flushdb async、flushall async 等
核心:Redis将所有的数据全部放在内存中,所以说单线程去操作效率是最高的。多线程会产生CPU上下文切换,耗时。对于内存系统来说,没有上下文切换的效率是最高的。多次读写都是在一个CPU上
五大数据类型
String/字符串
使用场景:value可以是字符串、数字
- 计数器
- 统计多单位的数量
- 粉丝数
- 对象缓存存储
命令
https://redis.io/commands/?group=string
#追加字符串,返回字符串长度,key不存在则set
append key value
#获取字符串长度
strlen key
#截取字符串,[start,end]
getrange key start end
#替换指定位置开始的字符串
setrange key offset value
#########################
#i++
incr key
#i--
decr key
#i+10
incrby view 10
#i-5
decrby view 5
#########################
#设置过期时间,set with expire
setex key seconds value
#不存在再设置,set if not exist,常用在分布式锁中
setnx key value
#########################
#批量设置
mset key value
#批量获取
mget key
#批量,原子性操作,同时成功或失败
msetnx key value
#########################
#先get再set
getset key value
List/列表
基本的数据类型:列表
可以用作栈、队列、阻塞队列
实际上是一个链表 before node after,left、right都可以插入值
- key不存在,则新建链表
- key存在,则新增
- 移除所有值,链表为空,则不存在
- 在两边插入或修改,效率最高;中间元素,效率相对低
消息队列:lpush,rpop
栈:lpush,lpop
命令
https://redis.io/commands/?group=list
#存,插入到列表头部
lpush key value [value ...]
#存,插入到列表尾部
rpush key value [value ...]
#取
lrange key start stop
#移除列表第一个元素
lpop key
#移除列表最后一个元素
rpop key
#########################
#通过下标获取list中某一个值
lindex key index
#获取列表长度
llen key
#########################