这是我参加「第五届青训营 」伴学笔记创作活动的第 10 天
本文记录一下在大项目中遇到的问题,并作出现阶段的解答。暂作保留,后续回头再看,可能会发现进步多多。
记录问题如下:
- 如何使用redis提升数据库访问效率
如何使用redis提升数据库访问效率
本文写一些关于redis的知识记录。
redis的作用
redis是速度更快的nosql数据库。一般用于在mysql前充当数据缓存。
一个mysql实例可能有2000左右的qps,最多不超过万数量级。但是一个redis实例的qps可以达到数十万甚至百万。现代场景下的数据服务大多数查询访问量都很高,直接访问mysql服务可能会导致服务不可用。
redis可以解决传统数据库的访问量的瓶颈问题,提升服务的访问性能。
redis为什么比mysql更快
最大的原因是redis将数据存储在内存当中,而mysql将数据存储在磁盘当中。所以操作更快
还有原因是mysql的数据存储格式是在表中存储,底层实现是b+树,所以查找时间复杂度是logn。而redis使用k-v存储,时间复杂度是O(1)。
最后一点是因为Redis是单线程的多路复用IO,单线程避免了线程切换的开销,而多路复用IO避免了IO等待的开销,在多核处理器下提高处理器的使用效率可以对数据进行分区。
缓存击穿、缓存雪崩
缓存击穿是指如果大量访问不存在的值时,redis找不到该值的存在,会将大量请求直接打到mysql中,导致redis失效,mysql宕机。解决办法是在redis中存储空值,这样一个不存在记录只会访问一次mysql。或者使用布隆过滤器,访问前会被布隆过滤器筛选。其作用就是查看该值是否存在,如果不存在直接返回空。
缓存雪崩是指当redis中数据大量在同一时间过期时,造成大量数据直接打到mysql。解决办法是将数据过期时间随机化。