1. 确认项目有没有引用jar包
com.bosssoft.bigdata
bigdata-common-data
也可以直接用
org.springframework.boot
spring-boot-starter-data-redis
在项目的yum文件中加入redis的配置信息,示例如下
spring:
redis:
host: 127.0.0.1
database: 2
2. 注解@Cacheable、@CacheEvict、@CachePut
- @Cacheable
查询:如果缓存中存在,直接从缓存中取,不查数据库。 - @CachePut
修改:删除缓存中的内容(如果存在) - @CacheEvict
删除:同步删除缓存中的内容 - @Caching
组合:组合多个Cache注解使用
详细说明参考:https://blog.csdn.net/u012240455/article/details/80844361
3. 代码示例
具体看注释,测试代码时,可用软件 RedisDesktopManager 实时查看redis库里面的数据。
/**
* 给方法加缓存功能
* @return
*/
@GetMapping("/cache1")
@Cacheable(value = "test-cache1")
public String cache1() {
String cacheValue = "bigdata-cache1";
System.out.println("11111 第一次请求会打印这段话,之后就不会了,因为redis里面有了");
return cacheValue;
}
/**
* 给方法加缓存功能并指定key
* @param key
* @return
*/
@GetMapping("/cache2/{key}")
@Cacheable(value = "test-cache2", key = "#key")
public String cache2(@PathVariable String key) {
String cacheValue = key + "-bigdata-cache2 ";
System.out.println("22222 第一次请求会打印这段话,之后就不会打印,因为redis里面有了");
return cacheValue;
}
/**
* 更新缓存
* @param key
* @return
*/
@GetMapping("/cache3/{key}")
@CachePut(value = "test-cache2", key = "#key")
public String cache3(@PathVariable String key) {
String cacheValue = key + "-bigdata-cache3 ";
System.out.println("33333 每一次请求会打印这段话,为更新redis里面的数据");
return cacheValue;
}
/**
* 删除缓存
* @param key
* @return
*/
@GetMapping("/cache4/{key}")
@CachePut(value = "test-cache2", key = "#key")
public String cache4(@PathVariable String key) {
String cacheValue = key + "-bigdata-cache4 ";
System.out.println("4444 删除了redis里面的数据key="+key);
return cacheValue;
}
4. 直接操作redis
参考工具类com.bosssoft.bigdata.common.data.cache.RedisUtils
package com.bosssoft.bigdata.common.data.cache;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.CollectionUtils;
/**
* @author guanyuzhuang
* 基于spring和redis的redisTemplate工具类
* 针对所有的hash 都是以h开头的方法
* 针对所有的Set 都是以s开头的方法
* 针对所有的List 都是以l开头的方法
*/
public class RedisUtils {
private RedisTemplate redisTemplate;
public void setRedisTemplate(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
//=============================common============================
/**
* 指定缓存失效时间
*
* @param key 键
* @param time 时间(秒)
* @return
*/
public boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据key 获取过期时间
*
* @param key 键 不能为null
* @return 时间(秒) 返回0代表为永久有效
*/
public long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
/**
* 判断key是否存在
*
* @param key 键
* @return true 存在 false不存在
*/
public boolean hasKey(String key) {
try {
return redisTemplate.hasKey(key);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 删除缓存
*
* @param key 可以传一个值 或多个
*/
@SuppressWarnings("unchecked")
public void del(String... key) {
if (key != null && key.length > 0) {
if (key.length == 1) {
redisTemplate.delete(key[0]);
} else {
redisTemplate.delete(CollectionUtils.arrayToList(key));
}
}
}
//============================String=============================
/**
* 普通缓存获取
*
* @param key 键
* @return 值
*/
public Object get(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}
/**
* 普通缓存放入
*
* @param key 键
* @param value 值
* @return true成功 false失败
*/
public boolean set(String key, Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 普通缓存放入并设置时间
*
* @param key 键
* @param value 值
* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
* @return true成功 false 失败
*/
public boolean set(String key, Object value, long time) {
try {
if (time > 0) {
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
} else {
set(key, value);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 递增
*
* @param key 键
* @param delta 要增加几(大于0)
* @return
*/
public long incr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递增因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, delta);
}
/**
* 递减
*
* @param key 键
* @param delta 要减少几(小于0)
* @return
*/
public long decr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递减因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, -delta);
}
//================================Map=================================
/**
* HashGet
*
* @param key 键 不能为null
* @param item 项 不能为null
* @return 值
*/
public Object hget(String key, String item) {
return redisTemplate.opsForHash().get(key, item);
}
/**
* 获取hashKey对应的所有键值
*
* @param key 键
* @return 对应的多个键值
*/
public Map
4.1. 项目中使用RedisUtils工具类
代码示例如下:
@RestController("/test")
@AllArgsConstructor
public class TestController {
private final RedisUtils redisUtils;
@GetMapping("/cachex")
public String cacheRedis1() {
redisUtils.set("key11", "111");
return redisUtils.get("key11");
}
}