Permalink
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
84 lines (43 sloc) 4.59 KB

优雅的使用Redis(一)——适用场景和量化分析

一、适用场景

Redis作为远程数据服务,Redis提供了丰富的数据结构,并且操作方便,现在互联网中应用非常广泛。我所在的公司也是Redis的深度用户,我们线上的90%的业务都使用到了Redis。那么我们都用Redis来做什么呢?主要有以下几个方面:

缓存。

由于Redis的TTL支持,可以对Redis设置过期,而且访问速度快的特点,所以非常适合做全局缓存。和我们熟悉memcached相比,Redis中的数据是可以持久化的,不会因为断电导致数据丢失。

数据过滤。

Redis中提供的HyperLogLog数据结构非常适合数据去重和UV统计。

数据统计。

Redis是单进程的,并且提供的inc之类的操作,单个命令来说是顺序原子的,没有并发问题,对于多维度的PV、DAU、DNU等等统计,使用Redis来实现非常简单,不需要考虑并发对数据的影响,Redis提供了很好保证。

数据的发布订阅。

对于频繁访问的数据,有时需要做多级缓存,Redis做全局缓存(或者二级缓存),那么如何更新LocalCache呢?当然我们给LocalCache做过期后做全量更新,但是当后台对数据修改后,我们需要使用一种优雅的方式通知各个Server节点,更新localCache中的数据。Redis提供的Pub/Sub非常适合,将这用于内容运营系统(内容投放和广告)中非常适合。

二、量化分析

Redis虽然命令很多人都知道,解决问题的方案也不只是一种,所以不同的人用出来的效果是千差万别的。对于一个有追求的程序员来说,这是值得的,自己写的程序占用内存少,而且速度快,何乐而不为呢!

因为我们是一家“小”的创业公司,不可能像土豪公司那样堆内存、堆SSD和机器。内存这种“昂贵”的资源我们必须要省着用,不能铺张浪费。所以我们在使用的时候必须做的一件事情就是量化分析。开发人员在开发之前根据业务选择合适的数据结构,然后实现一个Demo出来,然后通过rdbtool对Redis的dump文件进行分析,得到数据实际存储在Redis中占用的内存信息,开发者根据这些信息,需要做出一个随着业务增长的内存的报表,然后提交评审,如果内存使用的不合理会被打回来,重新设计。

接下来详细的介绍一下如何去做量化分析

量化

使用redis-rdb-tool这个工具分析Redis数据存储key、数据结构实际占用内存详细情况。可以找出占用内存多的key,对key的设计做优化,同时还可以找出已经过期的Key,释放内存。

第一步:安装

安装rdbtools可以参考install rdbtools。也可以参考如下操作。

安装前准备: 1.安装Python2.x和pip。因为该工具是python写的。 2.redis-py是可选项,只是用来运行测试用例的。

安装

	pip install rdbtools

源码安装步骤如下:

	git clone https://github.com/sripathikrishnan/redis-rdb-tools
	cd redis-rdb-tools
	sudo python setup.py install 		

第二步:生成内存使用报表

安装完了,接下来就是要讲redis的dump文件生成内存使用情况报表了。 执行命令:

	rdb -c memory dump.rdb > dump.csv

说明:dump.rdb 是redis的dump下来的rdb;csv文件是rdbtools生成的内存使用情况报表。 rdbtools分析完会声称dump.csv文件;如果rdb文件比较大,这个步骤可能会比较慢。 生成的csv文件包含了所有的key,编码,数据结构类型,占用内存、最大元素长度等信息。

分析

根据内存使用详细情况,结合业务增加点,计算在不同的业务量级时占用内存情况。 比如,我们在做的卡片订阅功能量化分析,内存会随着用户数量增长而增长,单个用户的卡片订阅信息存储为184byte。那么量化分析的报告如下

type 及说明 单个用户占用内存 100W用户 300w 500w 1kw 3kw 5kw
hash 失效期半年 184byte 184M 552M 920M 1.8G 5.4G 9G

至此,得到Redis中数据存储的量化分析数据报表。 根据量化过程csv文件中信息,可以检查key是否设计合理,key长必然占用内存也就多,数据上hash比string节省key的内存。我们可以根据这些信息选择合适的数据结构。