SpringBoot+Redis缓存

那年仲夏 提交于 2020-02-26 21:02:18

开发中通常会使用缓存中间件:redis、memcached、ehcache.
redis可以用作数据库、缓存和消息中间件,本文中使用redis作为缓存

一、安装redis

1、docker中安装redis:

sudo docker pull redis

2、启动redis并映射端口

sudo docker run -d -p 6379:6379 --name myredis 镜像名

映射容器服务的 6379 端口到宿主机的 6379 端口。外部可以直接通过宿主机ip:6379 访问到 Redis 的服务

3、windows中安装
在这里插入图片描述
4、连接虚拟机
在这里插入图片描述
右击redis打开控制台console可以输入命令
在这里插入图片描述

二、配置redis

1、pom.xml中引入依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、application.properties中配置

#连接虚拟机中的redis
spring.redis.host=192.168.0.103
spring.redis.port=6379

3、在测试中注入redis操作的模板:

	@Autowired
	StringRedisTemplate stringRedisTemplate; //模板:操作key-value都是字符串
	
	@Autowired
	RedisTemplate redisTemplate; //模板:操作key-value,都是对象

模板中的方法:

/**
	 * Redis常见的五大数据类型
	 * String(字符串)、List(列表)、Set(集合)、Hash(散列)、ZSet(有序集合)
	 * stringRedisTemplate.opsForValue() [操作String 字符串的]
	 * stringRedisTemplate.opsForList() [List(列表)]
	 * stringRedisTemplate.opsForSet()
	 * stringRedisTemplate.opsForHash()
	 * stringRedisTemplate.opsForZSet()
	 * redisTemplate.opsForValue()  //两个模板使用方法都一样
	 * 
	 */

4、测试用例:
在redis中添加字符串key-value

	@Test
	public void test01() {
		//给redis中保存数据
		stringRedisTemplate.opsForValue().append("msg", "hello");
		//String str=stringRedisTemplate.opsForValue().get("msg");
		//System.out.println(str);
	}

在这里插入图片描述
5、测试例子:利用RedisTemplate类模板的实例保存对象object
注意:保存的对象employee需要是一个可序列化的类,默认如果保存对象,使用jdk序列化机制,序列化后的数据保存到redis中,如下图所示:
在这里插入图片描述

	@Test
	public void test02() {
		//给redis中保存对象
		Employee employee=employeemapper.getEmpById(2);
		redisTemplate.opsForValue().set("emp-01", employee);           //需要一个可序列化的类	
	}
	
	@Test
	void contextLoads() {
		Employee employee=employeemapper.getEmpById(2);
		System.out.println(employee);
	}

在Employee类中继承序列化(Serializable)接口:
在这里插入图片描述
6、改变默认的序列化规则(不使用默认的jdk序列化机制)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Primary;
//import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
//import springboot.bean.Department;
import springboot.bean.Employee;
import java.net.UnknownHostException;

@Configuration
public class MyRedisConfig {

    @Bean  //注入模板到容器
    public RedisTemplate<Object, Employee> empRedisTemplate(
            RedisConnectionFactory redisConnectionFactory)
            throws UnknownHostException {
        RedisTemplate<Object, Employee> template = new RedisTemplate<Object, Employee>();
        template.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer<Employee> ser = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
        template.setDefaultSerializer(ser);
        return template;
    }
}

在测试中注入模板

@Autowired
	RedisTemplate<Object, Employee> empRedisTemplate;

利用该模板保存对象:

@Test
	public void test02() {
		//给redis中保存对象
		Employee employee=employeemapper.getEmpById(2);
		empRedisTemplate.opsForValue().set("emp-01", employee);           //需要一个可序列化的类	
	}

可以直接保存对象
在这里插入图片描述

三、测试缓存

缓存的原理缓存管理器CacheManager–>创建出缓存组件Cache,缓存组件Cache来实际给缓存中CRUD(增删改查)数据
1、引入redis的starter后,容器中保存的是RedisCacheManager
2、RedisCacheManager创建RedisCache作为缓存组件;RedisCache通过操作redis缓存数据
(默认配置类使用SimpleCacheConfiguration,配置完redis后使用的配置类为RedisCacheConfiguration,缓存管理器使用RedisCacheManager)
3、redis中添加缓存,默认保存数据的key-value都是Object,利用序列化保存.如何将保存在缓存中的对象保存为json:
(下图为浏览器中查询2号员工:http://localhost:8080/emp/2后的redis中缓存的数据)

  1. 引入了redis的starter,cacheManager变为RedisCacheManager
  2. 默认创建的RedisCacheManager操作redis的时候使用的是RedisTemplate<Object,Object>
  3. RedisTemplate<Object,Object>是默认使用jdk序列化机制(所以都是乱码)
    在这里插入图片描述

4、自定义CacheManager

未完…

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!