Spring Boot 项目集成Redis的方式详解

集成方式

使用jedis

jedis是redis官方推荐的面向java的操作redis的客户端,是对服务端直连后进行操作。如果直接使用jedis进行连接,多线程环境下是非线程安全的,正式生产环境一般使用连接池进行连接。

<dependency>
    <groupid>redis.clients</groupid>
    <artifactid>jedis</artifactid>
    <version>2.9.0</version>
</dependency>

使用spring-data-redis

由spring 框架提供,是对redis客户端的进一步封装,屏蔽了不同客户端的不同实现方式,让服务端和客户端进一步解耦;也就是你可以切换不同的客户端实现,比如jedis或lettuce(redis客户端实现之一),而不影响你的业务逻辑。

类似于的springcloud的服务治理框架对不同服务治理组件的适配,或是amqp

它利用redistemplate对jedisapi进行高度封装。使用的依赖如下:

 <dependency>
 	<groupid>org.springframework.boot</groupid>
 	<artifactid>spring-boot-starter-data-redis</artifactid>
 </dependency>

redis的安装

​收先要安装redis服务端,redis官方提供的是linux安装包。网上有很多详细的安装教程,这里不做展开。关于windows下的安装,可参考我的另一篇博文windows下redis的安装和使用

绑定配置

​完成redis服务端的安装之后,我们开始在项目中进行集成。这里我们先介绍使用jedis的方式进行的集成。先按上面的提及的方式进行依赖的引入。然后将redis的相关信息配置到配置文件中去。我们可以的新建一个配置文件redis.properties,内容如下:

# redis数据库索引(默认为0)
spring.redis.database=0
# redis服务器地址
spring.redis.host=127.0.0.1
# redis服务器连接端口
spring.redis.port=6379
# redis服务器连接密码(默认为空)
spring.redis.password=
# 连接超时时间(毫秒)
spring.redis.timeout=0

​接下来我们要为redis客户端连接绑定上面的配置,创建出来的客户端实例才能够连接到我们的想连的redis服务端。你可以使用@value注解或@configurationproperties注解的方式,本文采用的是后者,如果还不清楚的该注解的用法,可以移步我的另一篇博文@configurationproperties实现自定义配置绑定查看,这里不做展开。

​以下是redis服务端信息配置的接收类:myredisproperties.java

@configurationproperties(
        prefix = "spring.redis"
)
@component
@data
@propertysource("classpath:/redis.properties")
public class myredisproperties {
    private string database;
    private string host;
    private integer port;
    private string password;
    private integer timeout;
}

由于我们正式生产环境一般都是采用连接池方式实现,所以我们还需要关于连接池的配置如下:

# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0

对应的接收类如下:

@configurationproperties(
        prefix = "spring.redis.pool"
)
@data
@component
@propertysource("classpath:/redis.properties")
public class redispoolproperties {

    private integer maxactive;
    private integer maxwait;
    private integer maxidle;
    private integer minidle;
}

然后向spring容器装配客户端实例,分为单个客户端和连接池两种实现,如下代码:

@configuration
public class redisconfig {

    @autowired
    private redispoolproperties redispoolproperties;
    @autowired
    private myredisproperties myredisproperties;

    @bean
    public jedis singlejedis(){
        return new jedis(myredisproperties.gethost(),myredisproperties.getport());
    }

    @bean
    public jedispool jedispool(){ 
        jedispoolconfig poolconfig = new jedispoolconfig();
        poolconfig.setmaxidle(redispoolproperties.getmaxidle());
        poolconfig.setmaxtotal(redispoolproperties.getmaxactive());
        poolconfig.setmaxwaitmillis(redispoolproperties.getmaxwait() * 1000);
        jedispool jp = new jedispool(poolconfig, myredisproperties.gethost(), myredisproperties.getport(),
                myredisproperties.gettimeout()*1000, myredisproperties.getpassword(), 0);
        return jp;

    }
}

获取redis客户端

进行相关配置的绑定之后,意味着我们程序可以拿到redis和连接池的相关信息,然后进行客户端的创建和连接了。所以我们要向spring容器装配客户端实例,分为单个客户端和连接池两种实现,如下代码:

@configuration
public class redisconfig {

    @autowired
    private redispoolproperties redispoolproperties;
    @autowired
    private myredisproperties myredisproperties;

    @bean
    public jedis singlejedis(){
        return new jedis(myredisproperties.gethost(),myredisproperties.getport());
    }

    @bean
    public jedispool jedispool(){ 
        jedispoolconfig poolconfig = new jedispoolconfig();
        poolconfig.setmaxidle(redispoolproperties.getmaxidle());
        poolconfig.setmaxtotal(redispoolproperties.getmaxactive());
        poolconfig.setmaxwaitmillis(redispoolproperties.getmaxwait() * 1000);
        jedispool jp = new jedispool(poolconfig, myredisproperties.gethost(), myredisproperties.getport(),
                myredisproperties.gettimeout()*1000, myredisproperties.getpassword(), 0);
        return jp;

    }
}

redis工具的编写

装配好客户端实例后,我们就可以通过@autowired的方式进行注入使用了。我们都知道,redis有5中数据类型,分别是:

  • string(字符串)
  • hash(哈希)
  • list(列表)
  • set(集合)
  • zset(sorted set:有序集合)

所以的有必要的封装一个操作者5种数据列表的工具类,由于篇幅的关系,我们以redis最基本的数据类型string为例,简单封装几个操作方法作为示例如下,更详细的封装,可参考java操作redis数据库的redis工具,redisutil,jedis工具jedisutil,jedispoolutil这一博文

@service
public class redisservice {

    @autowired
    private jedispool jedispool; // 连接池方式
    @autowired
    private jedis myjedis; // 单个客户端

    public <t> t get(string key, class<t> clazz) {
        jedis jedis = null;
        try {
            jedis = jedispool.getresource();
            string str = jedis.get(key);
            return stringtobean(str,clazz);
        } finally {
            close(jedis);
        }
    }

    public <t> void set(string key, t value) {
        try {
            string str = value.tostring();
            if (str == null || str.length() <= 0) {
                return;
            }
            myjedis.set(key, str);
        } finally {
            close(myjedis);
        }
    }

    private void close(jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }

    /**
     * 把一个字符串转换成bean对象
     * @param str
     * @param <t>
     * @return
     */
    public static <t> t stringtobean(string str, class<t> clazz) {

        if(str == null || str.length() <= 0 || clazz == null) {
            return null;
        }

        if(clazz == int.class || clazz == integer.class) {
            return (t)integer.valueof(str);
        }else if(clazz == string.class) {
            return (t)str;
        }else if(clazz == long.class || clazz == long.class) {
            return  (t)long.valueof(str);
        }else {
            return json.tojavaobject(json.parseobject(str), clazz);
        }
    }
}

其中get方法使用连接池中的客户端实例,set方法用到的是非连接池的实例,以区分两种不同的使用方式

使用

封装好的redis的操作工具类后,我们就可以直接使用该工具类来进行对redis的各种操作 。如下,直接注入即可。

@restcontroller
public class testcontroller {

    @autowired
    private redisservice redisservice;
    
    ......
}

到此这篇关于spring boot 项目集成redis的文章就介绍到这了,更多相关spring boot 项目集成redis内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐