本文共 1839 字,大约阅读时间需要 6 分钟。
在上一篇文章中,对Redis的五种数据结构和它们的底层实现进行了分析,这篇文章主要结合近期应用Redis的经历,对Redis的使用场景做出分析。
在上篇文章中,简单总结了Redis有以下应用场景:
这是Redis应用最广泛的部分,用于减小数据库访问压力,提高系统并发量,逻辑也比较简单。
用户的登录session数据一般是存储在数据库或单独的session服务器上,以便用户在访问集群应用时不会受到影响,而使用Redis来作为session存储方式的好处是:
Redis提供的list可以很方便地提供push/pop操作,可以很容易实现消息队列,在以下应用场景应用较多:
Redis中的set是一个有序集合,有序集合的键是成员,而值是分值。这样既可以根据成员来访问元素,又可以根据分值来顺序访问元素结构。这样在实现排行榜功能时,向集合内插入元素就可以形成一个有序的集合,只要自定义分值来源,就可以实现排行榜功能,而不用每次进行排序。其他需要频繁排序的操作也可以使用,比如优先级队列等。
一些新闻网站/博客/微博等往往在首页需要一个时间排序的列表或时间轴,每次在生成时间轴时往往需要一个select order操作,请求时间较长且消耗性能,如果在redis中构建一个list,通过将数据不断push的方式,构建一个时序列表。
在微博系统中,个人feed流页和评论首页是通过这种方式存储的,可以显著地提升系统响应速度,并且减小数据库压力。在秒杀系统中,一般会有以下问题:
使用Redis,可以解决这些问题,有如下方式。
系统中一般会有标签、收藏等聚合操作,这类操作具有使用频率高,历史数据变动小的特性,一般我们不会给记录这类操作的不重要的字段添加索引,所以在查询时比较耗费性能,而使用Redis的set就可以解决这类问题,前几天给系统中的标签功能引入了索引,去掉了select * group by 这条查询。
上篇文章中说到了string类型可以存储字符串和浮点数,存储浮点数时可以进行自增操作,使用INCRBY可以保证原子递增,使用getset可以重置。可以用来记录访问次数,订单id等。另外,由于有过期时间,也可以实现黑名单等功能。
最近在使用Redis时,总结了一些技巧,比如可以利用Redis的主从复制特性搭建集群,像数据库分库一样将数据分实例存放,利用redis的多个库实现命名空间作用,而不是通过key或前缀。在进行查询时,因为redis访问需要网络io,可以利用hmget等方式一次获取多条数据,而不是单条单条地获取。合理设置value的大小。
本文对redis的使用场景进行了简单的总结,实际中会发现redis的使用能显著提升系统性能,应用也十分广泛,是后端开发的必备神器。参考资料:
1、《Redis应用实战》 2、 3、转载地址:http://hpefb.baihongyu.com/