【简介】
应用场景:前台有一部分内容经常被大量多次的访问的情况下就有必要使用redis了
优点:减少了对数据的访问,使得对用户的相应请求更加迅速
【安装步骤】
第一步:安装gcc编译环境命令:yum install gcc-c++
第二步:将redis的源码上传到linux服务器中
可以直接在百度中搜索redis-3.0.0.tar.gz
第三步:解压缩
tar -zxvf redis-3.0.0.tar.gz
第四步:进入解压后的redis文件夹中,输入命令:make
第五步:安装输入命令: make install PREFIX=/usr/local/redis/
注:/usr/local/redis/为安装的redis的位置,最后的/不可省略
【启动redis】
前端启动:进入redis安装目录,输入命令:./redis-server这样的形式不利于操作,一般采用后台启动
后台启动:
1.将安装步骤中的第三步,解压缩的文件夹中的redis.conf复制到redis的安装目录
2.修改redis.conf内容中的daemonize no 为daemonize yes
3.输入命令启动:./redis-server redis.conf
注:后台启动之后可以输入ps aux|grep redis 查看进程是否启动,这样配置默认的ip为localhost(127.0.0.1) 默认的端口号为 6379 ;如下图所示为启动成功
【测试redis】
dos命令测试1.进入redis安装目录
2.输入命令:./redis-cli -p 6379 -h 192.168.37.10 -c(最后的-c是一定要有的)
通过set设置值,get获取值进行测试,如下图所示
1.引入jedis依赖的jar包: jedis-2.7.2.jar
2.编写测试方法,如下代码
-
package com.taotao.jedis;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class JedisTest {
//单机版
@Test
public void testJedisSingle() throws Exception{
//创建一个jedis对象
Jedis jedis = new Jedis("192.168.37.10",6379);
jedis.set("test", "hello jedis");
String string = jedis.get("test");
System.out.println(string);
jedis.close();
}
//使用连接池
@Test
public void testJedisPool() throws Exception{
//创建一个链接池对象
//系统中应该是单例的
JedisPool jedisPool = new JedisPool("192.168.37.10",6379);
//从连接池中获得一个连接
Jedis jedis = jedisPool.getResource();
String result = jedis.get("test");
System.out.println(result);
//jedis必须关闭
jedis.close();
//系统关闭时关闭连接池
jedisPool.close();
}
}
-
【项目运用】
思路:创建一个jedis操作的接口,创建一个实体类来实现redis的接口
jedis的接口类
-
package com.taotao.rest.component;
public interface JedisClient {
public String set(String key,String value);
public String get(String key);
public Long hset(String key,String item,String value);
public String hget(String key,String item);
public Long incr(String key);
public Long decr(String key);
public Long expire(String key,int second);
public Long ttl(String key);
public Long hdel(String key,String item);
}
-
jedis的实现类
-
package com.taotao.rest.component.impl;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import com.taotao.rest.component.JedisClient;
/**
* redis客户端单机版实现类
* @author mk
* @date 2017年2月8日下午9:34:39
* @version 1.0
*/
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;
}
@Override
public Long incr(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.incr(key);
jedis.close();
return result;
}
@Override
public Long decr(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.decr(key);
jedis.close();
return result;
}
@Override
public Long expire(String key, int second) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.expire(key,second);
jedis.close();
return result;
}
@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;
}
}
-
spring配置
-
<!-- 配置redis客户端单机版 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" >
<constructor-arg name="host" value="192.168.37.10"></constructor-arg>
<constructor-arg name="port" value="6379"></constructor-arg>
</bean>
<!-- 配置redis客户端实现类 -->
<bean id="jedisClientSingle" class="com.taotao.rest.component.impl.JedisClientSingle"/>
-
service中的运用(REDIS_CONTENT_KEY为固定的一个规范,在配置文件中自己设定就可以了)
-
@Override
public List<TbContent> getContentList(Long cid) {
//添加缓存
//查询数据库之前先查询缓存,如果有直接返回
try {
//从redis中取缓存数据
String json = jedisClient.hget(REDIS_CONTENT_KEY, cid+"");
if (!StringUtils.isBlank(json)) {
//把json转换成list
List<TbContent> list = JsonUtils.jsonToList(json, TbContent.class);
return list;
}
} catch (Exception e) {
e.printStackTrace();
}
//根据cid查询内容列表
TbContentExample example = new TbContentExample();
Criteria criteria = example.createCriteria();
criteria.andCategoryIdEqualTo(cid);
//执行查询
List<TbContent> list = contentMapper.selectByExample(example);
//返回结果之前,向缓存中添加数据
try {
//为了规范key可以使用hash
//定义一个保存内容的key,hash中每个项就是cid
//value是list,需要把list转换成jeson数据
jedisClient.hset(REDIS_CONTENT_KEY, cid+"", JsonUtils.objectToJson(list));
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
-
【总结】
通过对redis环境的配置测试以及项目中的运用,让我深刻的感受到了缓存的力量,以及通过这几技术点开拓的自己的思想,以及考虑问题的角度。针对于每一个技术点都应该有它独特的适应场景,而不是随意去用,如果是为了学习测试某一个技术点那么在任何地方进行都是可以的,如果是项目中来运用的话还是要深刻的思考宏观的把控,来衡量一下这个技术点的运用场景从而来裁决是否用它。
有时候小编也会思考,如何才能够让自己学习一个东西来达到举一反三的效果,实践证明小编的理论就是:首先有一套可执行的理论;其次就是自己要不断去尝试,一定要亲自动手去做;最后如果在做的过程中遇到各种各样的问题之后要是再加上:“我又遇到问题了,我又能够成长了,我又能够从更多的角度用更多的思路来理解这个知识点了”,这样的心态的话,那么学习走想成功也就不太远啦O(∩_∩)O~
总结沉潜,继续前行啦O(∩_∩)O~