换乐网redis应用分析
2016-04-22 00:28
274 查看
没听过换乐网?没错,它在我的电脑里
这个操作近似于遍历树,有一个递归查询的过程:找到“洗漱用品”等直接子类,如果这些子类不是最终类目,继续向下查询。
这个计算过程很耗资源,而且经常需要用到其计算结果,所以,放在redis里面缓存起来:
Created with Raphaël 2.1.0开始redis有缓存?返回结果结束计算结果yesno
对于缓存的更新,想到三种方案:
(1)每次修改数据库的相关数据时,顺便更新redis里面的数据。
(2)设置缓存的过期时间,这样在某些情况下可以达到自动更新缓存的效果,但不是什么情况下都可用,一般如果缓存只用作显示的话,这样做也无妨。
(3)或者设置一个更改标记,每次修改了相关数据就把更改这个标记。这个标记的管理参看下部分“key管理”
(1)使用频率很高的对象,比如当前用户,几乎每个页面都要使用到。
(2)临时对象。比如验证码。
项目中有个需求:用户可以使用短信验证码登录,验证码60s内只能发一次,一天内同一个用户最多发送20条,验证码5分钟内输入有效。
这里,要达到限制每个用户发送条数的效果,就必须记录用户发送的次数和ip地址,这种数据用一个表或文档来存显得太笨重了,而放在redis中则十分方便。
在项目中,保存对象一般使用json,应为对象是单一的,而且保存为字符串的话可以设置过期时间。
集中管理的好处就是使用方便,结果一致,当需要某个key时,直接找管理者拿就好了,不管调用多少次,得到的key的值都是一样的。总之,key统一管理是一个不错的选择。
在项目中,对于用户保存在redis中的数据,都定义一个key helper类来管理:
商品类目的redis缓存结果key管理者:
用户的redis缓存结果key管理者:
用法用途
在项目中,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; } }
相关文章推荐
- redis安装
- redis基础
- redis数据类型
- redis key规则详解
- redis 对string的操作命令
- redis 对list操作命令
- redis对set类型的操作
- redis对hash类型的操作
- redis对zset操作总结
- 分布式架构高可用架构篇_03-redis3集群的安装高可用测试
- redis
- Redis命令-有序集合-zremrangebyrank
- 链接/Redis
- Redis主从备份以及key的过期时间配置
- Windows下安装apache+php7+redis扩展
- 跟我学REDIS-REDIS(五)----常用数据类型之SortedSet
- Redis数据库安装部署
- Linux下安装Redis并添加PHP扩展
- java对redis的基本操作
- 使用 redis 减少 秒杀库存 超卖思路