【简介】
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
应用场景:前台有一部分内容经常被大量多次的访问的情况下就有必要使用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获取值进行测试,如下图所示
项目中测试(通过jedis进行测试)
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~