前言
这两天项目用到redis,而我自己也正准备看这个,所以就从头开始学习了一遍。
既然要用,说明已经对redis是干什么的,特点是什么,对项目有什么好处,需要缓存什么东西等问题都了解过了,所以我们直接开搞:
怎么获取redis
安装redis,linux下wget到github的源码,然后直接make就行了,比较简单。
我是在windows下用的,所以来说下:到从redis官网连接过去的redisServer下载redis-2.8.19.zip,解压之后运行redis-server.exe即可,然后打开redis-cli.exe就可以使用了。一般这个只是用来测试连接和查看monitor用的。
java端如何使用redis
在java项目中,redis提供了很多客户端库,我用的jedis,它封装了对redis数据库的所有操作。
一般web应用中,我们还会用到spring,方便的地方在于spring本身也提供了对redis的支持--spring-data-redis,可以到官网查看文档,并有实例。
具体步骤:
1.引入pom依赖(如果没用maven的话,自行引入jar包吧)
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.5.0.RELEASE</version>
</dependency>
</dependencies>
同时将jedis也依赖上,因为spring-data-redis底层就是用的jedis:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.6.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
2.在容器中配置RedisTemplate实例
<bean id="jedisConnFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:use-pool="true"/>
<!-- redis template definition -->
<bean id="redisTemplate"
class="org.springframework.data.redis.core.RedisTemplate"
p:connection-factory-ref="jedisConnFactory"/>
注意:这是官网直接复制过来的,我这样直接放在xml中,会报错,即使是引入p的命名空间。然后我就尝试将p属性写成property后,就没有报错了,但是在后面用的时候会key和value会出现类似"\xac\xed\x00\x05t\x00\tb "这样的情况,查询得知这是因为spring-data-redis需要将数据存储到jedis中,这中间需要序列化,再由jedis存储到数据库,问题就出在序列化上了,它会将key和value的类型信息也序列化后带上,这显然不是我们想要的结果。
所以RedisTemplate提供了对key和value序列化类,于是我打算这样:
<bean id="redisTemplate"
class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnFactory"/>
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="hashKeySerializer">
<bean class="org.springframework.data.redis.serializer.GenericToStringSerializer"/>
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.GenericToStringSerializer"/>
</property>
<property name="hashValueSerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
</bean>
可是中间两个序列化类还是报错,没有无参构造器,所以就准备采用构造器注入的方式,但是要求注入的参数是一个Object.class类型,我也不知道怎么注入这种类型的,搞来搞去还是干脆就不要xml了,直接写配置类:
@Configuration
public class RedisConfig {
@Bean
JedisConnectionFactory jedisConnectionFactory() {
return new JedisConnectionFactory();
}
@Bean
RedisTemplate<String, Object> redisTemplate() {
final RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new GenericToStringSerializer<>(Object.class));
template.setValueSerializer(new GenericToStringSerializer<>(Object.class));
return template;
}
}
这下可算可以了(当然要注意扫描包)。
有了RedisTemplate之后,就可以写具体的实现业务类了,RedisTemplate基本支持所有redis操作,比如:
@Component
public class SpringRedisClientImpl implements SpringRedisClient {
@Autowired
private RedisTemplate<String, Object> template;
@Autowired
private JedisConnectionFactory jedisConnectionFactory;
@Override
public void setKey(String key, String value) {
template.opsForValue().set(key, value);
}
@Override
public Object getKey(String key) {
return template.opsForValue().get(key);
}
@Override
public void incr(String key) {
template.opsForValue().increment(key, 1);
}
@Override
public void lPush(String key, String value) {
template.opsForList().leftPush(key, value);
}
@Override
public boolean checkKey(String key) {
return template.hasKey(key);
}
@Override
public Object lIndex(String key) {
return template.opsForList().index(key, 0);
}
@Override
public Long llength(String key) {
return template.opsForList().size(key);
}
@Override
public String lpop(String key) {
return (String) template.opsForList().leftPop(key);
}
@Override
public Set<String> getKeys(String pattern) {
return template.keys(pattern);
}
@Override
public void flushAll() {
Jedis jedis = jedisConnectionFactory.getShardInfo().createResource();
jedis.flushAll();
jedis.close();
}
}
如果对redis比较熟悉的,可以自行配置redis.windows.conf文件。其实我也不太熟悉conf文件里面的配置,尤其是持久化到磁盘那个。所以在我的项目里,我是将数据以每天为单位保存到mysql中,并清空redis。
推荐
要使用RedisTemplate相应方法的时候,应该要对其的作用非常熟悉,这里推荐一个redis命令参考。