public ResultEntity getById(@RequestBody addVo add) {
// 每点击一次查看详情的接口 查看次数就增加1
Long id = add.getId();
String add1 = add.getAdd();
ResourceProduct resourceProduct = resourceProductService.selectById(id);
if (resourceProduct != null && !"1".equals(add1)) {
RedissonClient redissonClient = redissonConfig.redissonClient();
RLock distLock = redissonClient.getLock("product_" + id + "0");
try {
getlock(distLock);
Integer productViewingnum;
if (StringUtils.isNotNull(redisService.getCacheObject(CacheName.ResourceProduct.getValue() + "Viewingnum:" + id))) {
productViewingnum = redisService.getCacheObject(CacheName.ResourceProduct.getValue() + "Viewingnum:" + id);
} else {
productViewingnum = resourceProduct.getProductViewingnum() == null ? 0 : resourceProduct.getProductViewingnum();
}
redisService.setCacheObject(CacheName.ResourceProduct.getValue() + "Viewingnum:" + id, productViewingnum + 1);
resourceProduct.setProductViewingnum(productViewingnum + 1);
} catch (Exception e) {
log.error(e.getMessage());
} finally {
distLock.unlock();
return ResultEntity.ok(resourceProduct);
}
}
return ResultEntity.ok(resourceProduct);
}
/**
* 循环获取锁
*
* @param distLock
*/
private void getlock(RLock distLock) {
while (!distLock.tryLock()) {
if (distLock.tryLock()) {
break;
}
}
}
/**
* 定时执行同步查看数
*/
@Scheduled(cron = "0 0 0 * * *")
@GetMapping("/test" )
public void hello()
{
Jedis jedis = redissonConfig.jedis();
String cursor = "0";
Set<String> keys = new HashSet<>();
do {
ScanParams scanParams = new ScanParams();
scanParams.match(CacheName.ResourceProduct.getValue() +"Viewingnum:" + "*");
ScanResult<String> scanResult = jedis.scan(cursor, scanParams);
keys.addAll(scanResult.getResult());
cursor = scanResult.getCursor();
}while (!cursor.equals("0"));
for (String key : keys) {
String value = jedis.get(key);
System.out.println("Key: " + key + ", Value: " + value);
}
}
package com.ruoyi.componentlibrary.config;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
import redis.clients.jedis.Jedis;
import java.util.Optional;
@Configuration
public class RedissonConfig {
@Value("${redis.host}")
private String host;// 主机IP
@Value("${redis.port}")
private Integer port;// 端口
@Value("${redis.password}")
private String password;// 密码
@Bean
public RedissonClient redissonClient() {
Config config = new Config();
config.useSingleServer()
.setAddress("redis://"+host+":"+port)
.setPassword(password)
.setConnectionMinimumIdleSize(10) //连接池最小空闲连接数
.setConnectionPoolSize(50) //连接池最大线程数
.setIdleConnectionTimeout(60000) //线程的超时时间
.setConnectTimeout(6000) //客户端程序获取redis链接的超时时间
.setTimeout(60000); //响应超时时间
if (StringUtils.hasText(password)) {
config.useSingleServer()
.setPassword(password);
}
RedissonClient redisson = Redisson.create(config);
return redisson;
}
@Bean
public Jedis jedis() {
Jedis jedis = new Jedis(host, port);
jedis.auth(password);
return jedis;
}
}