nosql指的是费关系型数据库
Not only sql 不仅仅是数据库,跟关系型数据库相辅相成。
储存的是特殊的数据结构,特点就是速度快,缺陷安全性低。关系型数据库的特点是速度慢,但是安全性高。他们两个在开发中项目结合使用。为什么要有nosql
当前社会特点:
大数据时代:数据量大
数据类型多(多样性)
数据实时性
Web的特点:
高并发:同时访问的情况比较多
高可用:99.99%
高性能:
为了解决web2.0时代网络的问题,nosql应运而生
NoSql特点:
1.易扩展:很容易增加一台新的服务器,只要环境配好就可以直接使用
2.速度快:基本上nosql都是基于内存,所以速度快,安全性就低
3.灵活性好:数据没有特殊要求可以随便储存数据,相比于传统型的关系型数据库,它的灵活性刚好符合目前时代数据多样性
4.高可用性:一台服务器宕机,不影响其他服务器的运行
四大分类
- key-value型数据库(redis):适用于解决缓存问题
- 列式存储数据库(Hbase):适用于分布式文件存储
- 文档型数据库(MongoDb):nodejs+mongodb
- 图形数据存储(Neo4j):适合社交网络,推荐系统
Redis架构
Redis是一个单线程的架构
单线程安全,效率低
多线程效率高,有线程安全问题
这样做简化了数据结构和算法的实现:
redis采用事件模型的机制i/o多路复用机制(linux处理文件的机制)
单线程异步回调:node js
Redis是一个单线程,为什么效率还那么高?
①redis是基于内存的,他的读取速度本身就很快
②使用单线程,避免了CPU对线程的切换,在一定程度上提高了效率
③redis处理问题事件模型机制
Redis的应用场景
- String
Memache(数据结构只有string)
可以应用缓存(加强版memache):处理高并发问题,还可以减少数据库读取数据的压力
命中率:访问数据是通过redis来获取,命中
Session共享
Redis保存分布式web服务器中所有的session实现了session的共享,用户就可以通过redis获取登录的信息
计数功能
应用安全限速
设置键过期时间 expire key second 返回值是一个整形
ttl key查看这个键剩余时间>0 -1 -2
抢购/秒杀 exist()
- Hash
- Set
无序唯一,实现抢购和秒杀
- List
列表,实现新闻聊表
- Soreset
实现游戏排名(维新运动健康,微信小游戏)
Redis事务
事务:
表示一系列操作,作为原子,要么同时成功,要么同时失败
四大特性:
⑴ 原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
⑵ 一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
⑶ 隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
⑷ 持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
1,脏读
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
2,不可重复读
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。
不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
3,虚读(幻读)
幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
Redis事务
Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
一个事务从开始到执行会经历以下三个阶段:
开始事务。
multi
命令入队。
执行事务。
exec
取消执行
decrby
Redis 事务命令
1 | DISCARD 取消事务,放弃执行事务块内的所有命令。 |
2 | EXEC 执行所有事务块内的命令。 |
3 | MULTI 标记一个事务块的开始。 |
4 | UNWATCH 取消 WATCH 命令对所有 key 的监视。 |
5 | WATCH key [key ...] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动, 那么事务将被打断。 |
Watch监听 watch key.....
监听了一个键,在事务中要修改这个键在事务执行之前,有其他人修改了这个键,那么这个事无失败
Unwatch(取消监听)