文章目录
springboot中使用redis
springboot 连接 redis三种方式
- jedis (redis官方提供的)
- springboot自带的
- redisson (基于jedis优化的,性能最好,使用最多)
本文以springboot自带为例
导入依赖
导入springboot自带的redis依赖
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
controller中注入即可。
java
@Resource
private RedisTemplate<String, String> redisTemplate;
增删改查
基本的增删改查,很简单。
java
@GetMapping("/test")
public String test() {
// 增
redisTemplate.opsForValue().set("lpy", "123", 1, TimeUnit.HOURS);
// 查
String lpy = redisTemplate.opsForValue().get("lpy");
System.out.println(lpy); // 123
// 改
redisTemplate.opsForValue().set("lpy", "456", 1, TimeUnit.HOURS);
lpy = redisTemplate.opsForValue().get("lpy");
System.out.println(lpy); // 456
// 删
redisTemplate.delete("lpy");
lpy = redisTemplate.opsForValue().get("lpy");
System.out.println(lpy); // null
return "success";
}
小练习
需求:防止用户频繁访问,10s内只能访问一次。
java
@GetMapping("/access")
public String access(String id) {
String exit = redisTemplate.opsForValue().get("user" + id);
if (exit == null || "".equals(exit)) {
redisTemplate.opsForValue().set("user" + id, "true", 10, TimeUnit.SECONDS);
return "可以访问";
}
return "访问过于频繁";
}
需求:用户10s内只能访问5次。
java
@GetMapping("/test2")
public String test2(String id) {
Long increment = redisTemplate.opsForValue().increment(id, 1);
redisTemplate.expire(id, 10, TimeUnit.SECONDS);
if (increment > 5) {
return "你不能访问,近10秒访问次数是" + increment;
} else {
return "欢迎使用,访问次数是" + increment;
}
}
需求:发红包,指定金额和数量(保证数量 <= 金额)单位元。 抢红包,每个红包最少为一元。利用list。 拆分的红包入队,抢红包出队。
这里只是简单写的,实际肯定是要记录发红包的人,抢红包的人等等各种情况,也不可能有这么多小数点。可以自行尝试。 这里主要是练习list的使用。
java
/**
* 发红包
* @param money
* @param count
* @return
*/
@GetMapping("/sendRedEnvelope")
public String sendRedEnvelope(double money, int count) {
if (count > money) return "金额过小或个数过多,请保证每个包最少可以有一元";
Random rand = new Random();
double sum = 0; // 检验一下是否分配正确
for (int i = 0; i < count; i++) {
double max = money - (count - i - 1) * 1; // 确保后面的钱够,所以预留出足够的最小金额
// 如果是最后一个包,把剩余的钱全部放入
if (i == count - 1) {
redisTemplate.opsForList().rightPush("redList", String.valueOf(max)); // 插入队列
sum += max;
continue;
}
double redMoney = rand.nextDouble() * (max - 1) + 1.0; // 每个红包的金额
money -= redMoney; // 减去已经包好的红包金额
redisTemplate.opsForList().rightPush("redList", String.valueOf(redMoney)); // 插入队列
sum += redMoney;
}
System.out.println(sum);
return "发放成功";
}
/**
* 抢红包
* @return
*/
@GetMapping("/grabRedEnvelope")
public String grabRedEnvelope() {
Long redListSize = redisTemplate.opsForList().size("redList");
// 红包已经抢完
if (redListSize == 0) {
return "此红包已经抢完";
}
// 获取红包
double money = Double.parseDouble(redisTemplate.opsForList().leftPop("redList"));
return "抢红包成功,你抢了" + money + "元";
}
发红包
抢红包