springboot使用redis实现从配置到实战

网友投稿 1060 2022-12-13

springboot使用redis实现从配置到实战

springboot使用redis实现从配置到实战

目录概述准备工作使用

概述

springboot通常整合redis,采用的是RedisTemplate的形式,除了这种形式以外,还有另外一种形式去整合,即采用spring支持的注解进行访问缓存.

准备工作

pom.xml

redis.clients

jedis

2.7.3

http://

org.springframework.data

spring-data-redis

1.7.2.RELEASE

org.springframework.boot

spring-boot-starter-redis

RELEASE

application.properties

# REDIS (RedisProperties)

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

spring.redis.database=0

# Redis服务器地址

spring.redis.host=127.0.0.1

# Redis服务器连接端口

spring.redis.port=6379

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

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

Redis配置类

package cn.chenlove.config;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.cache.annotation.CachingConfigurerSupport;

import org.springframework.cache.annotation.EnableCaching;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.JedisPoolConfig;

@Configuration

@EnableCaching

public class RedisConfig extends CachingConfigurerSupport{

@Value("${spring.redis.host}")

private String host;

@Value("${spring.redis.port}")

private int port;

@Value("${spring.redis.timeout}")

private int timeout;

@Value("${spring.redis.pool.max-idle}")

private int maxIdle;

@Value("${spring.redis.pool.max-wait}")

private long maxWaitMillis;

@Bean

public JedisPool redisPoolFactory() {

Logger.getLogger(getClass()).info("JedisPool注入成功!!");

Logger.getLogger(getClass()).info("redis地址:" + host + ":" + port);

JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();

jedisPoolConfig.setMaxIdle(maxIdle);

jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);

JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout);

return jedisPool;

}

}

可以看出,我们这里主要配置了两个东西,cacheManager方法配置了一个缓存名称,它的名字叫做thisredis,当我们要在方法注解里面使用到它的时候,就要根据名称进行区分不同缓存.同时设置了缓

存的过期时间.redisTemplate则是比较常见的,我们设置了RedisTemplate,因此在代码里面,我们也可以通过@Autowired注入RedisTemplate来操作redis.

使用

接下来就是如何使用注解啦,这一步反而是最简单的.其实只用到了两个注解,@Cacheable和@CacheEvict.第一个注解代表从缓存中查询指定的key,如果有,从缓存中取,不再执行方法.如果没有则执

行方法,并且将方法的返回值和指定的key关联起来,放入到缓存中.而@CacheEvict则是从缓存中清除指定的key对应的数据.使用的代码如下:

//有参数

@Cacheable(value="thisredis", key="'users_'+#id")

public User findUser(Integer id) {

User user = new User();

user.setUsername("hlhdidi");

user.setPassword("123");

user.setUid(id.longValuBmwXMDbJe());

System.out.println("log4j2坏啦?");

logger.info("输入user,用户名:{},密码:{}",user.getUsername(),user.getPassword());

return user;

}

@CacheEvict(value="thisredis", key="'users_'+#id",condition="#id!=1")

public void delUser(Integer id) {

// 删除user

System.out.println("user删除");

}

//无参数

@RequestMapping("/get")

@Cacheable(value="thisredis")

@ResponseBody

public List xx(){

return userMapper.selectAll();

}

@RequestMapping("/get3")

@CacheEvict(value="thisredis")

@ResponseBody

public String xx3(){

return "ok";

}

可以看出,我们用@Cacheable的value属性指定具体缓存,并通过key将其放入缓存中.这里key非常灵活,支持spring的el表达式,可以通过方法参数产生可变的key(见findUser方法),也可以通过其指定在

什么情况下,使用/不使用缓存(见delUser方法).

Gitee码云:https://gitee.com/lyc96/projects

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:JVM内存模型/内存空间:运行时数据区
下一篇:JVM:你知道为什么对象一定在堆中分配吗
相关文章

 发表评论

暂时没有评论,来抢沙发吧~