当前位置: 移动技术网 > IT编程>开发语言>Java > Spring Boot中Redis数据库的使用实例

Spring Boot中Redis数据库的使用实例

2019年07月22日  | 移动技术网IT编程  | 我要评论

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,登录http://localhost:8080/uid 发现会一致,就说明session 已经在redis里面进行有效的管理了。

如何在两台或者多台中共享session

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网