Redis简介
一 为什么会出现Redis?
不用说,如果你明白了这个问题,那么你就可以很轻松的知道Redis的一些特点和解决的问题。
- 在出现数据库之前,我们通过IO把数据放在文件中。在寻找该文件时,需要磁盘寻址(毫秒级 ms)(比内存寻址慢很多 纳秒级 ns),而且吞吐量也是有限的。
- 随着文件变大,检索文件中的数据会变慢,因为需要 全量读入内存。
- 这时为了提升速度出现了数据库,底层采用分治的思想将数据分成若干个4kb(大小数据库中可调,4kb更接近文件系统底层)的data page,不用整个文件全量读入。还是存在浪费,有时为了存小于4kb的文件,会用4kb的大小存放;读时需将4kb全部读入。
但全表扫描时,速度还是很慢,因为需要一个一个数据块的扫描。 - 数据库建立了索引,它也是数据,索引中的数据只是全量中的1/n, 用于存储数据的唯一标识和全量数据存在的位置。检索时会索引全量扫描。索引也在磁盘中,为了提速利用数据结构将索引的树干放在在内存中,内存的树干可以理解为多级索引。
- 当今数据库中的表可能会很大很大,由于磁盘寻址和吞吐量的瓶颈,高并发查询不同的4kb的时会变得很慢。
在避免磁盘的瓶颈的时候,可以将数据全量放在内存中。如,HANA数据库。但是硬件要求很高,产品很贵,现阶段无法推广。(ps:将数据放全部放入内存,会比放在磁盘节省空间,因为放磁盘时会有许多“副本”)该数据库类似享元模式。 - 这时就有一种折中的方出现了,将热数据(频繁访问)放入内存中,而不是全量数据, 是全量的1/n,如,Redis、Memcached技术。
二 什么是Redis?
Redis是完全开源免费的,遵循BSD协议,是一款高性能(NoSQL)的key-value数据库,Redis是一个来源的使用ANSI C语言编写的、支持网络的、可基于内存也可基于持久化的日志型的、key-value数据库,并提供多种语言的API。
官方的bench-mark数据:
测试完成了50个并发执行100000个请求。设置和获取的值是一个256字节字符串。Linux box是运行Linux 2.6,这是X3320 Xeon 2.5 ghz。文本执行使用loopback接口(127.0.0.1)。
结果:每秒约110000读,每秒约81000写。
ps:
- BSD(Berkeley Software Distribution):
是一种开源协议。可以自由使用、修改源代码、还可以将修改过的代码开源发行。如,linux就遵循该协议。
- NoSQl(Not-only SQL)
泛指非关系型数据库,它可以作为关系型数据库的 补充 。如,MongoDB等。当然还有Redis。
三 Redis是一种NoSQL ,那么就先来了解一下NoSQL吧!
1. 先了解关系型数据库存在的问题。
-
High performance,对数据库高并发读写的需求,如,统计实时统计在线用户的状态、记录热门帖子的点击次数、投票计数等。
-
Huge storage,对海量数据的高效存储和访问需求,如,QQ号的查询登录。
-
High scalability && High Availability,对数据的高扩展性和高可用性需求。
NoSQl的产生就是为了解决这些问题。
2. NoSQL的类别
类别名称 | 简介 | 优点 | 缺点 | 产品举例 | 典型应用 |
---|---|---|---|---|---|
键值(key-value)数据库 | 主要用到一个哈希表 | 简单、易部署,快速查询 | 存储的数据缺少结构化,即能存的字段少 | Redis | 内容缓存,主要用于处理大量数据的高访问负载 |
列存储数据库 | key指向列,以列族式存储,将同一列数据放在一起 | 查询速度快,可扩展性强更容易进行分布式扩展 | 功能相对局限 | HBase | 分布式的文件系统 |
文档型数据库 | 一系列键值对,可以看作是键值数据库的升级 | 数据要求不严格 | 查询性能不高,缺乏统一的查询语句 | MongolianDB | web应用(与key-value类似,value是结构化的,如,JSON) |
图形(Graph)数据库 | 图结构实现 | 利用图结构的相关算法 | 难以得出结果,需要对整个图计算,不容易做分布式的集群方案 | Neo4J | 社交网络 |
3. NoSQL应用场景总结:
1. 数据模型比较简单;
2. 需求灵活性更强的IT系统;
3. 对数据库性能要求较高;
4. 不需要高度的数据一致性;
5. 对于给定key,比较容易映射的复杂的环境;
一句话就是为了解决,高并发!
四 Redis详解
1. Redis特点
- 性能极高,读 110000次/s,写 81000次/s;
- 丰富的数据类型,支持的类型 String,Hash,List,Set及Ordered Set数据类型操作。
- 原子性,Redis操作都是原子性,及一个操作只会有完成和完全不执行两种情况。多操作支持 事务,及原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性,支持publish/subscrbe,通知,key过期等特性。
- 高速读写,Redis使用自己实现的分离器,代码量很短,没有lock,因此效率非常高。
2. Resdis缺点
- 持久化,Redis直接将数据存储到内存中,要将书保存到磁盘,有两种方式。一种,定时快照(snapshot):每隔义端时间将整个数据库写到磁盘上,每次写全部数据,代价非常高。另一种,基于语句追加(aof):只追踪变化的数据,追加的log可能过大,同时所有的操作均重新执行一遍,回复速度慢。
- 耗内存,占用内存过高。
3. Redis的应用场景
企业开发中:可以用作数据库、缓存、热点数据(经常查询,但是不会被经常查询或删除的数据)和消息中间件等大部分功能。
常用场景:
- 缓存,在大型网站中提高网站访问速度,大大降低数据库的压力。Redis提供了key过期功能,也提供了灵活的淘汰机制。
- 排行榜,Redis提供的有序集合数据了构,能够实现各种复杂的排行榜。
- 计数器,如,电商网站的浏览量,视频网站的播放量等,为了保证数据的时效性,每次浏览+1,高并发时数据库压力很大。如果用Redis提供的incr命令实现计数器功能,内存操作,性能非常好。
- 分布式会话,集群模式下,在应用不多时,一般使用容器自带的session复制功能就能满足;在应用增多相对复杂的系统中,一般都会搭建以Redis为内存数据库为中心的session,不在有容器管理,而是由session服务和内存数据库管理。
- 分布式锁,分布式技术下对统一资源的并发访问,如全局id,减库存,秒杀场景,并发量不大的情况下,可以使用数据库的悲观锁、乐观锁来实现,并发量大会大大影响数据库的性能;可以利用Redis的setnx功能来编写分布式锁,设置返回1,获取锁成功,否则失败。
- 社交网络,点赞、踩、关注/被关注、共同好友等功能,传统数据库不合适存储这种数据,Redis的哈希、集合等很方便存储。
- 最新列表,Redis列表结构,LPUSH可以在列表头部插入一个内容ID作为关键字。LTRIM可用来限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接根据ID去对饮的内容也即可。
- 消息系统,消息队列是大型网站比用的中间件,如,AciveMQ,RabbitMQ、kafka等,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供发布、订阅及阻塞队列功能,能实现简单的消息队列系统。
感谢阅读!