摘要: 转自timyang:http://timyang.net/data/redis-misunderstanding/前几天微博发生了一起大的系统故障,很多技术的朋友都比较关心,其中的原因不会超出James Hamilton在On Designing and Deploying Internet-Scale Service(1)概括的那几个范围,James第一条经验“Design for failure”是所有互联网架构成功的一个关键。互联网系统的工程理论其实非常简单,James paper中内容几乎称不上理论,而是多条实践经验分享,每个公司对这些经验的理解及执行力决定了架构成败。题外话说完,最近 阅读全文
posted @ 2011-02-15 22:45 redcreen 阅读(4088) 评论(3) 推荐(0) 编辑
摘要: 1.简介 redis是一个开源的key-value数据库。它又经常被认为是一个数据结构服务器。因为它的value不仅包括基本的string类型还有 list,set ,sorted set和hash类型。当然这些类型的元素也都是string类型。也就是说list,set这些集合类型也只能包含string 类型。你可以在这些类型上做很多原子性的操作。比如对一个字符value追加字符串(APPEND命令)。加加或者减减一个数字字符串(INCR命令,当 然是按整数处理的).可以对list类型进行push,或者pop元素操作(可以模拟栈和队列)。对于set类型可以进行一些集合相关操作 (interse 阅读全文
posted @ 2011-02-15 20:18 redcreen 阅读(39088) 评论(2) 推荐(2) 编辑
摘要: 发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似。pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者在物理部署上的耦合。redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的消息时。订阅该消息类型的全部client都会收到此消息。这里. 阅读全文
posted @ 2011-02-15 20:17 redcreen 阅读(18150) 评论(2) 推荐(1) 编辑
摘要: 首先说明下redis的虚拟内存与os的虚拟内存不是一码事,但是思路和目的都是相同的。就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的 内存空间用于其他需要访问的数据。尤其是对于redis这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个redis server外。另外的能够提高数据库容量的办法就是使用vm把那些不经常访问的数据交换的磁盘上。如果我们的存储的数据总是有少部分数据被经常访问,大 部分数据很少被访问,对于网站来说确实总是只有少量用户经常活跃。当少量数据被经常访问时,使用vm不但能提高单台redis server数据库的容量,而且也不会对性能造成太多影响。 re. 阅读全文
posted @ 2011-02-15 20:17 redcreen 阅读(8329) 评论(3) 推荐(2) 编辑
摘要: redis主从复制配置和使用都非常简单。通过主从复制可以允许多个slave server拥有和master server相同的数据库副本。下面是关于redis主从复制的一些特点1.master可以有多个slave2.除了多个slave连到相同的master外,slave也可以连接其他slave形成图状结构3.主从复制不会阻塞master。也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理client发来的请求。相反slave在初次同步数据时则会阻塞不能处理client的请求。4.主从复制可以用来提高系统的可伸缩性,我们可以用多个slave 专门用于cli. 阅读全文
posted @ 2011-02-15 20:16 redcreen 阅读(10215) 评论(2) 推荐(1) 编辑
摘要: redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式。下面分别介绍Snapshotting 快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久 化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置save 900 1 #900秒内如果超过1个key被修改,则. 阅读全文
posted @ 2011-02-15 20:16 redcreen 阅读(17871) 评论(2) 推荐(0) 编辑
摘要: redis是一个cs模式的tcp server,使用和http类似的请求响应协议。一个client可以通过一个socket连接发起多个请求命令。每个请求命令发出后client通常 会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client。基本的通信过程如下 Client: INCR XServer: 1Client: INCR XServer: 2Client: INCR XServer: 3Client: INCR XServer: 4基 本上四个命令需要8个tcp报文才能完成。由于通信会有网络延迟,假如从client和server之间的包传输时间需 阅读全文
posted @ 2011-02-15 20:15 redcreen 阅读(13046) 评论(0) 推荐(0) 编辑
摘要: redis对事务的支持目前还比较简单。redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。 由于redis是单线程来处理所有client的请求的所以做到这点是很容易的。一般情况下redis在接受到一个client发来的命令后会立即处理并 返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一 个队列中。当从此连接受到exec命令后,redis会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给client.然后此连接就 结束事务上下文。 阅读全文
posted @ 2011-02-15 20:12 redcreen 阅读(58423) 评论(2) 推荐(6) 编辑
摘要: 本文介绍下redis支持的各种数据类型包括string,list ,set ,sorted set 和hash Technorati 标签: redis cache list 存储 1. keysredis本质上一个key-value db,所以我们首先来看看他的key.首先key也是字符串类型,但是key中不能包括边界字符由于key不是binary safe的字符串,所以像"my key"和"mykey\n"这样包含空格和换行的key是不允许的顺便说一下在redis内部并不限制使用binary字符,这是redis协议限制的。"\r\n&quo 阅读全文
posted @ 2011-02-15 17:09 redcreen 阅读(36701) 评论(2) 推荐(3) 编辑
摘要: Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。 序列化的必要性 Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。 这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而产生。 如何序列化一个对象 一个对象 阅读全文
posted @ 2011-02-15 15:56 redcreen 阅读(29144) 评论(4) 推荐(10) 编辑
摘要: 今天在内部邮件群里看到了一封关于ReferenceQuene的讨论,之前对这个东东也有一定的了解,趁此机会总结一下,以供后人参阅. 先把问题说清楚: WeakHashMap是主要通过expungeStaleEntries这个函数的来实现移除其内部不用的条目从而达到的自动释放内存的目的的.基本上只要对WeakHashMap的内容进行访问就会调用这个函数,从而达到清除其内部不在为外部引用的条目。但是如果预先生成了WeakHashMap,而在GC以前又不曾访问该WeakHashMap,那不是就不能释放内存了吗? 对应的两个测试案例: WeakHashMapTest1:public class Wea 阅读全文
posted @ 2011-02-15 15:42 redcreen 阅读(3777) 评论(0) 推荐(0) 编辑
摘要: Java世界泰山北斗级大作《Thinking In Java》切入Java就提出“Everything is Object”。在Java这个充满Object的世界中,reference是一切谜题的根源,所有的故事都是从这里开始的。 Reference是什么? 如果你和我一样在进入Java世界之前曾经浪迹于C/C++世界,就一定不会对指针陌生。谈到指针,往日种种不堪回首的经历一下子涌上心头,这里不... 阅读全文
posted @ 2011-02-15 15:28 redcreen 阅读(1550) 评论(2) 推荐(3) 编辑
摘要: Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference (传说中的幽灵引用).这 4 种类型的引用与 GC 有着密切的关系, 让我们逐一来看它们的定义和使用场景 :1. Strong Reference StrongReference 是 Java 的默认引用实现, 它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收2.WeakReferenceWeakReference, 顾名思义, 是一个弱引用, 当所引用的对象在 JVM 内不再有强引. 阅读全文
posted @ 2011-02-15 15:27 redcreen 阅读(4589) 评论(0) 推荐(0) 编辑
摘要: vevocity在做渲染时会调用 org.apache.velocity.util.introspection.ClassMap$MethodCache.get方法 该方法完整代码(velocity1.6.1版本)如下 private final Map cache = new HashMap();public Method get(final String name, final Object [] params) throws MethodMap.AmbiguousException { String methodKey = makeMethodKey(name, params); Obj 阅读全文
posted @ 2011-02-15 15:22 redcreen 阅读(382) 评论(0) 推荐(0) 编辑
摘要: 案例一: 简要描述: 生产服务器/home目录磁盘空间100%,导致解压缩异常,进而导致网站频道不能访问. 服务环境描述: 本地发布服务器 数据中转机 预发布服务器 生产服务器 发布流程描述: 在本地发布服务器上编译打包-->传输到数据中转机-->拉取数据包到预发布机-->预发布测试通过-->发布到生产服务器 场景回放: 预发布测试通过后,通过发布脚本发布服务后,F5报警,应用服务没有报警,频道首页无法打开. 发现生产服务器的频道首页index.html 为空白,monitor文件空白. 原因分析: 生产服务器/home目录空间100%,tar解压失败,脚本继续执行(b 阅读全文
posted @ 2011-02-15 15:17 redcreen 阅读(331) 评论(0) 推荐(0) 编辑
摘要: Apache rewrite配置如下: RewriteEngine OnRewriteLogLevel 1RewriteRule ^/(\d+)/(.+)$ /$2\?t=$1正常的访问:www.domain.com/1234/js/girl.jpg 错误的访问:www.domain.com/1234/lib/girl.jpg 错误日志:File does not exist: /lib/正常情况下找不到文件的错误日志应该是(访问www.domain.com/abcd):File does not exist: /home/admin/web-deploy/htdocs/abcd注意:只有根目 阅读全文
posted @ 2011-02-15 15:17 redcreen 阅读(476) 评论(0) 推荐(0) 编辑
摘要: 使用memcache缓存数据,减少对数据库的直接访问,提高网站性能已经成了各大网站最基本的技术.如何更好的提高memcache缓存的利用率及命中次数会在后面的blog中单独介绍,本文主要探讨为何及如何使用本地缓存(java localcache)提高网站性能.localcache与memcache性能比较先来个本地缓存与memcache缓存的性能比较,有个直观上的概念Cache请求方式次数时间平均Localcachehashmap中get请求1亿1344ms0.00001344msMemcache简单的get请求,不做序列化1万4437ms0.4437msDb单表查询(有索引)1-2ms以上测 阅读全文
posted @ 2011-02-15 15:16 redcreen 阅读(7247) 评论(0) 推荐(3) 编辑
摘要: 在了解WeakReference之前,先给出一段简单的代码: public class WeakReferenceTest {public static void main(String[] args) throws Exception {Object o = new Object();// 默认的构造函数,会使用ReferenceQueue.NULL 作为queueWeakReference<Object> wr = new WeakReference<Object>(o);System.out.println(wr.get() == null);o = null;S 阅读全文
posted @ 2011-02-15 15:03 redcreen 阅读(987) 评论(0) 推荐(0) 编辑
摘要: 本篇文章介绍下redis排序命令.redis支持对list,set和sorted set元素的排序。排序命令是sort 完整的命令格式如下: SORT key [BY pattern] [LIMIT start count] [GET pattern] [ASC|DESC] [ALPHA] [STORE dstkey] 下面我们一一说明各种命令选项 (1)sort key 这个是最简单的情况,没有任何选项就是简单的对集合自身元素排序并返回排序结果.下面给个例子 redis> lpush ml 12(integer) 1redis> lpush ml 11(integer) 2red 阅读全文
posted @ 2011-02-15 15:02 redcreen 阅读(43501) 评论(1) 推荐(1) 编辑