Redis简单实现添加缓存(SSM+Redis单机版)

大家首先得搭建好了SSM框架,然后把Redis相关的添加进去就好了。

一、Linux安装单机版Redis

1. 查看是否安装gcc-c++

    [root@itcast-01 ~]# rpm -qa | grep gcc-c++

    输出:gcc-c++-4.4.7-17.el6.i686

2. 如果没有安装,可以使用yum命令进行网络安装

    [root@itcast-01 ~]# yum install gcc-c++

3. 在Linux的CRT客户端,按alt+p进行上传,直接把安装包拖动上去

4. 解压安装包

    [root@itcast-01 ~]# tar -zxvf redis-3.0.2.tar.gz 

5. 进入解压的文件夹,进行编译

    [root@itcast-01 ~]# cd redis-3.0.2

    [root@itcast-01 redis-3.0.2]# make

   

6. 查看安装目录

    [root@itcast-01 redis-3.0.2]# cd /usr/local/redis/bin/

7. 后台启动Redis:

    a. 从安装包中复制redis.conf文件到/usr/local/redis/bin中

        [root@itcast-01 bin]# cp /root/redis-3.0.2/redis.conf ./

   b. 修改redis.conf配置文件,修改为yes

       [root@itcast-01 bin]# vim redis.conf

      

    c.启动命令

       [root@itcast-01 bin]# ./redis-server redis.conf

8. 查看启动效果:

    [root@itcast-01 bin]# ps -ef | grep redis

 

二、简单Demo测试是否可用

public class RedisTest {

	public static void main(String[] args) {

		// 1. 创建jedis对象,需要ip和port
		Jedis jedis = new Jedis("192.168.37.161", 6379);

		// 2. 使用jedis操作redis,jedis的方法和命令是一样的
		String pong = jedis.ping();
		System.out.println(pong);

		String key = "jedis";
		String setResult = jedis.set(key, "hello redis!");
		System.out.println(setResult);

		String getResult = jedis.get(key);
		System.out.println(getResult);

		// 3. 释放资源,关闭jedis
		jedis.close();
	}
}

 

三、SSM集成Redis

1.maven目录结构

2. 添加maven坐标

<!-- Redis客户端 -->
<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>2.7.2</version>
</dependency>

3. 与Spring整合:applicationContext-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
   
	
   <!-- 配置jedis连接池 -->
   <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
   		<constructor-arg name = "host" value="192.168.37.161"/>
		<constructor-arg name = "port" value="6379"/>
   </bean>
   
   <!-- 配置操作单机版redis的实现类 -->
   <bean id="poolJedisClient" class="cn.jindou.redis.RedisPool" /> 
</beans>    

4.操作Redis的接口和实现类‘

/**
 * 操作Redis的方法接口
 */
public interface RedisUtils {
	
	/**
	 * 保存
	 * 
	 * @param key
	 * @param value
	 */
	public void set(String key, String value);

	/**
	 * 根据key查询
	 * 
	 * @param key
	 * @return
	 */
	public String get(String key);

	/**
	 * 删除
	 * 
	 * @param key
	 */
	public void del(String key);

	/**
	 * 根据key设置生存时间
	 * 
	 * @param key
	 * @param seconds
	 */
	public void expire(String key, Integer seconds);

	/**
	 * 保存并设置生存时间
	 * 
	 * @param key
	 * @param value
	 * @param seconds
	 */
	public void set(String key, String value, Integer seconds);

	/**
	 * value加一
	 * 
	 * @param key
	 * @return
	 */
	public Long incr(String key);
	
	
}

public class RedisPool implements RedisUtils{
	
	@Autowired
	private JedisPool jedisPool;

	@Override
	public void set(String key, String value) {
		Jedis jedis = this.jedisPool.getResource();

		jedis.set(key, value);
		jedis.close();
	}

	@Override
	public String get(String key) {
		Jedis jedis = this.jedisPool.getResource();

		String result = jedis.get(key);
		jedis.close();

		return result;
	}

	@Override
	public void del(String key) {
		Jedis jedis = this.jedisPool.getResource();

		jedis.del(key);
		jedis.close();

	}

	@Override
	public void expire(String key, Integer seconds) {
		Jedis jedis = this.jedisPool.getResource();

		jedis.expire(key, seconds);
		jedis.close();

	}

	@Override
	public void set(String key, String value, Integer seconds) {
		Jedis jedis = this.jedisPool.getResource();

		jedis.set(key, value);
		jedis.expire(key, seconds);
		jedis.close();

	}

	@Override
	public Long incr(String key) {
		Jedis jedis = this.jedisPool.getResource();

		Long count = jedis.incr(key);
		jedis.close();

		return count;
				
	}
}

5.修改Controller层,添加Redis缓存

@Controller
@RequestMapping("linkman")
public class LinkManController {
	
	@Autowired
	private LinkManService linkManService;
	
	@Autowired
	private RedisUtils redisUtils;
	/**
	 * 联系人列表
	 */
	@RequestMapping(value = "list",method = RequestMethod.GET)
	public ModelAndView queryAllLinkMan(){
		
		// 1. 从缓存中命中
		try {
			List<LinkMan> list;
			String redisJson = redisUtils.get("linkManList");
			// 判断是否为空,如果不为空表示命中了,直接返回
			if (StringUtils.isNotBlank(redisJson)) {
				
				// Jackson反序列化List
				ObjectMapper mapper = new ObjectMapper();
				JavaType constructParametricType = mapper.getTypeFactory().constructParametricType(List.class, LinkMan.class);				
				list = mapper.readValue(redisJson,constructParametricType);
				
				System.out.println("我进来了啊"+list.toString());
			} else {
				 //从数据库查询,并保存到Redi缓存
				list = this.linkManService.queryAllLinkMan();
				ObjectMapper mapper = new ObjectMapper();
				String writeValueAsString = mapper.writeValueAsString(list);
				System.out.println(writeValueAsString);
				
				// 注意:此处的key若Redis中已存在,会报错的(困了菜鸡一下午啊)!
				redisUtils.set("linkManList", writeValueAsString);
				
				System.out.println("我进来了哦"+list.toString());				
			}
			ModelAndView modelAndView = new ModelAndView();
			modelAndView.addObject("linkMan",list);
			modelAndView.setViewName("linkman-list");
			return modelAndView;
		} catch (Exception e1) {
			e1.printStackTrace();
		}				
		return new ModelAndView("error");		
	}
}

四、Redis原理一些东西

  1.  使用Redist添加缓存的原因:

    (1)Redis是将数据存到内存中,而Mysql存在磁盘中,从内存中读取数据更快。

        注:Redis的数据模型:key : value

    (2)访问率高但更新频率较低的数据,可以添加缓存,减少Mysql压力。

    (3)查询时先从Redis中查,没有再去Mysql中查,将查到的数据放缓存中一份。

  2.  Redis的使用:

     (1) Redis持久化方案:

        RDB 快照,在指定时间间隔将把内存中的数据快照写入磁盘中(dump.rdb)

        AOF 保存命令日志,把每条Redis命令都保存到AOF日志文件中。

     (2) Redis支持多种数据类型(特指value),比如:String、Hash、List、Set、SoredSet

     (3) Redis可以集群来提高网站的响应速度。

3. Redis集群原理简介:

  (1) 所有Redis节点是互联的,我们连接Redis时只需要连接任意一个节点即可

  (2) 搭建集群需要分配0~16383个插槽,Redis-cluster会对key进行算法计算,将value值存储到对应节点。

  (3) Redis集群中超过半数主节点失效或一个主节点失效且无从节点时,认定集群不可用。

  (4) Redis集群搭建,因其投票机制,至少需要3个主节点和3个从节点,所以至少需要6台Redis服务器。

猜你喜欢

转载自blog.csdn.net/weixin_38943098/article/details/87931467