设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客

关于Redis的常识

2013-7-31 11:34| 发布者: joejoe0332| 查看: 33859| 评论: 0|原作者: Calvin Xiao|来自: 伯乐在线

摘要:   版本:V3.0.2 2013-7-13 (江南白衣版权所有,转载请保留出处) 1. Overview 1.1 资料 The Little Redis Book ,最好的入门小册子,可以先于一切文档之前看,免费。作者Antirez的博客,Antirez维护的Redis推特。Re ...

7. Java Driver

7.1 Driver选择

各个Driver好像只有Jedis比较活跃,但也5个月没提交了,也是Java里唯一的Redis官方推荐。

Spring Data Redis的 封装并不太必要,因为Jedis已足够简单,没有像Spring Data MongoDB对MongoDB java driver的封装那样大幅简化代码,顶多就是加强了一点点点pipeline和transaction状态下的coding,禁止了一些此状态下不能用 的命令。而所谓屏蔽各种底层driver的差异并不太吸引人,因为我就没打算选其他几种driver。有兴趣的可以翻翻它的JedisConnection代码

所以,SpringSide直接在Jedis的基础上,按Spring的风格封装了一个JedisTemplate,负责从池中获取与归还Jedis实例,处理异常。

7.2 Jedis的细节

Jedis基于Apache Commons Pool做的连接池,默认MaxActive最大连接数只有8,必须重新设置。而且MaxIdle也要相应增大,否则所有新建的连接用完即弃,然后会不停的重新连接。

另外Jedis设定了每30秒对所有连接执行一次ping,以发现失效的连接,这样每30秒会有一个拿不到连接的高峰。但效果如何需要独立分析。比 如系统高峰之后可能有一长段时间很闲,而且Redis Server那边做了Timeout控制会把连接断掉,这时候做idle checking是有意义的,但30秒一次也太过频繁了。否则关掉它更好。

Jedis的blocking pop函数,应用执行ExecutorService.shutdownNow()中断线程时并不能把它中断,见讨论组。两个解决方法:

  • 不要用不限时的blocking popup,传多一个超时时间参数,如5秒。
  • 找地方将调用blocking popup的jedis保存起来,shutdown时主动调用它的close。

7.3 Redis对Client端连接的处理

  • Redis默认最大连接数是一万。
  • Redis默认不对Client做Timeout处理,可以用timeout 项配置,但即使配了也不会非常精确。

8. Windows的版本

Windows版本方便对应用的本地开发调试,但Redis并没有提供,好在微软提供了一个依赖LibUV实现兼容的补丁,https://github.com/MSOpenTech/redis,但redis作者拒绝合并到master中,微软只好苦憋的时时人工同步。 目前的稳定版是2.6版本,支持Lua脚本。

因为github现在已经没有Download服务了,所以编译好的可执行文件藏在这里:

9. 成功案例

注:下文中的链接都是网站的架构描述文档。

Twitter新浪微博, 都属于将Redis各种数据结构用得出神入化的那种,如何发布大V如奥巴马的消息是它们最头痛的问题。

Tumblr: 11亿美刀卖给Yahoo的图片日志网站,22 台Redis server,每台运行8 – 32个实例,总共100多个Redis实例在跑。有着Redis has been completely problem free and the community is great的崇高评价。Redis在里面扮演了八爪鱼多面手的角色:

  • Dashboard的海量通知的存储。
  • Dashboard的二级索引。
  • 存储海量短链接的HBase前面的缓存。
  • Gearman Job Queue的存储。
  • 正在替换另外30台memcached。

Instagram ,曾经,Redis powers their main feed, activity feed, sessions system, and other services。但可惜目前已迁往Cassandra,说新架构只需1/4的硬件费用,是的,就是那个导致Digg CTO辞职的Canssandra。

Flickr , 依然是asynchronous task system and rudimentary queueing system。之前Task system放在mysql innodb,根本,撑不住。

The Others:

  • Pinterest,混合使用MySQL、Membase与Redis作为存储。
  • Youporn.com,100%的Redis,MySQL只用于创建新需求用到的sorted set,300K QPS的大压力。
  • 日本微信 ,Redis在前负责异步Job Queue和O(n)的数据,且作为O(n*t)数据的cache,HBase在后,负责O(n*t)数据, n是用户,t是时间。
  • StackOverflow ,2 Redis servers for distribute caching,好穷好轻量。
  • Github,任务系统Resque的存储。
  • Discourge,号称是为下一个十年打造的论坛系统, We use Redis for our job queue, rate limiting, as a cache and for transient data,刚好和我司的用法一样。

10. In SpringSide

extension modules项目封装了常用的函数与场景,showcase example的src/demo/redis目录里有各场景的benchmark测试。

10.1 Jedis Template

典型的Spring Template风格,和JdbcTemplate,HibernateTemplate一样,封装从JedisPool获取与归还Connecton的 代码,有带返回值与无返回值两种返回接口。同时,对最常用的Jedis调用,直接封装了一系列方法。

10.2 Scheduler与Master Elector

Scheduler实现了基于Redis的高并发单次定时任务分发。具体选型见Scheduler章节。

Master Elector基于redis setNx()与expire()两个api实现,与基于Zookeeper,Hazelcast实现的效果类似。

10.3 Showcase中的Demo

计有Session,Counter,Scheduler 与 Master Elector四款。

附录

附录1: 对redis.conf默认配置的修改

Master上

  • daemonize no -> yes ,启动daemonize模式,注意如果用daemon工具启动redis-server时设回false。
  • logfile stdout -> /var/log/redis/redis.log ,指定日志文件
  • 注释掉RDB的所有触发规则,在Master不保存RDB文件。
  • dir ./ -> /var/data/redis,指定持久化文件及临时文件目录.
  • maxmemory,设置为可用内存/2.
  • (可选)appendonly no->yes,打开AOF文件.
  • auto-aof-rewrite-percentage 100, 综合考虑硬盘大小,可接受重启加载延时等尽量的大,减少AOF rewrite频率.
  • auto-aof-rewrite-min-size 64mb,同上,起码设为5G.
  • client-output-buffer-limit slave 256mb 64mb 60. 考虑Traffic及Slave同步是RDB加载所需时间,正确设置避免buffer撑爆client被关掉后又要重新进行全同步。
  • 安全配置,可选。

Slave上

  • 设置RDB保存频率,因为RDB只作为Backup工具,只保留15分钟的规则,设置为15分钟保存一次就够了save 900 1。
  • (可选)slaveof 设置master地址,也可动态设定。
  • repl-timeout 60, 适当加大比如120,避免master实际还没倒掉就认为master倒了。

附录2:版本变更历史

  • 3.0.1版 2013-7-10,在微博发布后反应良好,持续修改。
  • 3.0版 2013-6-29,在公司Workshop后修订,提高wiki的可读性而不只是简单的记录知识点。 ### 附录3:其他参考资料
  • Redis的几个认识误区 by Tim yang。

酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部