redis丰富的数据结构,其hash,list,set以及功能丰富的String的支持,对于实际项目中的使用有很大的帮忙。同时.redis单点的性能也非常高效,所以很多的项目都会选择redis来做为缓存应用。
1.redis缓存原理
Redis将其数据完全保存在内存中,仅使用磁盘进行持久化。与其它键值数据存储相比,Redis有一组相对丰富的数据类型。Redis可以将数据复制到任意数量的从机中。异常快 - Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET)操作。支持丰富的数据类型 - Redis支持开发人员常用的大多数数据类型 ,例如列表,集合,排序集和散列等等。这使得Redis很容易被用来解决各种问题,因为我们知道哪些问题可以更好使用地哪些数据类型来处理解决。操作具有原子性 - 所有Redis操作都是原子操作,这确保如果两个客户端并发访问,Redis服务器能接收更新的值。Redis是一个内存数据库,但在磁盘数据库上是持久的,因此它代表了一个不同的权衡,在这种情况下,在不能大于存储器(内存)的数据集的限制下实现非常高的写和读速度redis支持多种数据结构,Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储Redis支持master-slave(主-从)模式应用;Redis单个value的限制是1GB,memcached只能保存1MB的数据。
2.redis缓存实现
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,即生存时间,按照生存时间设置一个对象的生命周期,一个对象生命周期结束之后将其销毁。
以上就是对于redis缓存的介绍,我们要想学会使用redis缓存还是需要大量的实战项目练习,经过不断的积累才能更加熟练。