一、redis高并发和快速的原因
(1)redis是基于内存的,而内存的读写速度非常快;
(2)redis是单线程的,因而省去了很多上下文切换线程的时间;
(3)redis使用多路复用技术,可以处理并发的连接。非阻寒IO内部实现采用epoll,采用了epoll+自己实现的简单事件框架。epoll中的读写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性。
Redis是纯内存数据库,一般都是简单的存取操作,线程占用的时间很多,时间的花费主要集中在IO上,所以读取速度快。
Redis使用的是非阻塞IO,IO多路复用使用了单线程来轮询描述符,将数据库的开、关、读、写都转换成了事件,减少了线程切换时上下文的切换和竞争。
Redis采用了单线程的模型,保证了每个操作的原子性,也减少了线程的上下文切换和竞争。
Redis采用自己实现的事件分离器效率比较高,内部采用非阻塞的执行方式,吞吐能力比较大。
二、Redis也可以用来做消息队列,消息订阅与发布。
subscribe channel:订阅频道,例如:subscribe jasontest,订阅jasontest这个频道。
psubscribe channel*
:批量订阅频道,例如:psubscribe jason*
表示订阅以jason开头的频道。
publish channel content:在指定的频道中发布消息,例如:publish jasontest "jason say hello!"
三、常见问题
1、使用Redis有哪些好处?
(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
(2) 支持丰富的数据类型,支持string,list,set,sorted set,hash;
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行;
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除key。
2、redis相比memcached有哪些优势?
(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型;
(2) redis的速度比memcached快很多;
(3) redis可以持久化其数据;
3、Memcache与Redis的区别都有哪些?
(1)存储方式
Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。Redis有部份存在硬盘上,这样能保证数据的持久性。
(2)数据支持类型
Memcache对数据类型支持相对简单。Redis有复杂的数据类型。
(3)使用底层模型不同
它们之间底层实现方式,以及与客户端之间通信的应用协议不一样。Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
(4)value大小
redis最大可以达到1GB,而memcache只有1MB。
4、MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
redis内存数据集大小上升到一定大小的时候,就会执行数据淘汰策略。redis 提供了6种数据淘汰策略,分别如下所示:
(1)voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰;
(2)volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰;
(3)volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰;
(4)allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰;
(5)allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰;
(6)no-enviction(驱逐):禁止驱逐数据。