这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
Redis的两个优势
高性能
假设下如果所有的数据都从数据库中读取,特别是是一些复杂的数据,每次都查询mysql性能必定非常差。所以对于一些复杂操作耗时查出来的结果且确定后面不怎么变化的数据放到缓存,能大幅提高系统响应。
高并发
mysql单机一般只能支撑到2000Qps,而redis由于是K/V式的操作,单机可以支撑并发量几万到十几万。
Redis支持的数据结构
String字符串
String是redis最基本的类型,一个key对应一个value。String类型是二进制安全的,可以包含任何数据,比如图片和序列化对象。Value值最大能存储512M数据
Hash 哈希
hash 是一个键值对的集合,是一个string 类型的field 和value的映射表,特别适合存储对象。
List 有序列表
List列表是简单的字符串列表,按照插入顺序排序,可以添加元素到列表的头部或者尾部。适合做粉丝列表、评论列表之类的。List就是链表,我们可以实现最新消息排行。
Set 无序集合
Redis set是string类型的无序集合,集合是通过hashtable实现的,基本功能和list差不多,最大的区别在于去重,Set可以自动去重,可以知道一个元素是否存在,适合的场景好友的共同爱好。
Zset 有序集合
Redis zset 也是string类型的集合,且不允许有重复。Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序
Redis速度
Redis可以达到100000+的QPS(Query Per Second,每秒查询次数),但它却是单进程单线程的模型。因为Redis完全是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章的采用单线程的方案了。
Redis速度快的原因
Redis完全基于内存,绝大部分请求是纯粹的内存操作,非常迅速,数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度是O(1)。 数据结构简单,对数据操作也简单。 采用单线程,避免了不必要的上下文切换和竞争条件,不存在多线程导致的CPU切换,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有死锁问题导致的性能消耗。 使用多路复用IO模型,非阻塞IO。Redis监听多个socket,可以一次性接受多个客户端请求,然后放到队列中,待命令完整发到服务端再去处理请求,不需要等待客户端的传输。