前言:
项目中用到了redis,代码是别人写的,但是感觉redis很强大,技多不压身所以学习了一下,下面展示一下:
正文:
搭建:两台虚拟机三主三从,安装过程还算是曲折,以后写博客吧
使用:
jar包:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
redis也算是独立出来的一个服务,建立接口JedisClient还有实现单机版的类JedisClientSingle,实现增删改
public class JedisClientSingle implements JedisClient {
@Autowired
private JedisPool jedisPool;
@Override
public String set(String key, String value) {
Jedis jedis = jedisPool.getResource();
String result = jedis.set(key,value);
jedis.close();
return result;
}
@Override
public String get(String key) {
Jedis jedis = jedisPool.getResource();
String result = jedis.get(key);
jedis.close();
return result;
}
@Override
public Long hset(String key, String item, String value) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hset(key,item,value);
jedis.close();
return result;
}
@Override
public String hget(String key, String item) {
Jedis jedis = jedisPool.getResource();
String result = jedis.hget(key,item);
jedis.close();
return result;
}
//incr递增1并返回递增后的结果
@Override
public Long incr(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.incr(key);
jedis.close();
return result;
}
//decr递减1并返回递减后的结果
@Override
public Long decr(String key) {
//似incr
}
//设置到期时间
@Override
public Long expire(String key, int second) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.expire(key, second);
jedis.close();
return result;
}
//以秒为单位返回 key 的剩余过期时间
//当 key 不存在时,返回 -2 ; 当 key 存在但没有设置剩余生存时间时,返回 -1
@Override
public Long ttl(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.ttl(key);
jedis.close();
return result;
}
@Override
public Long hdel(String key, String item) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hdel(key,item);
jedis.close();
return result;
}
相对而言集群版因为都是现成的东西使用代码量要少一些:直接调用JedisCluster方法
交个spring管理:
<!--<!–redis客户端单机版–>-->
<!--<bean id="jedisPool" class="redis.clients.jedis.JedisPool">-->
<!--<constructor-arg name="host" value="192.168.22.102"></constructor-arg>-->
<!--<constructor-arg name="port" value="6380"></constructor-arg>-->
<!--</bean>-->
<!--<!–配置客户端实现类–>-->
<!--<bean id="jedisClientSingle" class="com.taotao.rest.component.impl.JedisClientSingle"/>-->
<!--配置redis客户端集群版-->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg>
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.22.102"/>
<constructor-arg name="port" value="6380"/>
</bean>
……
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.22.103"/>
<constructor-arg name="port" value="6383"/>
</bean>
……
</set>
</constructor-arg>
</bean>
<bean id="jedisClientCluster" class="com.taotao.rest.component.impl.JedisClientCluster"/>
调用:
先注入:
@Autowired
private JedisClient jedisClient;
@Override
public List<TbContent> getContentList(Long cid){
//添加缓存
//查询数据库之前先查询缓存,如果有直接返回
try {
String json = jedisClient.hget(REDIS_CONTENT_KEY,cid+"");
if(!StringUtils.isBlank(json)){
//把json转换成list
return JsonUtils.jsonToList(json,TbContent.class);
}
}catch (Exception e){
e.printStackTrace();
}
//根据cid查询内容列表内容
TbContentExample example = new TbContentExample();
TbContentExample.Criteria criteria = example.createCriteria();
criteria.andCategoryIdEqualTo(cid);
//执行查询
List<TbContent> list =contentMapper.selectByExampleWithBLOBs(example);
//返回结果之前,向缓存中添加数据
try {
//为了规范key可以使用hash
//定义一个保存内容的key,hash中每项就是cid
//value就是list,需要把list转换成json数据
jedisClient.hset(REDIS_CONTENT_KEY,cid+"",JsonUtils.objectToJson(list));
}catch (Exception e){
e.printStackTrace();
}
return list;
}
备注:redis和查询服务是同一服务
小结:
一个简单的应用,redis还需要进一步的学习