为什么redis可以做缓存
(1)问题分析
这个题目考得是你对redis的理解,他能做缓存的原因是什么,回答时主要回答redis的优点。
(2)核心问题讲解
1)Redis将其数据完全保存在内存中,仅使用磁盘进行持久化。与其它键值数据存储相比,Redis有一组相对丰富的数据类型。Redis可以将数据复制到任意数量的从机中。
2)异常快 - Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET)操作。支持丰富的数据类型 - Redis支持开发人员常用的大多数数据类型 ,例如列表,集合,排序集和散列等等。这使得Redis很容易被用来解决各种问题,因为我们知道哪些问题可以更好使用地哪些数据类型来处理解决。
3)操作具有原子性 - 所有Redis操作都是原子操作,这确保如果两个客户端并发访问,Redis服务器能接收更新的值。
4)Redis是一个内存数据库,但在磁盘数据库上是持久的,因此它代表了一个不同的权衡,在这种情况下,在不能大于存储器(内存)的数据集的限制下实现非常高的写和读速度
5)redis支持多种数据结构,Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储
6)Redis支持master-slave(主-从)模式应用
7)Redis单个value的最大限制是1GB,memcached只能保存1MB的数据。
(3)问题拓展
1)Redis和memcached的比较
Redis的优势是
Redis支持的数据类型比memcached丰富,memcached只有一种(字符串)
Redis可以持久化数据
redis中能存储的数据量大
2)redis提供了三种缓存数据淘汰机制,LFU,LRU,TTL
LFU,least frequently used,即最小使用频率淘汰,每个对象使用共计24bit空间用来实施这个算法,24bit分成2个部分,前16bit用来记录上次减少时间(减少的是后面8bit计数器),后面8个bit是一个对数计数器,用来记录这个对象的访问次数。需要注意的是,这个字段不是一直增加的,也需要减少,否则会出现一个情况,一个对象很久之前被频繁的使用,但是最近没有被使用,若这个值不减少的话,那么这个对象会一直处在一个不会被淘汰的位置。前面16bit的作用就是,记录一个“减量时间”,这是一个降低精度的Unix时间,将16bit的时间转换成分钟,不关心回绕问题。若这个时间很大,那么8bit计数器的值减半,否则只是简单的每次递减1
LRU,last recently used,即最近最少使用淘汰,一般做法是,将hash表的value做成一个指针,指向一个双链表节点,节点中保存实际的value,双链表按照上次访问时间降序排列,当访问到一个对象之后,更新访问时间,并将这个节点移动到表头,若节点不存在就直接插入到表头。当内存门限达到的时候,从链表尾开始删除若干entry。redis为了减少内存使用,不使用双链表或其他结构管理对象,采用随机算法,每次从hash表中随机选择一些key,一般是5个,将这些key存入一个全局的池,池大小一般是16,池中entry按照上次访问时间降序排列,每次从池中选择尾部的entry,就是最差的对象,将这个对象淘汰
TTL,即生存时间,按照生存时间设置一个对象的生命周期,一个对象生命周期结束之后将其销毁
(4)在项目中的使用
我们在广告数据、solr中搜索的品牌、规格数据以及购物车里面都是用过redis,结合spring来使用,springDataRedis