SpringBoot项目如何引用 redis 缓存及分布式锁的应用

redis 的用处很多,其中缓存和分布式就是其中的功能,如何使用呢?简要过程如下

1,项目pom.xml 引入依赖,

<!-- Spring Boot Redis Starter -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2,配置 Redis ,

接下来,在 application.properties 或 application.yml 文件中配置Redis的连接信息,以 application.properties 为例:


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

其中 redis 的序列化方式省略...

3,缓存功能使用,在 Service 层或 controller 层使用  RedisTemplate 

主要应用场景:在一定时间内无需变化的数据,缓存起来,用时直接内存区,减少DB查询,减小DB压力

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
// 使用泛型操作对象类型数据
@Autowired
private RedisTemplate<String, Object> redisTemplate; 

// 设置值,默认不过期
redisTemplate.opsForValue().set(key, value); 

// 设置值并设置过期时间,
redisTemplate.opsForValue().set(key, value, timeout, unit);
例如10分钟过期:
redisTemplate.opsForValue().set("myKey", "myValue", 10, TimeUnit.MINUTES);

读取键 redisKey01 对于的缓存值
String myValue = redisTemplate.opsForValue().get("redisKey01"); // 获取key对应的值

4,分布式锁使用,

主要应用场景:当同一个应用代码部署在多台机子有多个应用实列的情况,解决频发竞争带来的唯一性问题,利用 reids 的单线程特性处理唯一性;


@Autowired
private RedisTemplate<String, Object> redisTemplate; 

/**
获取分布式锁,
返回:true=成功获取锁,false获取锁失败
*/
public boolean getLock(String lockKey, String value, int expireTime) {
	boolean lock = false;
	try {
	      lock = redisTemplate.opsForValue().setIfAbsent(lockKey, value)
	      if (lock) {
		redisTemplate.expire(lockKey, expireTime, TimeUnit.MINUTES);
	      } 
	} catch(Exception e) {
	      e.printStackTrance();
	}
	return lock ;
}

/**
释放分布式锁,
*/
public boolean releaseLock(String lockKey, String value) {
	try {
	      String curValue = (String)redisTemplate.opsForValue().get(lockKey)
	      if ( null != curValue && !curValue.trim.isEmpty() && curValue.equals(value)) {
		     redisTemplate.opsForValue().getOperations().delete(lockKey);
	      } 
	} catch(Exception e) {
	      e.printStackTrance();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值