基本使用:

首先需要注入 RedisTemplate:

@Autowired
private RedisTemplate redisTemplate;

RedisTemplate 中定义了五种操作数据结构的方法:

用于操作字符串:

redisTemplate.opsForValue();

用于操作 Hash:

redisTemplate.opsForHash();

用于操作 List:

redisTemplate.opsForList();

用于操作 Set:

redisTemplate.opsForSet();

用于操作有序 Set(ZSet):

redisTemplate.opsForZSet();

简单的使用方法:.set(key,value),.get(key):

拿操作字符串举个例子:

redisTemplate.opsForValue().set("name","williamszhang");
System.out.println(redisTemplate.opsForValue.get("name"));

redisTemplate.opsForValue().set 方法将 williamszhang 存入 redis,以 email 为键,williamszhang 为值。

打印输出的就是 key 对应的值 willliamszhang。

其中如果多次进行 set 存值,那么之前的值会被覆盖

除了操作数据结构,redis 还可以用于操作实体:

@Autowired
private RedisTemplate redisTemplate;

@Test
public void testObj(){
    User user=new User("1175137542@qq.com", 18, "williamszhang", "123456","2019-01-01");
    ValueOperations<String, User> operations=redisTemplate.opsForValue();
    operations.set("userInfo", user);
    User u=operations.get("userInfo");
    System.out.println("user: "+u.toString());
}

输出结果:

user: [email = 1175137542@qq.com, age = 18, name = williamszhang, password = 123456, createTime = 2019-01-01]

redis 还可以设置超时失效

redis 在存入数据的时候可以设置一个超时时间,过了这个时间就自动删除数据,这种特性可以用于缓存。

redisTemplate.opsForValue().set("name","williamszhang",24,TimeUnit.HOURS);

后面两个参数的意思就是,设置有效时间为 24 ,单位为小时。即此数据在 redis 中存放一天就会自动删除。

常用的颗粒度如下:

TimeUnit.DAYS          //天
TimeUnit.HOURS         //小时
TimeUnit.MINUTES       //分钟
TimeUnit.SECONDS       //秒
TimeUnit.MILLISECONDS  //毫秒

删除 redis 中的数据:

@Test
public void testDelete() {
    ValueOperations<String, User> operations=redisTemplate.opsForValue();
    redisTemplate.opsForValue().set("name", "williamszhang");
    redisTemplate.delete("deletekey");
    boolean exists=redisTemplate.hasKey("name");
    if(exists){
    	System.out.println("exists is true");
    }
    else{
    	System.out.println("exists is false");
    }
}

输出结果:exists is false,表明数据已从 redis 中删除

封装到 Service 层:

实际应用中,如果很多的类需要使用到 redis 缓存,每一个类都注入 RedisTemplate 过于冗余,一般都会将其封装到 service 层,而对外只提供一个接口。

代码如下:

封装插入,即代替 redisTemplate.opsForValue().set

@Service
public class RedisService {
    private Logger logger = LoggerFactory.getLogger(RedisService.class);
    @Autowired
    private RedisTemplate redisTemplate;

    public boolean set(final String key, Object value) {
        boolean result = false;
        try {
            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
            operations.set(key, value);
            result = true;
        } catch (Exception e) {
            logger.error("set error: key {}, value {}",key,value,e);
        }
        return result;
    }

封装查询

public Object get(final String key) {
    Object result = null;
    ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
    result = operations.get(key);
    return result;
}

封装删除

public void remove(final String key) {
    if (exists(key)) {
    	redisTemplate.delete(key);
    }
}

Controller 层调用:

@Autowired
private RedisService redisService;

public void testString() throws Exception {
	redisService.set("name", "williamszhang");
    System.out.println(redisService.get("name"));
}