首页 > 技术文章 > springboot之Redis

z-x-p 2019-09-11 15:48 原文

1.springboot之Redis配置

在学习springboot配置Redis之前先了解Redis。

1.了解Redis

Redis简介:

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)以及hash(适合存储java对象)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

2.springboot中整合Redis

由于redis没有表结构,因此要想将java对象在redis数据库中进行存储,那么必须将java对象转换成json格式之后再进行存储。

了解整合redis相关的类:RedisTemplate、ValueOperations。

RedisTemplate:作用是在给定对象和redis存储中的基础二进制数据之间执行自动序列化/反序列化。默认情况下,它使用对象的Java序列化(JdkSerialIsAsDeSerialStase)。对于字符串密集型操作,请考虑专用的{StringRedisTemplate}。

ValueOperations:springboot是通过ValueOperations类的实例对redis数据库进行添加与查询数据的,该类依赖于spring-boot-starter-data-redis。

1.配置依赖

添加Redis依赖以及gson数据格式转换依赖以及其他常用依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.mymaven</groupId>
    <artifactId>springboot-redis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>springboot-redis</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
    </properties>

    <dependencies>
    <!-- springboot实现访问redis数据库 -->
        <!-- Redis -->
        <dependency>    
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- 转换json数据格式工具 -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

 

2.创建pojo类并事项序列化接口

public class Student implements Serializable{
	private static final long serialVersionUID = 1L;
	private Integer id;
	private String name;
	private String sex;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", sex=" + sex + "]";
	}
}

3.创建访问redis数据库的类StudentRedis

import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Repository;
import com.mymaven.ssmDemo.pojo.Student;
/*该类可以访问Redis*/
@Repository
public class StudentRedis {
    /*
     springboot已为我们配置了StringRedisTemplate以及RedisTemplate,在此处可以直接注入。    
     */
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    /*将stringRedisTemplate注入到ValueOperations中*/
    @Resource(name="stringRedisTemplate")
    private ValueOperations<String,String> valOpsStr;    //对Redis数据库进行操作,泛型为键值对的类型
    
    @Autowired
    private RedisTemplate redisTemplate;
    /*将stringRedisTemplate注入到ValueOperations中*/
    @Resource(name="redisTemplate")
    private ValueOperations<Object,Object> valOps;    //对Redis数据库进行操作,泛型为键值对的类型
    //向Redis数据库添加字符串
    public void stringRedisTemplateDemo(){
        valOpsStr.set("myStringKey", "myStringValue");
    }
    //向Redis数据库添加对象Student
    public void saveStudent(Student s){
        valOps.set(s.getId(),s);
    }
    //从Redis数据库获取对象Student
    public Student getStudent(Integer id){
        Student s=(Student)valOps.get(id);
        return s;
    }
    //从Redis数据库获取字符串
        public String getString(){
            String s=valOpsStr.get("myStringKey");
            return s;
        }
}

4.配置application.properties文件

在配置文件中配置redis的常用属性。

#setting redis database name,it is type of int,default name is '0'
spring.redis.database=0
#setting redis server address,default address is 'localhost'
spring.redis.host=localhost
spring.redis.password=
spring.redis.port=6379
spring.redis.pool.min-idle=2
spring.redis.pool.max-idle=10
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1

至此创建访问redis数据库的主要步骤已经完成了,接下来要做的就是创建调用StudentRedis类的测试代码测试是否能够访问。

5.测试访问redis

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.mymaven.ssmDemo.SsmDemoApplication;
import com.mymaven.ssmDemo.pojo.Student;
import com.mymaven.ssmDemo.repository.StudentRedis;
@RunWith(SpringRunner.class)
@SpringBootTest(classes=SsmDemoApplication.class)
public class StudentServiceTest {
    @Autowired
    private StudentRedis studentRedis;
    //@Test
    public void setString(){
        studentRedis.stringRedisTemplateDemo(); //该方法保存一个键值对
    }
    //@Test
    public void getString(){
        String s=studentRedis.getString();    //该方法保存一个键值对
        System.out.println(s);
    }
    //@Test
    public void setStudent(){
        Student s=new Student();
        s.setId(1);
        s.setName("zhangsan");
        s.setSex("male");
        //向redis数据库中添加对象
        studentRedis.saveStudent(s);
    }
    @Test
    public void getStudent(){
        //从redis数据库中获取对象
        Student s=studentRedis.getStudent(1);
        System.out.println(s);
    }
}

这里实现了两种数据类型(String、Student类)进行存储与获取

在这个测试方法中先运行setString方法,在通过getString方法从redis数据库查询。

至此访问redis数据库的基本功能就实现了。

这里只是添加并访问了redis中value的类型为String和Student类的数据,value还可以是set,Zset,list等类型,由于时间有限,在此就不多介绍(闲的时后详细介绍以下)。

 关于redis对复合类型对象(对象中包含其他对象)的案例已经实现,源码在已上传至GitHub。

https://github.com/zhouxiaopengzhang/springboot

推荐阅读