Nosql入门和概述
是什么?
NoSql——》”不仅仅是SQL“,泛指非关系型数据库,其产生是为了解决大规模数据集合多重种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储。
例如:谷歌或FaceBook每天收集亿万比特的用户数据,这些数据存储不需要固定的模式,无需多余操作就可以横向扩展。
能干什么?
- 易扩展:去掉了关系型数据库的关系型特性,数据之间无关系,这样就容易拓展。也无形之间,在架构的层面上带来了可扩展能力。
- 大数据量高性能:NoSql具有非常高的读写性能,尤其在大数据量下,表现同样优秀。这得益于他的关系性,数据库的结构简单。一般MySql使用的Query Cache,在每次表更新后都会失效,大粒度性能不高。
- 多样灵活的数据模型:NoSql无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系型数据库中,增加字段是一件很麻烦的事情,如果是非常大数据量的表,增加字段简直是噩梦。
- NoSQL:代表着不仅仅是SQL,没有声明性查询语言,没有预定义的模式,键-值对存储,最终一致性(非ACID)
去哪里下?
Redis
怎么玩?
- KV
- Cache
- Persistence
简介:
在关系型数据库中数据类型称为:Int,varchar
在非关系型数据库中统称为:聚合型及其四个分类(KV键值、Bson(类似于Json格式)、列族、图形(表示复杂的关系,如QQ的关注、共同好友))
NoSQL数据库(分布性系统)中的CAP原理+BASE
CAP: Consistence(强一致性)、Availability(可用性)、Partition Toleronce(分区若错性)只能满足其中2个
CA:传统数据库
AP:大多数网站架构的选择(双11:服务器不崩是A、分布是P)
CP:Redis(保证与数据库的一致性)
BASE:是为了解决关系型数据库强一致性引起的问题引起可用性降低而提出的方案。(基本可用、软状态、最终一致,即用C换取AP)
什么时候用?
在大数据量的Web系统中,非常忌讳多个大表关联查询,以及复杂数据类型的报表查询,此时使用NoSQL
分布式和集群
分布式:不同的多台服务器上面部署不同的服务模块(工程),他们通过Rpc/Rmi之间通信和调用,对外提供服务和组内协作。
集群:不同的多台服务器部署着相同的服务模块,通过分布式调度软件进行统一调度,对外提供服务和访问。
Redis
是什么
远程字典服务,开源、支持多种语言、支持事务、集群。Redis是推荐在Linux上搭建的,基于Linux学习
特点
支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
不仅仅支持简单的Key-Value,同时还提供list、set、zset、hash等数据结构的存储
支持数据备份,即maste-slave(主从复制)的数据备份
作用
- 内存存储和持久化(rdb、aof):支持异步将内存中的数据写到磁盘,同时不影响继续服务
- 效率高、可以用于高速缓存
- 地图信息分析
- 计时器、计数器(浏览量!incr)
- 发布、订阅消息系统(消息中间件)
Linux安装
步骤1:下载安装包
步骤2:解压到opt目录
步骤3:进入解压后文件,可以看到redis的配置文件
步骤4:安装yum install gcc -c++
步骤5:gcc的版本必须在centos6.x版本要4.8上,不够得升级https://blog.csdn.net/tao_627/article/details/50448924?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.baidujs&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.baidujs,,这里推荐用Centos7
make
make install
步骤6:redis的默认安装路径 usr/local/bin
步骤7:将resis配置文件在bin目录下创建一个自己的配置文件,复制一份(保证能恢复)
mkdir myconfig
cp /opt/redis-5.0.8/redis.conf myconfig
cd myconfig
ls
步骤8:redis默认不是后台启动的,修改自己的配置文件vim redis.conf
daemonize yes
步骤9:启动redis服务,通过自己复制后的redis.conf启动
redis-server myconfig/redis.conf
步骤10:测试是否能连,用客户端
redis-cli -p 6379
步骤11:查看redis的进程是否开启
ps -ef | grep redis
步骤12:如何关闭redis服务
shutdown
exit
ps -ef | grep redis
数据类型
键Key
常用命令
命令 | 作用 | 使用 |
---|---|---|
keys * | 查看当前库中的所有key | keys * |
exists 【key】 | 根据key的名字判断当前库是否存在 | exists k1 |
move 【key】 【db】 | 将key移动到指定数据库中 | move k1 1 |
expire 【key】 【Second】 | 给key设置过期时间,以秒数为单位 | expire k1 7 |
ttl 【key】 | 查看还有多少秒过期,-1为永不过期,-2为已过期 | ttl k1 |
type 【key】 | 查看key的类型 |
String
单值单value
常用命令
命令 | 作用 | 使用 |
---|---|---|
set/get/del/append/strlen 【key】 【value】 | 设置/获取/删除/拼接/计算长度 | append k1 nihao、strlen k1 |
incr/decr/incrby/decrby | 加/减,一定要是数字才能加减 | incrby k1 n(k1的值加n) |
getrange/setrange | 获取指定范围的值/设置指定范围的值 | getrange k1 0 -1(显示全部)、setrange k1 0 xxx(从0为开始补充xxx) |
setex(键秒值)/setnx() | 设置键的存活秒数、如果不存在则添加值 | setex k1 10 v1、setnx k1 v11 |
mset/mget/msetnx | 一次操作多个,原子性 | mset k1 v1 k2 v2,mget k1 k2,msetnx k1 v1 k3 v3 |
List
单值多value
常用命令
命令 | 作用 |
---|---|
lpush、rpush、lrange 【key】 【value】 | 左进、右进、左边遍历查看 |
lpop、rpop | 左出(相对于List来说的栈顶,栈顶先出)、右出(相对于List来说的栈底,栈底先出) |
lindex | 按照索引下标获取元素(从上到下) |
llen | 长度 |
lrem key value1 value2 | 删除N个value |
Itrim key 开始index 结束index | 从开始index到结束index范围截取出来,赋值给原来的key,从栈顶开始 |
rpoplpush 源列表 目的列表 | 从源列表的栈底出,加入到目的列表的栈顶 |
lset key index value | 给列表指定位置设置值,会覆盖 |
linsert key before/after 值1 值2 | 在值1前/后插入值2 |
Set
单值多value,且value不重复
常用命令
命令 | 作用 | 使用 |
---|---|---|
sadd、smembers、sismember | sadd添加、smembers 遍历、sismember判断是否存在 | sadd set1 1,2,3、smembers set1、sismember set1 1 |
scard | 获取集合里的元素个数 | scard set1 |
srem key value | 删除集合中的元素 | srem set1 1 |
srandmember key n | 某个整数(随机出几个数) | srandmember set1 2(随机出两个数) |
spop key | 随机出栈 | spop set1 |
smove key1 key2 key1中的某个值 | 将key1中的值移入到key2中 | smove set1 set2 5(将set1的5移入到set2中) |
数学集合类 sdiff(差集)、sinter(交集)、sunion(并集) | sdiff为set1中有set2中没有的、sinter为二者共同部分、sunion为二者和在一起但共同部分只保留一个 | sdiff set1 set2 |
Zset
有序的Set
,在Set基础上,加一个score值,之前的set为k1 v1 v2 v3,现在Zset是k1 scroe1 v1 score2 v2
常用命令
命令 | 作用 | 实例 |
---|---|---|
zadd、zrange(末尾加Withscores),zrevrange | 添加、遍历、逆序遍历 | zrang set1 0 -1 withscores |
zrangebyscore key 开始score 结束score (“(”不包含,limit 截取结果分页)、zrevrange key 开始score 结束score | 显示指定分数范围、逆序输出 | zrangebyscore set1 60 (90 limit 2 2 |
zrem key 对应分数 | 删除分数对应的元素 | zrem zset01 v5 |
zcrad、zcount key score范围、zrank key values值 、zrevrank key values值 | 计算个数、计算指定范围个数、查看value对应下标、逆序获取下标值 | zrank zset1 v4 |
Hash
KV模式不变,但V是键值对
常用命令
命令 | 作用 | 实例 |
---|---|---|
hset、hmset、hget、hmget、hgetall、hdel | 设置、获取、删除 | hmset customer id 11 name lin、hdel customer name |
hlen | 获取长度 | hlen customer(显示4) |
hexists key 在key里面的某个值的key | 判断是否存在 | Hexists customer id |
hkeys、hvals | 所有的key、所有的value | Hkeys customer |
hincrby、hincrbyfloat key key n | 增加n | hicrby customer age 2 |
hsetnx key key value | 添加键值对如果不存在 | hsetnx customer email 10086 |
Redis的配置文件内容
文件名:redis.conf
Unit(单位)
单位不区分大小写
Includes包含
引入其他的配置文件
General通用配置
daemonize ——是否以守护进程运行
pidfile——进程文件位置
dir ./——指定数据库存放位置
port——端口
Tcp-backlog——设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成3次握手队列+已经完成3次握手队列,在高并发的环境下需要设置一个高的backlog的值来避免慢客户端连接问题。注意Linux内核会将这个值减少/proc/sys/net/core/somaconn的值,所以需要确认增大somaconn和tcp_max_syn_backlog两个值来达到效果
timeout 0——设置断开时间,“0”为永不断开
Tcp-keepalive——网络检测时间,单位为秒,如果设置为 0 ,为不检测,一般设置60
Loglevel——日志级别,debug、verbose、notice、warning
Logfile——日志文件位置
Syslog-enabled——是否把日志输出到syslog中
Syslog-ident——syslog的日志标识
Syslog-facitiy——指定syslog设备,可以是user或local0-7
Databases——默认安装有16个库
Security安全
访问密码的查看、设置和取消
先开启redis客户端
redis -server /myconfigredis/redis.conf
redis -cli
密码的查看
命令:config get requirepass,此时没有密码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EYduvIJm-1613904231343)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\image-20210218144656389.png)]
密码的设置
命令:config set requirepass 密码
注意:此时ping需要密码验证,使用命令:auth 密码
密码的取消
命令:config set requirepass “”
limits限制
极限
maxclients——最多连的客户机数量
maxmemory——最大的内存
maxmemory-policy——过期策略
maxmemory-samples——设置样本数量,选取样本数量在样本选取符合的移除
Snapshotting快照
save——保存
快照的使用
redis启动时会读取dump.rdb文件
备份:
还原:
stop-writes-on-bgsave-error——后台保存错误后前台停止写操作
rdbcompression——对与rdb文件是否开启压缩
rdbchecksum——rdb校验
dbfilename——转存的文件名
dir——redis启动时所在的目录
APPEND ONLY MODE追加
appendonly——是否开启aof持久化
appendfilename——aof的文件名称
appendfsyc——记录策略
- Always:同步持久化,每次发生数据时会立即记录到磁盘,性能差但数据完整性较好
- everysec:默认,每秒钟记录
- No
No-appendfsyc-on-write——重写时是否可以运用appendfsysc,用默认no即可,保证数据安全性
auto-aof-rewrite-min-size——设置重写的基准值
auto-aof-rewrite-percentage——设置重写的基准值
Redis的持久化
由于 Redis 是一个内存数据库,所谓内存数据库,就是将数据库中的内容保存在内存中,这与传统的MySQL,Oracle等关系型数据库直接将内容保存到硬盘中相比,内存数据库的读写效率比传统数据库要快的多(内存的读写效率远远大于硬盘的读写效率)。但是保存在内存中也随之带来了一个缺点,一旦断电或者宕机,那么内存数据库中的数据将会全部丢失。
为了解决这个缺点,Redis提供了将内存数据持久化到硬盘,以及用持久化文件来恢复数据库数据的功能。Redis 支持两种形式的持久化,一种是RDB快照(snapshotting),另外一种是AOF(append-only-file)。
RDB(Redis Database)
是什么?
RDB是Redis用来进行持久化的一种方式,是把当前内存中的数据集快照写入磁盘,也就是 Snapshot 快照(数据库中所有键值对数据)——damp.rdb文件。恢复时是将快照文件直接读到内存里。
RDB是整个内存压缩的snapshot快照,RDB的数据结构,可以配置复合的快照触发条件,默认
是1分钟内修改1万次或5分钟内修改10次或15分钟内改了1次
在redis.conf中
如何触发快照?
- 创建一个配置文件中配置名相同的快照文件,使用cp 从备份机复制出来
- 使用命令时save或bgsave(异步进行,在进行快照操作同时响应客户端的请求)
- 使用flushall,生成空白rdb文件,无意义
总结
AOF(Append Only File)
是什么?
以日志的形式来记录每一个写操作,不记录读操作,在redis重启时会读入该文件,按文件的内容从前到后执行恢复数据
如何启动?
把redis.conf的APPEND ONLY MODE部分的appendonly 修改为yes(这也是恢复的方法)
遇到错误?
因宕机生成的appendonly.aof包含错误内容
两种方法:
-
进入appendonly.aof,将错误部分删除
-
使用命令,在redis-server同级目录下有一个为“redis-check-aof的程序”,使用该程序纠正错误
Rewrite
是什么——由于aof使用文件追加,文件越来越大,故新增了重写机制,当aof文件大小超过所设定的阈值时,Redis就会启动aof文件的内容压缩,
重写原理——把文件压缩减小
触发机制——Redis会记录重写时的aof大小,默认配置是当aof文件大小是上次rewrite后大小的一倍且文件大于64M时触发
总结
RDB和AOF总结
rdb是用指定时间间隔内按次数触发,aof是时间触发
如果rdb和aof文件同时存在,则此时redis先读取aof文件的内容
事务
是什么?
可以执行多个命令,本质是一组命令的集合,一个事务中的所有命令都会被序列化,按顺序地串行化执行且不允许其他命令插入
命令
multi——开启事务
discard——取消事务,放弃执行事务块内的所有命令
exeu——执行
watch——监控,类似于乐观锁,获取乐观锁版本号,使用:watch key1 ……
,可监控多个key,如果key的值已被别的客户端改变,则整个队列都不会执行
通过watch命令在事务执行之前监控了多个keys,倘若在watch之后有任何key的值发生了变化,exec命令执行的事务都将被放弃,同时返回Nullmuti-bulk应答以通知调用事务者执行失败
unwatch——清理对所有key的监控,取消提交
锁机制
保证并发性和一致性
悲观锁——由于担心每一次修改数据时,都会有人修改数据,于是将整张表都锁起来,并发性差
乐观锁——不担心修改数据时,会有别人修改,采取在每一个数据后面加一个版本号等机制,保证高并发、且不锁整张表
两种错误
- 事务中,有个语句语法错误执行报错,此时会直接显示出错误,这种错误命令,整一组命令都不会执行
- 事务中,有个语句语法正确,但执行时会报错,
如incr v1(v1不为数字)
,此时不会直接显示错误,这种错误命令,除了此语句不执行外,其他正确的语句都会执行
发布订阅
先订阅才能在发布后获取消息
发布发在指定频道中,订阅才能从指定频道中获取
subscribe——订阅指定频道,使用:subscribe c1 c2 ……
publish——发布消息在频道中,使用:publish c1 message
psubscribe——订阅多个,使用:psubscribe new*,订阅多个包含new的频道,“ * ”为通配符
使用:
主从复制
是什么?
主从复制就是主机数据更新后根据配置和策略,自动备份到从机上的master/salver机制,Master以写为主,Salver以读为主。
可以用于读写分离、容灾恢复
使用
- 配从不配主,从机要配置,主机不需要配置
- 从库配置:
命令:salveof 主库IP 主库端口
- 每次与主机断开后都得重新连接,除非配置进配置文件中
- Info replication
常用3招
-
一主二仆
-
Info replication——查看redis的角色
-
salveof 主机IP 主机端口——变为从机
注意:无论从机何时使用该命令,变为从机后,主机的内容全部都有,且从机不能继续写操作
若主机断线,从机内容不变,直至主机重启
若从机断线,内容消失,且不在是从机,除非使用命令或在主机配置文件中配置重新变为从机
-
-
薪火相传
使用:slaveof 从机IP 从机端口
——变为从机的从机
-
反客为主
- 即原来的主机断线了,或者损坏了,选择一台从机变为主机,
使用命令:slaveof no one,从机变为主机
再其他从机上使用:slaveof 变为主机的ip地址 端口
- 即原来的主机断线了,或者损坏了,选择一台从机变为主机,
修改配置文件细节操作
- 拷贝多个redis.conf文件
- 开启daemonize yes——使redis变为后台守护进程
- Pid文件名字
- 指定端口
- Log文件名字
- Dump.rdb名字
复制原理
salve启动成功连接到master后发送一个sync命令。
master接收到命令启动后台的存盘进程,同时收集所有收到的用于修改数据集的命令,在后台进程执行完毕之后,master将传送整个文件到salve,已完成一次完全的数据同步。
- 全量复制:第一次从机从主机获取到数据库文件数据后,将其存盘并加载到内存中
- 增量复制:每一个主机修改依次将收集的命令发送给从机,以完成同步
哨兵
一组sentinel能同时监控多个Master
使用:
-
编写配置文件sentinel.conf
sentinel monitor 被监控的数据库名字(自己取) ip地址 端口 决定票数
-
运行哨兵
redis-sentinel sentinel.conf的路径
注意:
监控的主机坏了,哨兵会自己选出下一个主机
若原来的主机回来了,原来的主机将变成从机
JRedis
Java去连接Redis的API工具
命令变方法
操作和命令行系统
JRedisPool
原因:需要多个JRedis实例,使用池子概念,不容易消耗内存
生成一个池的实例的方法
回收的方法:
使用: