1. 程式人生 > >Spring boot redis的使用(一)

Spring boot redis的使用(一)

package com.zxl.examples.service;

import com.zxl.examples.catche.customannotation.UserSaveCache;
import com.zxl.examples.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * Created by Administrator on 2017/7/24.
 */
@Service("userSerivce")
public class UserSerivceImpl {
    @Autowired
    UserRepository userRepository;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedisTemplate redisTemplate;

    //unless-->用於否決快取更新的,不像condition,該表達只在方法執行之後判斷,此時可以拿到返回值result進行判斷了
    @Cacheable(value="userCache",key="'user:'+#username",unless = "#result==null")
    public User getUserByUsername(String username){
        User user = null;
        List userlist = userRepository.findByUsername(username);
        if(userlist!=null && userlist.size()>0){
            user = userlist.get(0);
        }
        return user;
    }
//    @Cacheable(value="userCache#120",key="'user:'+#username",unless = "#result==null")
//    public User getUserByUsername(String username){
//        User user = null;
//        List userlist = userRepository.findByUsername(username);
//        if(userlist!=null && userlist.size()>0){
//            user = userlist.get(0);
//        }
//        return user;
//    }

    //allEntries-->是否移除所有資料
    //beforeInvocation-->是呼叫方法之前移除/還是呼叫之後移除
    @CacheEvict(value = "userCache",key="'user:'+#user.username")
    public void delUserById(User user){
        userRepository.delete(user);
    }

    public String setUserInRedis(){
        stringRedisTemplate.opsForValue().set("abc","123",60L, TimeUnit.SECONDS);
        return stringRedisTemplate.opsForValue().get("abc");
//        redisTemplate.opsForList();//可直接放入實現序列化的pojo
    }

    public void delUserInRedis(){
        stringRedisTemplate.delete("abc");
    }

    //condition-->滿足快取條件的資料才會放入快取,condition在呼叫方法之前和之後都會判斷
    @CachePut(value="userCache",key = "#user.username",condition = "#user.username<='100'")
    public User save(User user){
        userRepository.save(user);
        return user;
    }

    @Caching(
            put={
                    @CachePut(value = "userCache", key = "'user:'+#user.id"),
                    @CachePut(value = "userCache", key = "'user:'+#user.username")
            }
    )
    public User addUser(User user){
        userRepository.save(user);
        return user;
    }

    @UserSaveCache
    public User addUser2(User user){
        userRepository.save(user);
        return user;
    }

    @Cacheable(value="userCache",key="'user:'+#username",condition = "#root.target.canCache()",unless = "#result==null")
    public User getUserByUsername2(String username){
        User user = null;
        List userlist = userRepository.findByUsername(username);
        if(userlist!=null && userlist.size()>0){
            user = userlist.get(0);
        }
        return user;
    }

    @Cacheable(value="userCache",key="'user:'+#username",condition = "#root.target.notCache()")
    public User getUserByUsername3(String username){
        User user = null;
        List userlist = userRepository.findByUsername(username);
        if(userlist!=null && userlist.size()>0){
            user = userlist.get(0);
        }
        return user;
    }

    public boolean canCache(){
        return true;
    }

    public boolean notCache(){
        return false;
    }
}