前面已经搭建好了大概的项目结构,现在开始写一些必要的工具类,今天先讲讲我所用到的redis应用。redis在一些项目中有很多种应用方式,我今天就讲讲spring的StringRedisTemplate。在这个项目中redis用到的功能就是缓存下微信的一些信息。所以可以看做是当map集合来用差不多。
下面就开始介绍下StringRedisTemplate的API:
stringRedisTemplate.opsForValue().set("test", "100",60*10,TimeUnit.SECONDS);//向redis里存入数据和设置缓存时间
stringRedisTemplate.boundValueOps("test").increment(-1);//val做-1操作
stringRedisTemplate.opsForValue().get("test")//根据key获取缓存中的val
stringRedisTemplate.boundValueOps("test").increment(1);//val +1
stringRedisTemplate.getExpire("test")//根据key获取过期时间
stringRedisTemplate.getExpire("test",TimeUnit.SECONDS)//根据key获取过期时间并换算成指定单位
stringRedisTemplate.delete("test");//根据key删除缓存
stringRedisTemplate.hasKey("546545");//检查key是否存在,返回boolean值
stringRedisTemplate.opsForSet().add("red_123", "1","2","3");//向指定key中存放set集合
stringRedisTemplate.expire("red_123",1000 , TimeUnit.MILLISECONDS);//设置过期时间
stringRedisTemplate.opsForSet().isMember("red_123", "1")//根据key查看集合中是否存在指定数据
stringRedisTemplate.opsForSet().members("red_123");//根据key获取set集合
再讲下spring的redis配置:
<!-- redis配置 -->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxTotal" value="${redis.maxTotal}" />
<property name="maxWaitMillis" value="${redis.maxWait}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.host}" />
<property name="port" value="${redis.port}" />
<!-- <property name="password" value="${redis.pass}" /> -->
<property name="poolConfig" ref="poolConfig" />
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="enableTransactionSupport" value="false"/>
<property name="connectionFactory" ref="connectionFactory" />
</bean>
<bean id="redisUtil" class="com.supcon.mo.util.RedisUtil">
<property name="redisTemplate" ref="redisTemplate" />
</bean>
这个在上一章搭建后端架构的时候就讲过,这里再声明一下,org.springframework.data.redis.core.StringRedisTemplate是spring的自带的redis模板。
bean id=”redisUtil”将这个模板传入com.supcon.mo.util.RedisUtil这个类。不过这些都要在spring启动的时候才能用。
下面来讲一个工具类的方法案例:
public static RedisTemplate<String, Object> redisTemplate;
public static void setStringByTime(String key,Object obj, Long timeout, TimeUnit unit) {
if (obj == null) {
return;
}
if (timeout != null) {
redisTemplate.opsForValue().set(key, obj, timeout, unit);
} else {
redisTemplate.opsForValue().set(key, obj);
}
}
public RedisTemplate<String, Object> getRedisTemplate() {
return redisTemplate;
}
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
这里注意一下,很多人都会犯的一个小错误,IOC对象注入元素的时候必须要在bean中写set,get方法。
我这里写的是一个存入redis的键值对,设定一定时间的有效期。
timeout写数字,unit写单位。如TimeUnit.SECONDS代表秒。
当然这样是无法写main方法测试的,需要用junit来测试。首先要导入
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-servlet-config.xml"})
这两个注释,能够调用的IOC容器。
然后在写的方法前加@test来测试,如:
@test
public void say(){
....一大堆测试代码,当main方法来写。
}
因为这个工具类在spring的配置文件中注册了,所以再其他类中调用的时候只要采用@Autowired标签注入就好了。
当然这里还有一个疑问,如果是要在其他静态工具类中引用怎么办?
下面我讲下解决办法:
方法一:
@Autowired<br>//注意这里非静态
private RedisUtil redisUtil;
private static LogUtil logUtil;
@PostConstruct //@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行
public void init() {
logUtil = this;
logUtil.redisUtil = this.redisUtil;
}
public AdminLogService getUserService() {
return logService;
}
public void setUserService(rRdisUtil redisUtil) {
this.redisUtil= redisUtil;
}
下面调用的时候直接用logUtil.redisUtil.方法来调用。
方法二:
去掉redisTemplate的注入。直接导入静态模板。
public static RedisTemplate<String, Object> redisTemplate;
综上都是个人项目对redis的应用,没有研究太深。比如一些redis的原理啊,优点啊。我虽然看过,也清楚一些,但感觉讲的不够专业就不讲了,免得误导各位。
一起加油!!!
有什么不足之处,或者错误的欢迎指点,本人每天保持工作日早上更新。