您的位置:首页 > 数据库 > Redis

换乐网redis应用分析

2016-04-22 00:28 274 查看
没听过换乐网?没错,它在我的电脑里

用法用途

在项目中,redis主要用作缓存。而在作为缓存,意义最大的是缓存计算结果,因为有些计算是一个很耗时间和资源的过程,而计算的结果不会经常改变,这时使用redis将结果缓存起来就非常有用。

缓存计算结果

在项目中有个需求:显示一个类目下的所有商品,分类可以是最终类目,也可以不是。比如,显示“生活用品”类目下的商品,需要显示出“洗漱用品”,“餐具”,“雨伞”等等所有子类目下的商品。

这个操作近似于遍历树,有一个递归查询的过程:找到“洗漱用品”等直接子类,如果这些子类不是最终类目,继续向下查询。

这个计算过程很耗资源,而且经常需要用到其计算结果,所以,放在redis里面缓存起来:

Created with Raphaël 2.1.0开始redis有缓存?返回结果结束计算结果yesno

对于缓存的更新,想到三种方案:

(1)每次修改数据库的相关数据时,顺便更新redis里面的数据。

(2)设置缓存的过期时间,这样在某些情况下可以达到自动更新缓存的效果,但不是什么情况下都可用,一般如果缓存只用作显示的话,这样做也无妨。

(3)或者设置一个更改标记,每次修改了相关数据就把更改这个标记。这个标记的管理参看下部分“key管理”

缓存对象

缓存对象一般缓存:

(1)使用频率很高的对象,比如当前用户,几乎每个页面都要使用到。

(2)临时对象。比如验证码。

项目中有个需求:用户可以使用短信验证码登录,验证码60s内只能发一次,一天内同一个用户最多发送20条,验证码5分钟内输入有效。

这里,要达到限制每个用户发送条数的效果,就必须记录用户发送的次数和ip地址,这种数据用一个表或文档来存显得太笨重了,而放在redis中则十分方便。

在项目中,保存对象一般使用json,应为对象是单一的,而且保存为字符串的话可以设置过期时间。

作为计数器

作为计数器则redis是用得很多的一个方面。比如说上面的发短信验证码的需求,可以用一个计数器来限制用户60S内只能发一条短信验证码,用另外一个计数器来限制用户验证码2分钟内有效。

key管理

根据某一条原则:key应该集中管理。

集中管理的好处就是使用方便,结果一致,当需要某个key时,直接找管理者拿就好了,不管调用多少次,得到的key的值都是一样的。总之,key统一管理是一个不错的选择。

在项目中,对于用户保存在redis中的数据,都定义一个key helper类来管理:

商品类目的redis缓存结果key管理者:

public class RedisGoodsClassEntity {

private static final String subscritionPrefix="SUBGOODSCLASS_";

/** 获得存储该类下的所有final子类的json对象的redis key
* @param classNo 类目编号
* @return redis key
*/
public static String getSubClassListKey(int classNo){
return subscritionPrefix+classNo;
}

}


用户的redis缓存结果key管理者:

package com.huanle.model.session;

public class RedisUserEntity {

private static final String subscritionPrefix="SCRT_";  //订阅信息的前缀

/** 获得用户订阅在redis的缓存的key
* @param ip
* @return 用户订阅在redis的缓存的key
*/
public static String getSubscritionKeyByIp(String ip){
ip = ip.replace(".", "_");
System.out.println(subscritionPrefix+ip);
return subscritionPrefix+ip;
}

/** 获得用户订阅在redis的缓存的key
* @param ip
* @return 用户订阅在redis的缓存的key
*/
public static String getSubscritionKeyByAccount(String account){
System.out.println(subscritionPrefix+account);
return subscritionPrefix+account;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: