写在前面,看过本文,让那些没使用过redis的也能回答上来面试官的问题,不至于陷入太尴尬的境地!因为现在好多面试官不单单只是问你,用没用过redis,而是会一直问下去,比如:你项目里面用redis做什么?里面放什么数据?什么类型?对于list类型的数据,我更改了一个如何高效率的刷新redis缓存?
带着这些疑问我们下面去讨论。希望各位大佬勇于补充。
如大家所知道的一样,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库(区别于MySQL等关系型数据库),并提供多种语言的API调用方案。
一共支持五种数据类:
string(字符串)
hash(哈希)
list(列表)
set(集合)
zset(sorted set有序集合)。
测试情况:90万个键值对(键是0到899999值是字符串“hello world”)在32位操作系统的笔记本上 用了90MB,但是使用64位的操作系统的话,相对来说占用的内存会多一点,这是因为64位的系统里指针占用了8个字节,但是64位系统也能支持更大的内存,所以运行大型的redis服务还是建议使用64位服务器。
坚持一个原则:使用数据库能解决的业务场景,就不要使用REDIS。
下面具体说下每个数据类型的使用场景,也好应付面试官的随机发问。
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了。
业界比价普遍的一种做法,即根据key获取value值为空时,锁上,从数据库中load数据后再释放锁。若其它线程获取锁失败,则等待一段时间后重试。这里要注意,分布式环境中要使用分布式锁,单机的话。用普通的锁(synchronized、Lock)就够了。
缓存在同一时间内大量键过期(失效),接着来的一大波请求瞬间都落在了数据库中导致连接异常。