主要从事Linux,云原生架构改造,服务网格,ELK,python,golang等相关技术。
分类: NOSQL
2015-06-04 17:24:41
NoSQL介绍
NoSQL是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准、ACID属性、表结构等等,这类数据库主要要有以下特点:非关系型的、分布式的、开源的、水平可扩展的。
Redis在插入数据的时候不需要创建表结构
NoSQL特点:
1.处理超大量的数据
2.运行在便宜的PC服务器集群上
3.击碎了性能瓶颈(在mysql上我们经常需要做一些优化,但是在NoSQL上直接就可以达到这种要求)
NoSQL适用场景
1.对数据高并发读写
2.对海量数据的高效率存储和访问(我们可以看一下fielfead的2.5亿高访问量)
3.对数据的高可扩展性和高可用性(对一个24小时的数据库来说增加结点比较麻烦,NoSQL是一种分布式的存储,增加起来比较轻松)
Redis的介绍
Redis is an open source,advanced key-value store.It is often referred to as a data structure server since keys can contain strings,hashes,lists,sets and sorted sets.
Redis是一个开源的,先进的key-value 存储。它通常被称为数据结构服务器,因为键可以包含字符串,哈希,链表,集合和有序集合。
Redis是一个Key-value存储系统。它支持存储的value类型很多,包括string(字符串)、
List(链表)、set(集合)、zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集和并集及更丰富的操作,Redis支持各种不同方式的排序。为了保证效率。数据都是缓存在内存中,它也可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
提供的API语言包括:C、C++、C#、Clojure Common Lisp、Erlang、Haskell、Java、Javascript、Lua、Objective-C、Perl、PHP、Python、Ruby、Scala、Go、Tcl
目前全球最大的Redis用户是新浪微博,在新浪有200多台物理机,400多个端口正在运行着Redis,有+4G的数据在Redis上来为微博用户提供服务。
第一种场景:Redis集群,如果Redis服务器宕机了,我们的数据会丢失,存在安全隐患
2.应用程序直接访问Redis,只有当Redis访问失败时才访问MySQL
一个简单的例子解释Redis和mysql的区别:
把大象装冰箱的过程:
1.打开冰箱门
2.把大象装进去
3.把冰箱门关上
Redis数据库提供多种灵活的数据结构和数据操作,为不同的大象构建不同的冰箱。
1.取最新N个数据的操作
2.排行榜应用,取TOP N操作
3.需要精确设定过期时间的应用(可以设置key 过期时间,这个mysql是无法做到的)
4.计数应用(新浪微博里面主要用在计数器上)
5.Uniq操作,获取某段时间所有数据排重值
6.实时系统,反垃圾系统
7.Pub/Sub构建实时消息系统
8.构建队列系统
9.缓存
RedisMemcached和mysql区别:
1. Schema
MySQL: 需事先设计
Memcached: 无需设计
Redis: 小型系统可以不用,但是如果要合理的规划及使用Redis,需要事先进行类似如下一些规划
数据项: value保存的内容是什么,如用户资料Redis数据类型: 如String, List数据大小: 如100字节记录数: 如100万条(决定是否需要拆分)……
上面的规划就是一种schema,为什么Redis在大型项目需要事先设计schema?因为Redis服务器有容量限制,数据容量不能超出物理内存大小,同时考虑到业务数据的可扩充性,记录数会持续增多、单条记录的内容也都会增长,因此需要提前规划好容量,数据架构师就是通过schema来判断当前业务的Redis是否需要“分库分表”以满足可扩展需求。
2. 容量及带宽规划
容量规划
MySQL: < 硬盘大小
Memcached: < RAM
Redis: < RAM
带宽规划
由于Redis比MySQL快10倍以上,因此带宽也是需要事先规划,避免带宽跑满而出现瓶颈。
3. 性能规划(QPS)
当系统读写出现瓶颈,通常如何解决?
MySQL
写: 拆分到多服务器
读: (1) 拆分 (2) 写少也可以通过增加Slave来解决
Memcached
读写: 都通过hash拆分到更多节点。
Redis:
写:拆分
读: (1) 拆分 (2) 写少也可以通过增加Slave来解决
4. 可扩展性
MySQL: 分库分表
Memcached: hash分布
Redis:也可以分库,也可以hash分布
小结
通过以上分析,Redis在很多方面同时具备MySQL及Memcached使用特征,在某些方面则更像MySQL。
由于Redis数据不能超过内存大小,一方面需要进行事先容量规划,保证容量足够;另外一方面设计上需要防止数据规模无限制增加,进而导致Redis不可扩展。
Redis需要象MySQL一样预先设计好拆分方案。
[root@vm3 redis-3.0.1]# mkdir -p /usr/local/redis/etc
[root@vm3 redis-3.0.1]# mv redis.conf /usr/local/redis/etc/
[root@vm3 redis-3.0.1]# cd src/
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 4890/redis-server *
tcp 0 0 :::6379 :::* LISTEN 4890/redis-server *
127.0.0.1:6379>