一.什么是nosql
NoSQL是不同于传统的关系数据库的数据库管理系统的统称。其两者最重要的区别是NoSQL不使用SQL作为查询语言。NoSQL数据存储可以不需要固定的表格模式。NoSQL是基于键值对的,可以想象成表中的主键和值的对应关系。
二.redis概念
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings)、散列(hashes)、 列表(lists)、 集合(sets)、 有序集合(sorted sets)等。
三.从数据库类型、数据存储方式、特殊功能讲解Redis和memcached和mysql的区别
四.redis和memcached优势对比
1.内存管理机制
(1)Memcached默认使用Slab Allocation机制管理内存,其主要思想是按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。空闲列表进行判断存储状态(类似于java虚拟机对象的分配,空闲列表)
(2)Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片(CPU内存是连续的,类似于Java虚拟机对象的分配,直接内存分配(指针碰撞))
2.数据持久化方案
(1)memcached不支持内存数据的持久化操作,所有的数据都以in-memory的形式存储。
(2)redis支持持久化操作。redis提供了两种不同的持久化方法来将数据存储到硬盘里面,第一种是rdb形式,另一种是aof形式
rdb:属于全量数据备份,备份的是数据
aof:apend only if,增量持久化备份,备份的是指令
3.缓存过期机制
(1)Memcached在删除失效主键时也是采用的消极方式,即Memcached内部也不会监视主键是否失效,而是在通过Get访问主键时才会检查其是否已经失效
(2)Redis定时、定期等多种缓存失效机制,减少内存泄漏
4.支持的数据类型
(1)Memcached支持单一数据类型,key-value
(2)reids支持五种数据类型
五.redis事务图解
六.redis事务-acid
1.原子性
事务具备原子性指的是,数据库将事务中多个操作当作一个整体来执行,服务要么执行事务中所有的操作,要么一个操作也不会执行。
(1)事务队列
首先弄清楚Redis开始事务multi命令后,Redis会为这个事务生成一个队列,每次操作的命令都会按照顺序插入到这个队列中。这个队列不会被马上执行,直到exec 命令提交事务,所有队列里面的命令会被一次性,并且排他的进行执行。
但是原子性有一个特点就是要么全部成功,要么全部失败,也就是我们传统DB里面说的回滚。
(2)为何Redis不支持回滚
这个其实跟Redis的定位和设计有关系,先看看为何我们的MySQL可以支持回滚,这个还是跟写Log有关系,Redis是完成操作之后才会进行AOF日志记录,AOF日志的定位只是记录操作的指令记录。
而MySQL有完善的Redolog,并且是在事务进行Commit之前就会写完成Relog,Binlog:要知道MySQL为了能进行回滚是花了不少的代价,Redis应用的场景更多是对抗高并发具备高性能,所以Redis选择更简单,更快速无回滚的方式处理事务也是符合场景。
2.一致性
事务具备一致性指的是,如果数据库在执行事务之前是一致的,那么在事务执行之后,无论事务是否成功,数据库也应该是一致的。
从Redis来说可以从2个层面看,一个是执行错误是否确保一致性,另一个是宕机时,Redis是否有确保一致性的极致
(1)执行错误是否有确保一致性
依然去执行一个错误的事务,在事务执行的过程中会识别出来并进行错误处理,这些错误并不会对数据库做出修改,也不会对事务的一致性产生影响。
(2)宕机对一致性的影响
暂不考虑分布式高可用的Redis解决方案,先从单机看宕机恢复是否能满足数据完整性约束。
无论是RDB还是AOF持久化方案,可以使用RDB文件或AOF文件进行恢复数据,从而使数据库还原到一个一致的状态
(3)一致性总结
如果仅仅就ACID的表述不谈业务来说,那显然就是满足一致性。但如果加上业务去谈一致性,例如,A转账给B,A减少10块钱,B增加10块钱,因为Redis并不具备回滚,一旦某一条失败就会出现不一致,所以不具备传统意义上的原子性,所以Redis也应该不具备传统的一致性。
3.隔离性
隔离性指的是,数据库中有多个事务并发的执行,各个事务直接不会相互影响,并且在并发状态下执行的事务和串行执行的事务产生的结果是完全相同的。
Redis的事务因为是单线程操作,所以在隔离性上有天生的隔离机制,当Redis执行事务时,Redis的服务端保证在执行事务期间不会对事务进行中断,所以,Redis事务总是以串行的方式运行,事务也具备隔离性。
4.持久性
事务的持久性指的是,当一个事务执行完毕,执行这个事务所得到的结果被保存在持久化的存储中,即使服务器在事务执行完成后停机了,执行的事务的结果也不会被丢失。
Redis是否具备持久化,这个取决于Redis的持久化模式:
(1)纯内存运行:不具备持久化,服务器一旦停机,所有数据将丢失
(2)RDB模式:取决于RDB策略,只有在满足策略才会执行Bgsave,异步执行并不能保证Rdeis具备持久化
(3)AOF模式:只有将appendfsync设置为always,程序才会执行命令同步保存到磁盘,这个模式下,Redis具备持久化。(将appendfsync设置为always,只是理论上持久化可行,但是一般不会这么操作)
5.简单总结
(1)Redis具备了一定的原子性,但不支持回滚
(2)Redis不具备ACID中一致性的概念(或者说Redis在设计时就无视这点)
(3)Redis具备隔离性
(4)Redis通过一定策略可以保证持久性