欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spring boot(三)之Spring Boot中Redis的使用

程序员文章站 2024-02-22 20:43:46
spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化。 redis介绍 redis是目前业界使用最广泛的内存数据存储。相比memcache...

spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化。

redis介绍

redis是目前业界使用最广泛的内存数据存储。相比memcached,redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化。除此之外,redis还提供一些类数据库的特性,比如事务,ha,主从库。可以说redis兼具了缓存系统和数据库的一些特性,因此有着丰富的应用场景。本文介绍redis在spring boot中两个典型的应用场景。

如何使用

1、引入 spring-boot-starter-redis

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

2、添加配置文件

# redis (redisproperties)
# redis数据库索引(默认为0)
spring.redis.database=0 
# redis服务器地址
spring.redis.host=192.168.0.58
# redis服务器连接端口
spring.redis.port=6379 
# redis服务器连接密码(默认为空)
spring.redis.password= 
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8 
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1 
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8 
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0 
# 连接超时时间(毫秒)
spring.redis.timeout=0 

3、添加cache的配置类

@configuration
@enablecaching
public class redisconfig extends cachingconfigurersupport{
  @bean
  public keygenerator keygenerator() {
    return new keygenerator() {
      @override
      public object generate(object target, method method, object... params) {
        stringbuilder sb = new stringbuilder();
        sb.append(target.getclass().getname());
        sb.append(method.getname());
        for (object obj : params) {
          sb.append(obj.tostring());
        }
        return sb.tostring();
      }
    };
  }
  @suppresswarnings("rawtypes")
  @bean
  public cachemanager cachemanager(redistemplate redistemplate) {
    rediscachemanager rcm = new rediscachemanager(redistemplate);
    //设置缓存过期时间
    //rcm.setdefaultexpiration(60);//秒
    return rcm;
  }
  @bean
  public redistemplate<string, string> redistemplate(redisconnectionfactory factory) {
    stringredistemplate template = new stringredistemplate(factory);
    jackson2jsonredisserializer jackson2jsonredisserializer = new jackson2jsonredisserializer(object.class);
    objectmapper om = new objectmapper();
    om.setvisibility(propertyaccessor.all, jsonautodetect.visibility.any);
    om.enabledefaulttyping(objectmapper.defaulttyping.non_final);
    jackson2jsonredisserializer.setobjectmapper(om);
    template.setvalueserializer(jackson2jsonredisserializer);
    template.afterpropertiesset();
    return template;
  }
}

3、好了,接下来就可以直接使用了

@runwith(springjunit4classrunner.class)
@springapplicationconfiguration(application.class)
public class testredis {
  @autowired
  private stringredistemplate stringredistemplate;
  @autowired
  private redistemplate redistemplate;
  @test
  public void test() throws exception {
    stringredistemplate.opsforvalue().set("aaa", "111");
    assert.assertequals("111", stringredistemplate.opsforvalue().get("aaa"));
  }
  @test
  public void testobj() throws exception {
    user user=new user("aa@126.com", "aa", "aa123456", "aa","123");
    valueoperations<string, user> operations=redistemplate.opsforvalue();
    operations.set("com.neox", user);
    operations.set("com.neo.f", user,1,timeunit.seconds);
    thread.sleep(1000);
    //redistemplate.delete("com.neo.f");
    boolean exists=redistemplate.haskey("com.neo.f");
    if(exists){
      system.out.println("exists is true");
    }else{
      system.out.println("exists is false");
    }
    // assert.assertequals("aa", operations.get("com.neo.f").getusername());
  }
}

以上都是手动使用的方式,如何在查找数据库的时候自动使用缓存呢,看下面;

4、自动根据方法生成缓存

@requestmapping("/getuser")
@cacheable(value="user-key")
public user getuser() {
  user user=userrepository.findbyusername("aa");
  system.out.println("若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功"); 
  return user;
}

其中value的值就是缓存到redis中的key

共享session-spring-session-data-redis

分布式系统中,sessiong共享有很多的解决方案,其中托管到缓存中应该是最常用的方案之一,

spring session官方说明

spring session provides an api and implementations for managing a user's session information.

如何使用

1、引入依赖

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

2、session配置:

@configuration
@enableredishttpsession(maxinactiveintervalinseconds = 86400*30)
public class sessionconfig {
}

maxinactiveintervalinseconds: 设置session失效时间,使用redis session之后,原boot的server.session.timeout属性不再生效

好了,这样就配置好了,我们来测试一下

3、测试

添加测试方法获取sessionid

@requestmapping("/uid")
  string uid(httpsession session) {
    uuid uid = (uuid) session.getattribute("uid");
    if (uid == null) {
      uid = uuid.randomuuid();
    }
    session.setattribute("uid", uid);
    return session.getid();
  }

登录redis 输入 keys '*sessions*'

t<spring:session:sessions:db031986-8ecc-48d6-b471-b137a3ed6bc4
t(spring:session:expirations:1472976480000

其中 1472976480000为失效时间,意思是这个时间后session失效,db031986-8ecc-48d6-b471-b137a3ed6bc4 为sessionid,登录 发现会一致,就说明session 已经在redis里面进行有效的管理了。

如何在两台或者多台*享session

其实就是按照上面的步骤在另一个项目中再次配置一次,启动后自动就进行了session共享。

以上所述是小编给大家介绍的spring boot(三)之spring boot中redis的使用,希望对大家有所帮助