分布式

Redis基本知识以及管理

字号+ 作者:风潇潇 来源:原创 2016-03-29 15:52 我要评论( )

公司里由个项目用到了Redis,确实还是很不错的。性能也很厉害,不过我感觉就是虽然项目在用Redis,实际上是没有掌握Redis的。这里我自己总结一下,因为进公司我就去研究了

redis介绍

Redis 是一个高性能的key-value数据库。 
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)
redis提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便
Redis是一个数据库,可以持久化到磁盘里面。

redis持久化方式

RDB方式:
优点:单一紧凑的文件,便于备份适用于容灾,传送方便,恢复快并且最大化redis性能
缺点:只能恢复到最近一次快照保存地点,如果数据量非常大的话保存工作是比较耗时的工作
 
AOF(Append-only file,AOF)方式:
优点:实时性高,可以使用不同的策略来提高实时性。如果fsync设置为1s,最多丢失1s的数据。当后台AOF 文件过大Redis会重写AOF文件。方式为写一个新的文件,然后使用新的文件代替旧的文件,过程中还会追加到旧文件去,所以就算redis挂掉也安全

Redis与memcache

Redis 数据类型丰富包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)
Redis 提供主从复制备份的功能,配置容易,Memcache不提供
Redis还提供队列功能,可以实现轻量级的队列实现
Redis于memecache最大的不同在于Redis时候一款nosql数据库,可以将数据持久化到磁盘里,便于故障恢复,数据恢复。而memcache就是一款简单的缓存服务器

Redis的使用场景:

1.取最新N个数据的操作

比如典型的取你网站的最新文章,通过下面方式,我们可以将最新的5000条评论的ID放在Redis的List集合中,并将超出集合部分从数据库获取
· 使用LPUSH latest.comments<ID>命令,向list集合中插入数据
· 插入完成后再用LTRIM latest.comments 0 5000命令使其永远只保存最近5000个ID
· 然后我们在客户端获取某一页评论时可以用下面的逻辑(伪代码)
FUNCTION get_latest_comments(start,num_items):
    id_list = redis.lrange("latest.comments",start,start+num_items-1)
    IF id_list.length < num_items
        id_list = SQL_DB("SELECT ... ORDER BY time LIMIT ...")
    END
    RETURN id_list
END
如果你还有不同的筛选维度,比如某个分类的最新N条,那么你可以再建一个按此分类的List,只存ID的话,Redis是非常高效的。

2.排行榜应用,取TOP N操作

这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。

3.需要精准设定过期时间的应用

比如你可以把上面说到的sorted set的score值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了,不仅是清除Redis中的过期数据,你完全可以把Redis里这个过期时间当成是对数据库中数据的索引,用Redis来找出哪些数据需要过期删除,然后再精准地从数据库中删除相应的记录。

4.计数器应用

Redis的命令都是原子性的,你可以轻松地利用INCR,DECR命令来构建计数器系统。

5.Uniq操作,获取某段时间所有数据排重值

这个使用Redis的set数据结构最合适了,只需要不断地将数据往set中扔就行了,set意为集合,所以会自动排重。

6.实时系统,反垃圾系统

通过上面说到的set功能,你可以知道一个终端用户是否进行了某个操作,可以找到其操作的集合并进行分析统计对比等。没有做不到,只有想不到。

7.Pub/Sub构建实时消息系统

Redis的Pub/Sub系统可以构建实时的消息系统,比如很多用Pub/Sub构建的实时聊天系统的例子。

8.构建队列系统

使用list可以构建队列系统,使用sorted set甚至可以构建有优先级的队列系统。

9.缓存

  性能优于Memcached,数据结构更多样化
    你应该已经注意到像list push和list pop这样的Redis命令能够很方便的执行队列操作了,但能做的可不止这些:比如Redis还有list pop的变体命令,能够在列表为空时阻塞队列。 现代的互联网应用大量地使用了消息队列(Messaging)。消息队列不仅被用于系统内部组件之间的通信,同时也被用于系统跟其它服务之间的交互。消息队列的使用可以增加系统的可扩展性、灵活性和用户体验。非基于消息队列的系统,其运行速度取决于系统中最慢的组件的速度(注:短板效应)。而基于消息队列可以将系统中各组件解除耦合,这样系统就不再受最慢组件的束缚,各组件可以异步运行从而得以更快的速度完成各自的工作。
    此外,当服务器处在高并发操作的时候,比如频繁地写入日志文件。可以利用消息队列实现异步处理。从而实现高性能的并发操作。



参考资料(redis应用场景):http://blog.nosqlfan.com/html/2235.html
redis官网:http://www.redis.io/
redis中文网:http://www.redis.cn/


转载请注明出处。

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Redis内存优化

    Redis内存优化

    2016-04-29 09:38

  • redis使用sentinel高可用配置

    redis使用sentinel高可用配置

    2016-03-31 21:39

  • redis主从复制+keepalived的高可用配置

    redis主从复制+keepalived的高可用配置

    2016-01-03 11:16

网友点评
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)