设为首页 加入收藏

TOP

MC&Redis&Ehcache介绍(一)
2015-11-21 01:24:58 来源: 作者: 【 】 浏览:2
Tags:MC&Redis&Ehcache 介绍

很久没有更新博客,希望以后有时间还是持续去写,现在才发现这是很棒的过程。很早之前就整理过有关缓存的使用和介绍,现在将它贴出来,也作为个人笔记:

?

Memecached

介绍

?

许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。这时就该memcached大显身手了。memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

存储方式

为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

?

MC & Spring

Spring配置:

  
                                    
                     
                                 
                     
                     
           
                                   
           

Redis

介绍

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis 是一个高性能的key-value数据库。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。[1]

Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

存储方式

redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。save seconds updates,save配置,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。appendonly yes/no ,appendonly配置,指出是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在于内存中。appendfsync no/always/everysec ,appendfsync配置,no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次。

?

Redis更多的是作为Memched的一种替换而存在。

?

一致性哈希(Consistent Hash)(服务器集群)

用key值和client代表值的hash值之间的某种运算来确定 存储的server。

为了解决负载均衡,当server节点太少就要构造虚拟的server节点。

解决了简单hash的以下弱点:

1)增删市点时,更新效率低。当系统中存储节点数量发生增加或减少时,映射公式将发生变化为hash(object)%(N±1),这将使得所有obiect的映射位置发生变化,整个系统数据对象的映射位置都需要重新进行计算,系统无法对外界访问进行正常响应,将导致系统处于崩溃状态。

  2)平衡性差,未考虑节点性能差异。由于硬件性能的提升,新添加的节点具有更好的承载能力,如何对算法进行改进,使节点性能可以得到较好利用。

  3)单调性不足。衡量数据分布技术的一项重要指标是单调性,单调性是指如果已经有一些内容通过哈希计算分派到了相应的缓冲中,当又有新的缓冲加入到系统中时,哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。

?

Redis & Spring

  
      
                
                
                
                
      
      
               
                 
               
      
      
                
                
                
      
      
                
                
                
      
     
      
                
                         
                                  
                                  
                         
                
      

Java实现

?

public class RedisTemplateRouter  {
         privatestatic finalLogger logger = LoggerFactory.getLogger(RedisTemplateRouter.class);
         privatestatic CRC32 crc32 = newCRC32();
         /**
          * 服务数量
          */
         privatestatic intSERVER_COUNT = 1;
         privatestatic List
  
   redisTemplates =
newArrayList
   
    (); publicRedisTemplateRouter(List
    
      redisTemplates){ RedisTemplateRouter.redisTemplates= redisTemplates; SERVER_COUNT= redisTemplates.size(); } publicstatic List
     
      getRedisTemplates() { returnredisTemplates; } publicstatic StringRedisTemplategetRouteRedis(String key) { crc32.reset(); crc32.update(key.getBytes()); longcrc32Value = crc32.getValue(); intindex = Math.abs((int) (crc32Value% SERVER_COUNT)); logger.debug("route to redis [key:{},index:{},crc32:{}]",new Object[] {key, index, crc32Value}); returnredisTemplates.get(index); } }
     
    
   
  


?

用法:

?

RedisTemplate template= RedisTemplateRouter.getRouteRedis(key);
Object result = template.opsForValue().get(key);

?


Ehcache

是一个纯Java的进程内缓存框架;缓存在内存和磁盘存储可以伸缩到

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇查看Oracle的实例 下一篇Redis相关的小工具:redis-load、..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: