1. 什么是NoSQL
- NoSQL简介
- NoSQL(Not Only SQL ),意即“不仅仅是SQL”,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
- NoSQL是为了解决高并发、高可用、高性能,大数据存储等一系列问题而产生的数据库解决方案!
小常识:- 大数据时代的3V:海量(Volume)、多样(Variety)、实时(Velocity)
- 互联网需求的3高:高并发、高可用、高性能
- NoSQL数据库的分类
最常用的NoSQL数据库有Redis、MongoDB、HBase等…
- 根据不同的NoSQL数据库满足不同的需求场景:
- Redis:用于缓存,读写速度极快(内存中,在做缓存时要注意,只有热点、高频的数据才放到Redis中;
- HBase:离线分析,大数据;
- MongoDB:适合文档化格式的存储及查询(JSON结构存储)
- Neo4j:专注于社交网络、推荐系统,方便构建关系图谱(高级功能收费)
- 有了NoSQL是否就不需要SQL了?
- NoSQL数据库不能替代关系型数据库,只能作为关系型数据库的一个良好补充;
- 经典的数据库应用组合是SQL + NoSQL(如:MySQL + Redis)
- 由于大部分NoSQL数据库对事务支持相对较差,大量关键性的业务数据还是需要放到关系数据库存储
- 由于缓存数据需要很高的查询性能,每次直接从内存中获取的速度是最快的,再加上缓存数据的格式往往都不一致,因此放到Redis中是最适合的
2. 认识Redis
- Redis 是一个基于内存的高性能key-value数据库,在部分场合可以对关系数据库起到很好的补充作用,它提供了Java、Python,Ruby,Erlang,PHP等客户端,使用很方便。
- Redis异常快,因为它是单进程、单线程、内存操作。
- Redis是目前业界使用最广泛的内存数据存储。相比Memcached,Redis支持更丰富的数据结构,例如hash, list, set等,同时支持数据持久化。除此之外,Redis还提供一些类数据库的特性,比如事务,HA,主从库。可以说Redis兼具了缓存系统和数据库的一些特性,因此有着丰富的应用场景。
- Redis支持的数据类型:String(字符串)、Hash(哈希类型)、List(链表)、Set(不重复集合)、Zset(Sorted Set-有序集合)及HyperLogLog(基数提取)等。
- Redis的应用场景
- 数据缓存(分类信息、数据列表、数据详情等等)
- 任务队列(秒杀、抢购等等)
- 分布式集群架构中的session分离
- 数据过期处理(可以精确到毫秒)
- 排行榜
- …
3. Redis的数据类型
- Redis是Key-Value数据库,这里所说的数据类型都指的是Value的类型,Key永远都是字符串;
- Redis支持的数据类型:String(字符串)、hash(哈希类型 重点)、List(链表)、Set(不重复集合)、Zset(Sorted Set-有序集合)及HyperLogLog(基数提取)等。
- 所有类型的操作命令参考:https://redis.io/commands、http://doc.redisfans.com/。
4. Redis事务
-
定义
Redis 事务可以一次执行多个命令,本质是一组命令的集合,一个事务中所有的命令将按顺序执行而不会被其他命令插入 。 -
一个事务从开始到执行会经历以下三个阶段
- 开始事务
- 命令入队
- 执行事务
-
事务操作相关命令
-
MULTI 开启事务
EXEC 执行事务
DISCARD 取消事务 -
WATCH key [key …] 监听某个 key的值是否发生变化,如果发生变化,事务会中断
利用WATCH可以很方便解决更新丢失的问题,达到数据一致性!扩展阅读,在关系型数据库中解决更新丢失问题:
- 悲观锁和乐观锁
- 在高并发的分布式环境下,巧用CAS解决数据一致性问题:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=400556481&idx=1&sn=42bc187b45e4e53aece4b8c1f43e8019&scene=0#rd
-
UNWATCH 取消 WATCH 命令对所有 key 的监视。
-
-
注意:
- Redis事务隔离性仍然存在,如果事务不提交,其它客户端操作是看不到相关记录
- Redis事务不保证原子性, 在传统的关系型数据中,只要有任意一条指令失败,则整个事务都会被撤销回滚,而在Redis中,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做,也因此得出 Redis 事务的执行并不是原子性的!
5. Redis持久化
- Redis是支持持久化的内存数据库,也就是说Redis需要经常将内存中的数据同步到硬盘来保证持久化。
- Redis持久化存储支持两种方式:RDB(默认方式)和AOF。RDB一定时间去存储文件,AOF默认每秒去存储历史命令,官方建议两种方式同时使用。
5.1. RDB
- 介绍
RDB方式的持久化是通过快照完成的,当符合一定条件时,Redis会自动将内存中的所有数据执行快照操作并存储到硬盘上。 - 修改redis.conf ,设置持久化快照的条件
- RDB的持久化与恢复
- 持久化过程
当满足save的条件时,比如更改了1个key,900s后会将数据写入临时文件,持久化完成后将临时文件替换旧的dump.rdb。 - 恢复过程
自动的持久化数据存储到dump.rdb后。实际只要重启Redis服务即可完成(启动Redis的server时会从dump.rdb中先同步数据)。
- 持久化过程
- RDB的优缺点
- 优点
使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了Redis的高性能 - 缺点
一旦Redis非法关闭,那么会丢失最后一次持久化之后的数据。- 如果数据不重要(比如:仅仅是做缓存,如果缓存丢失大不了重新查询),则不必要关心。
- 如果不允许有数据的大量丢失,那么要使用AOF方式。
- 优点
5.2. AOF
-
介绍
AOF(append-only file)是将执行过的指令记录下来,数据恢复时按照从前到后的顺序再将指令执行一遍,实现数据恢复。 -
修改redis.conf,打开AOF持久化
- 配置完成需要重启Redis,会发现在bin目录下多出一个appendonly.aof文件
- 开启AOF后,RDB模式就会失效,且之前的数据会被清空,如果redis重启,则数据从AOF文件加载。
-
AOF的优缺点
- 优点
可以保持更高的数据完整性,如果设置追加file的时间是1s,若Redis发生故障,最多会丢失1s的数据。 - 缺点
AOF文件比RDB文件大,且恢复速度慢。
- 优点