NoSQL 介绍之Redis
一切工业技术的革新都是为了解决当时遇到的瓶颈,那数据库也不例外。
在早期Web1.0(是以编辑为特征,网站提供给用户的内容是网站编辑进行编辑处理后提供的,用户阅读网站提供的内容。这个过程是网站到用户的单向行为,web1.0时代的代表站点为新浪,搜狐,网易三大门户。),由于用户的访问量很少,设计和实现程序主要是为了解决功能问题,用一夫当关的高性能的单点服务器(小型机,典型的Oracle DB2)可以解决大部分问题,此阶段用到的主流的技术:Java、Jsp、RDBMS、Tomcat、HTML、Linux、Jdbc、SVN ...虽然效率不高,但是能完成功能没问题。
随着Web2.0(更注重用户的交互作用,用户既是网站内容的浏览者,也是网站内容的制造者,加强了网站与用户的互动,如微博、天涯社区、人人网、自媒体)时代到来,产生了大量的用户数据,加上后来智能移动设备的普及,所有的互联网平台都面临着性能挑战。要解决功能的扩展性的问题,此时更多的考虑是程序的设计原则,比如设计模式、框架等,常用程序的流行的框架有:Structs、Spring、SpringMVC、Hibernate、Mybatis ... (这些框架只是更好的解决了扩展性的问题,没有他们照样也是能完成功能的)。
但是随着用户量、访问量的海量增长,程序开始遇到了性能的问题,像计算密集型应用,如统计分析的应用,单点的CPU可能无法承受;像IO密集型应用,单点服务器的硬盘也无法存储,上面普通的技术无法解决性能的问题,此时出现了:NoSQL、Java多线程、Hadoop、Nginx、MQ、Kafka。
那么问题就围绕着如何解决CPU以及内存的压力、IO压力来开展。
- 解决CPU、内存压力:负载均衡+缓存数据库
- 解决IO压力:打破以业务逻辑为依据的存储,针对不同的数据结构类型改为以性能为优先的存储方式。
NoSQL 数据库概述:
- NoSQL(Not Only SQL),意思为"不仅仅是SQL",泛指非关系型数据库。
- NoSQL不依赖业务逻辑方式存储,而以简单的key-value模式存储,因此大大增加了数据库的扩展能力。
- 不遵循SQL标准 // 增加了学习成本 不能通用
- 不支持ACID
- 远超于SQL的性能。
NoSQL适用场景:
- 对数据高并发的读写
- 海量数据的读写
- 对数据高可扩展性的
NoSQL不适用场景:
- 需要事务支持
- 基于sql的结构化查询存储,处理复杂的关系,需要即席查询
什么是Redis?
redis 是一个基于内存的高性能key-value数据库。
Redis的特点?
Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能快的Key-Value DB。
Redis的出色之处不仅仅是性能,Redis大的魅力是支持保存多种数据结构,此外单个value的大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。
Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
Redis的应用场景:
- 配合关系型数据库做高速缓存
- 高频次、热门访问的数据(热点数据),降低数据库IO
- 分布式架构做session共享
- 由于其具有持久化能力(可以将数据存入磁盘中),可以利用其多样性的数据结构存储特定的数据,如:
- 新的N个数据 -- 通过List实现按自然时间排序的数据
- 排行榜,TOP N -- 利用zset(有序集合)
- 时效性的数据,比如手机验证码 -- Expire 过期时间设置
- 计数器,秒杀 -- 原子性,自增方法 INCR 、DECR
- 去除大量数据中的重复数据 -- 利用Set集合
- 构建队列 -- 利用 List 集合
- 发布订阅消息系统 -- pub/sub模式
Redis支持的数据类型?
- Binary-safe strings
- Lists: collections of string elements sorted according to the order of insertion. They are basically linked lists.
- Sets: collections of unique, unsorted string elements.
- Sorted sets: similar to Sets but where every string element is associated to a floating number value, called score. The elements are always taken sorted by their score, so unlike Sets it is possible to retrieve a range of elements (for example you may ask: give me the top 10, or the bottom 10).
- Hashes: which are maps composed of fields associated with values. Both the field and the value are strings. This is very similar to Ruby or Python hashes.
- Bit arrays (or simply bitmaps): it is possible, using special commands, to handle String values like an array of bits, you can set and clear individual bits, count all the bits set to 1, find the first set or unset bit, and so forth.
- HyperLogLogs:this is a probabilistic data structure which is used in order to estimate the cardinality of a set. Don't be scared, it is simpler than it seems... See later in the HyperLogLog section of this tutorial.
- Streams: append-only collections of map-like entries that provide an abstract log data type. They are covered in depth in the
相关文章