文章目录
- 一、Redis是什么?
- 二、Redis优缺点?
- 三、Redis应用场景
- 四、Redis安装和使用
- 五、Redis为什么这么快?
- 1、为什么采用单线程
- 2、Redis的I/O多路复用
一、Redis是什么?
Redis(Remote Dictionary Server:远程字典服务)是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API的非关系型数据库。
传统数据库遵循 ACID 规则。而 Nosql(Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称) 一般为分布式,而分布式一般遵循 CAP 定理。
二、Redis优缺点?
【优点1—性能出色】:
Redis本质上是一个Key-Value类型的内存数据库,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。
因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作,是已知性能最快的Key-Value DB。
【优点2—支持多种数据结构】:
Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。
【缺点1–容量受限】:
Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
【缺点2–只能使用单线程】:
Redis只能使用单线程。
三、Redis应用场景
- 做热点数据的缓存(Redis提供持久化),适合经常用来被查,不经常修改或删除的数据。网站访问数据的特点大多数呈现在"二八定律":80%的业务访问集中在20%的数据上。这时为了减轻数据的压力和提高网站的数据访问速度,则可以使用缓存机制来优化网站。如一个小说网站,每天有100W人访问某部小说中的某篇文章,这篇文章若是从数据库那拿,每天都要消耗100W次数据库请求,这样很消耗数据库资源,若把这篇文章放入redis,数据库资源消耗小,性能高。
- 计数器,统计网站点击数,因为单线程,可以避免并发,而且性能高。
- 排行榜,统计比赛排名,或者活跃度排名。
- 消息中间件,和ActivitiMQ,RocketMQ类似,做消息队列,但不推荐。但是可以用来作为用户列表,比如好友列表,求集合的交集、并集、差集。
- 重复请求的记录或秒杀系统,可以用来限制一段时间内数据的重复提交,如你要做限购商品的功能,规定一个IP当天只能买10次,一个用户名当天只能买5次,把买的次数数据记录下来,然后设置有效时间,超过次数的不准买。也可用在秒杀系统,记录商品库存,卖掉一次就在Redis减库存,因为Redis的操作是原子性的。
- 发布订阅功能,关注的某个公众号或者版主发布了新的文章,直接推送到每一个订阅用户。
四、Redis安装和使用
1、更新源并安装redis
sudo apt-get update
sudo apt-get install redis-server
2、查看版本
redis-server -v
3、修改配置文件,注释掉bind 127.0.0.1
/etc/redis/redis.conf
4、重启redis-server
sudo service redis-server restart
5、查看 redis 是否启动,输入ping(测试Redis的连通性),回复pong
redis-cli
五、Redis为什么这么快?
Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提供的数据是可以达到每秒10万+查询次数。主要设计如下:
- 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。
- 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作。
- 使用多路I/O复用模型,非阻塞IO。
1、为什么采用单线程
我们对多线程的第一印象就是多线程要快些,是哪方面快 ?很多人都能想到是计算能力,没错,我们对cpu的利用率提高了。那么我们设想下独立模式下单台redis的性能瓶颈是什么了?
我们知道Redis是基于内存的操作,CPU不是Redis的瓶颈,其实Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。(毕竟采用多线程会有很多麻烦!)。
2、Redis的I/O多路复用
传统的Blocking IO操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务。
而 I/O 多路复用就是为了解决这个问题而出现的。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗)。
I/O多路复用实际上就是用select, poll, epoll技术等监听多个IO对象,当IO对象有变化(有数据)的时候就通知用户进程。好处就是单个进程可以处理多个socket。