具体表现为对如下三高问题的解决:
在同一个时间点,同时有海量的用户并发访问。往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。
如天猫的双11,从凌晨0点到2点这段时间,每秒达到上千万次的访问量。12306春运期间,过年回家买火车抢票的时间,用户不断查询有没有剩余票。 数据库中数据量特别大,数据库表中每天产生海量的数据。
类似QQ,微信,微博,每天用户产生海量的用户动态,每天产生几千万条记录。对于关系数据库来说,在一张几亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。
关系型数据库进行扩展和升级是比较麻烦的一样事,对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移。
非关系型数据库可以通过不断的添加服务器节点来实现扩展,而不需对原有的数据库进行维护。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EprPcvs1-1593670948503)(C:\Users\93422\AppData\Roaming\Typora\typora-user-images\1593663867071.png)]
Not Only SQL:不仅仅是SQL,指的就是非关系型数据库,它是关系型数据库有益的补充。最终的数据还是保存在关系型数据库中。非关系型数据库主要是提升数据库的查询速度,一般做为数据的缓存来使用。
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。
概念:Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。 特征:
数据间没有必然的关联关系内部采用单线程机制进行工作高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。多数据类型支持 ◆ 字符串类型 string ◆ 列表类型 list ◆ 散列类型 hash ◆ 集合类型 set ◆ 有序集合类型 zset/sorted_set支持持久化,可以进行数据灾难恢复⚫ 为热点数据加速查询(主要场景),如热点商品、热点新闻、热点资讯、推广类等高访问量信息等 ⚫ 即时信息查询,如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等 ⚫ 时效性信息控制,如验证码控制、投票控制等 ⚫ 分布式数据共享,如分布式集群架构中的 session 分离 ⚫ 消息队列
官网提供了Linux版的Redis下载
http://redis.io/download
Windows版的Redis,下载地址如下:
https://github.com/MSOpenTech/redis/tags
⚫ redis 自身是一个 Map,其中所有的数据都是采用 key : value 的形式存储 ⚫ 数据类型指的是存储的数据的类型,也就是 value 部分的类型,key 部分永远都是字符串
redis是一种高级的key-value的存储系统,其中value支持五种数据类型,指的是它值的类型,键可以认为是字符串类型。redis不是用Java写的,是C语言写的。
值的数据类型说明string类型字符串list类型列表:元素可以重复,元素是有索引号,有先后顺序的set类型集合:元素是不可重复的,元素没有索引号,没有先后顺序的hash类型值由多个键值对组成zset类型集合:元素不可重复的,每个元素有索引号,还有一个分数值,可以根据分数进行排序在Redis中以二进制保存,没有编码和解码的过程。
无论存入的是字符串、整数、浮点类型都会以字符串写入。
在Redis中字符串类型的值最多可以容纳的数据长度是512M,这是以后最常用的数据类型。
上面图的存储格式和java中的Map嵌套Map很像
Map<String,Map<String,String>>⚫ 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息 ⚫ 需要的存储结构:一个存储空间保存多个键值对数据 ⚫ hash类型:底层使用哈希表结构实现数据存储
在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其左部(left)和右部(right)添加新的元素。
在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。
如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。
List中可以包含的最大元素数量是4G个(41亿个)
⚫ 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分 ⚫ 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序 ⚫ list类型:保存多个数据,底层使用双向链表存储结构实现
⚫ 新的存储需求:存储大量的数据,在查询方面提供更高的效率 ⚫ 需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询 ⚫ set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的
⚫ set 类型不允许数据重复,如果添加的数据在 set 中已经存在,将只保留一份 ⚫ set 虽然与hash的存储结构相同,但是无法启用hash中存储值的空间