缓存 application session java_SpringBoot(九):redis缓存数据和session

版权声明

本作品采用知识共享署名 4.0 国际许可协议进行许可。

本文作者:低调小熊猫

文章链接:https://aodeng.cc/archives/springbootjiu

转载声明:自由转载-非商用-非衍生-保持署名,非商业转载请注明作者及出处,商业转载请联系作者本人qq:2696284032

单纯的广告

微信公众号:低调小熊猫

qq交流群:756796932

配置

pom.xml

org.springframework.boot

spring-boot-starter-redis

org.springframework.boot

spring-boot-starter-data-redis

org.springframework.session

spring-session-data-redis

application.yml

# REDIS (RedisProperties)

# Redis数据库索引(默认为0)

spring:

redis:

database: 0

# Redis服务器地址

host: localhost

# Redis服务器连接端口

port: 6379

# Redis服务器连接密码(默认为空)

password:

# 连接超时时间(毫秒)

#timeout: 0

# 连接池最大连接数(使用负值表示没有限制)

pool:

max-active: 8

# 连接池最大阻塞等待时间(使用负值表示没有限制)

max-wait: -1

# 连接池中的最大空闲连接

max-idle: 8

# 连接池中的最小空闲连接

min-idle: 0

RedisConfig.java

@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 object : params) {

sb.append(object.toString());

}

return sb.toString();

}

};

}

/***

* springboot 2.0

* @param connectionFactory

* @return

*/

@Bean

CacheManager cacheManager(RedisConnectionFactory connectionFactory) {

//user信息缓存配置

RedisCacheConfiguration userCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(30)).disableCachingNullValues().prefixKeysWith("role");

//product信息缓存配置

RedisCacheConfiguration productCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(10)).disableCachingNullValues().prefixKeysWith("test");

Map redisCacheConfigurationMap = new HashMap<>();

redisCacheConfigurationMap.put("role", userCacheConfiguration);

redisCacheConfigurationMap.put("test", productCacheConfiguration);

//初始化一个RedisCacheWriter

RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);

//设置CacheManager的值序列化方式为JdkSerializationRedisSerializer,但其实RedisCacheConfiguration默认就是使用StringRedisSerializer序列化key,JdkSerializationRedisSerializer序列化value,所以以下注释代码为默认实现

//ClassLoader loader = this.getClass().getClassLoader();

//JdkSerializationRedisSerializer jdkSerializer = new JdkSerializationRedisSerializer(loader);

//RedisSerializationContext.SerializationPair pair = RedisSerializationContext.SerializationPair.fromSerializer(jdkSerializer);

//RedisCacheConfiguration defaultCacheConfig=RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair);

RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig();

//设置默认超过期时间是30秒

defaultCacheConfig.entryTtl(Duration.ofSeconds(30));

//初始化RedisCacheManager

RedisCacheManager cacheManager = new RedisCacheManager(redisCacheWriter, defaultCacheConfig, redisCacheConfigurationMap);

return cacheManager;

}

@Bean

public RedisTemplate 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;

}

SessionConfig.java

@Configuration

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1)

public class SessionConfig {

}

使用缓存

@RunWith(SpringRunner.class)

@SpringBootTest

public class TestRedisTest {

private static final Logger log= LoggerFactory.getLogger(TestRedisTest.class);

@Autowired

private StringRedisTemplate stringRedisTemplate;

@Autowired

private RedisTemplate redisTemplate;

@Test//StringRedisTemplate使用的是 StringRedisSerializer

public void test1() throws Exception{

stringRedisTemplate.opsForValue().set("name","admin");

Assert.assertEquals("admin",stringRedisTemplate.opsForValue().get("name"));

log.info("[redis测试]-[{}]",stringRedisTemplate.opsForValue().get("name"));

}

@Test//RedisTemplate使用的是 JdkSerializationRedisSerializer

public void test2() throws Exception{

SysRole sysRole=new SysRole();

sysRole.setRoleId(1);

sysRole.setRole("1001");

sysRole.setRole("管理员");

sysRole.setDescription("这是一个测试管理员");

ValueOperations valueOperations=redisTemplate.opsForValue();

valueOperations.set("sysRole1",sysRole);

valueOperations.set("sysRole2",sysRole,2, TimeUnit.SECONDS);

Thread.sleep(1000);

log.info("[sysRole2]-[{}]",valueOperations.get("sysRole2"));

boolean exists=redisTemplate.hasKey("sysRole2");

if(exists){

System.out.println("true");

}else {

System.out.println("false");

}

Assert.assertEquals("管理员",valueOperations.get("sysRole1").getRole());

}

}

session共享demo

@RestController

public class TestRedis {

@RequestMapping("/test")

String test(HttpSession httpSession){

UUID uuid=(UUID) httpSession.getAttribute("uuid");

if(null==uuid){

uuid=UUID.randomUUID();

}

httpSession.setAttribute("uuid",uuid);

return httpSession.getId();

}

}

redis客户端查看session

keys '*sessions*'

源码地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值