传统型关系数据库Mysql的瓶颈

在互联网领域,MySQL作为一款关系型数据库为互联网的发展做出了卓越的贡献。然而随着互联网的发展,在大数据量高并发的环境下,应用开发也越来越复杂,具有很强的技术挑战性。分表分库子库等无不在增加数据库结构的复杂程度。MySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常的小。

关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL的扩展性差,大数据下IO压力大,表结构更改困难。

Nosql与redis

NoSQL最常见的解释是“non-relational”,“Not Only SQL”也被很多人接受,指的是非关系型的数据库。

Nosql的优势

易扩展:NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。
大数据量,高性能:NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单
灵活的数据模型:NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦
高可用:NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。

redis

Redis是一个开源(BSD许可)的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
redis是一个高性能的key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset–有序集合)和hash(哈希类型)。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

结论

NoSQL数据库的出现,弥补了关系数据(比如MySQL)在某些方面的不足,在某些方面能极大的节省开发成本和维护成本
MySQL和NoSQL都有各自的特点和使用的应用场景,两者的紧密结合将会给数据库发展带来新的思路。让关系数据库关注在关系上,NoSQL关注在存储上。

利用redis做mysql的缓存

前面部分已经介绍mysql的瓶颈,当网站的处理和访问量非常大的时候,我们的数据库的压力就变大了,数据库的连接池,数据库同时处理数据的能力就会受到很大的挑战,一旦数据库承受了其最大承受能力,网站的数据处理效率就会大打折扣。此时就要使用高并发处理、负载均衡和分布式数据库,而这些技术既花费人力,又花费资金。

缓存

1

页面缓存经常用在CMS(content manage system)内存管理系统里面。
数据缓存经常会用在页面的具体数据里面。

Redis缓存原理

采用redis nosql数据库作为Mysql数据库的缓存,在查找的时候,首先查找redis缓存,如果找到则返回结果;如果在redis中没有找到,那么查找Mysql数据库,找到的花则返回结果并且更新redis;如果没有找到则返回空。

2

对于写入:用户增删改数据库,先访问mysql,mysql再把数据更新到redis。

Mysql中的数据都是按表存储的;更微观地看,这些表都是按行存储的。每执行一次select查询,Mysql都会返回一个结果集,这个结果集由若干行组成。所以,一个自然而然的想法就是在Redis中找到一种对应于Mysql行的数据结构。
Redis中提供了五种基本数据结构,即字符串(string)、列表(list)、哈希(hash)、集合(set)和有序集合(sorted set)。经过调研,发现适合存储行的数据结构有两种,即string和hash。

用户的缓存数据在返回时一般都是JSON的字典格式,对应的存到redis里就是hash格式,这个与python的字典是相对应的。

redis中的hash python中的字典
key 对象
field key
value value
即hash会根据要缓存的数据生成唯一标识UUID,UUID作为键,用户的字典数据中的键值对作为UUID键的值,存储到redis中。

__END__