没听过换乐网?没错,它在我的电脑里
用法用途
在项目中,redis主要用作缓存。而在作为缓存,意义最大的是缓存计算结果,因为有些计算是一个很耗时间和资源的过程,而计算的结果不会经常改变,这时使用redis将结果缓存起来就非常有用。
缓存计算结果
在项目中有个需求:显示一个类目下的所有商品,分类可以是最终类目,也可以不是。比如,显示“生活用品”类目下的商品,需要显示出“洗漱用品”,“餐具”,“雨伞”等等所有子类目下的商品。
这个操作近似于遍历树,有一个递归查询的过程:找到“洗漱用品”等直接子类,如果这些子类不是最终类目,继续向下查询。
这个计算过程很耗资源,而且经常需要用到其计算结果,所以,放在redis里面缓存起来:
对于缓存的更新,想到三种方案:
(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;}}