谈谈个人的看法
Redis用于应用和数据库之间的一个高速缓存。一个应用的热点数据占总数据的百分之20,用有限的内存空间去存储这百分之20的数据就能提高系统的性能。
介绍一下Redis
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI
C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
为什么说它是高性能缓存呢?
- 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
- 数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
- 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
- 使用多路I/O复用模型,非阻塞IO;
- 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
Redis五种数据类型
- string 字符串(可以为整形、浮点型和字符串,统称为元素)
- hash散列值(hash的key必须是唯一的)
- list 列表(实现队列,元素不唯一,先入先出原则)
- set 集合(各不相同的元素)
- zset 有序set集合
Redis数据持久化
-
RDB持久化:将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化
-
AOF持久化:将Reids的操作日志以追加的方式写入文件
-
如何选择: 二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是选择性能更好但是实时性不强的(rdb)
使用Redis需要注意的问题
-
缓存和数据库双写一致性问题
缓存跟数据库数据暂时不一致,使用缓存就无法保证数据的强一致性,如果业务需要强一致性,那就不能用缓存。但是最终是会保持数据库跟缓存数据一致的,如果业务只需要最终一致性的话大可使用缓存。
首先,采取正确更新策略,先更新数据库,再删缓存。其次,因为可能存在删除缓存失败的问题,提供一个补偿措施即可,例如利用消息队列
-
缓存雪崩问题
缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。
a.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
b.如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
c.设置热点数据永远不过期。 -
缓存击穿问题
某一个热点 key,在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,甚至可能打垮数据库。
a.加互斥锁
b.热点数据不过期
最后
缓存是一把双刃剑,用的好提升系统性能,用的不好可能会出现各种疑难杂症。