Redis緩存的使用

源碼地址:https://github.com/bigBigRiver/redis.git

爲什麼要使用Redis緩存?

1、在高頻訪問數據庫的情況下,緩解數據庫的壓力。

2、讀取速度快。

流程是怎麼樣的?

1、當有查詢請求的時候,先是訪問Redis,如果Redis中有數據則直接返回,不需要訪問數據庫。如果沒有,則訪問數據庫,將查詢結果返回並在Redis中緩存起來,下一次訪問就可以直接在Redis中讀取了。

2、當有更新請求(包括插入)的時候,會同時更新數據庫和Redis緩存,保持緩存和數據庫一直。

 

Windows下,Redis的使用(僅限開發的時候使用,因爲服務器基本都是用linux系統的)

下載地址:https://github.com/MicrosoftArchive/redis/releases

我下載的是Redis-x64-3.2.100.zip,解壓之後cd進入Redis目錄。 

1、輸入redis-server redis.windows.conf,Redis服務就啓動好了。(窗口需要一直開着)

2、再新打開一個cmd窗口(Redis客戶端),進入Redis目錄,輸入redis-cli -h 127.0.0.1 -p 6379,即可連接成功。

3、如果需要修改默認端口號,打開redis.windows.conf文件,找到port 6379修改即可。

4、如果需要做成windows服務,輸入 redis-server --service-install redis.windows.conf即可。

5、如果需要安裝Redis可視化軟件Redis Desktop Manager,參考:https://www.jianshu.com/p/ccc3ebe29f7b

常用命令:

卸載服務:redis-server --service-uninstall
開啓服務:redis-server --service-start
停止服務:redis-server --service-stop

 

Linux下,Redis的使用(CentOS7爲例)

1、下載、解壓、編譯Redis

$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
$ tar xzf redis-5.0.5.tar.gz
$ cd redis-5.0.5
$ make

2、進入到解壓後的 src 目錄,通過如下命令啓動Redis:(注意,不需要進入src目錄)

$ src/redis-server

3、使用內置客戶端連接測試

[root@VM_16_13_centos redis-5.0.5]# src/redis-cli
127.0.0.1:6379> ping
PONG

4、解除Redis的保護模式,這樣其他計算機就可以連接了。

127.0.0.1:6379> CONFIG SET protected-mode no
OK

5、linux下,啓動Redis之後的窗口是可以關閉的。可以使用ps -ef|grep redis查看redis服務對應的進程信息。 

 

下面是Redis Desktop Manager可視化軟件的截圖,管理Windows上和Linux上的Redis都非常方便,推薦使用!

 

以上是環境的介紹,下面開始介紹Redis緩存的使用

1、添加依賴,配置application.yml文件

springboot項目已經加入了Redis緩存的依賴了。

spring:
  redis:
    host: 127.0.0.1
    port: 6379

2、在Application類上加入@EnableCaching

@SpringBootApplication
@EnableCaching
public class RedisApplication {

    public static void main(String[] args) {
        SpringApplication.run(RedisApplication.class, args);
    }

}

3、@Cacheable註解的使用

作用(文章開頭流程的第一條):當有查詢請求的時候,先是訪問Redis,如果Redis中有數據則直接返回,不需要訪問數據庫。如果沒有,則訪問數據庫,將查詢結果返回並在Redis中緩存起來,下一次訪問就可以直接在Redis中讀取了。

/**
 * @author river
 * 2020/1/22
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    UserService userService;

    @GetMapping("/findByUserNameLike")
    @Cacheable(cacheNames = "user", key = "'river'+666")
    public List<User> findByUserNameLike(String userName) {
        String name = userName + "%";
        return userService.findByUserNameLike(name);
    }

}

用debug模式,在String name這句打斷點。第一次訪問findByUserNameLike接口的時候會進入斷點,第二次訪問的時候就不會進入斷點了,因爲訪問的是Redis緩存了。在Redis中對應的存儲結構如下圖:

4、@CachePut註解的使用

作用(流程的第二條):將數據寫入緩存中。

/**
 * @author river
 * 2020/1/22
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserRepository userRepository;

    @Override
    public List<User> findByUserNameLike(String userName) {
        return userRepository.findByUserNameLike(userName);
    }

    @Override
    @Cacheable(cacheNames = "user", key = "'userInfo'")
    public User findByUserName(String userName) {
        return userRepository.findByUserName(userName);
    }

    @Override
    @CachePut(cacheNames = "user", key = "'userInfo'")
    public User saveOrUpdateUser(User user) {
        return userRepository.save(user);
    }
}

看到saveOrUpdateUser()這個方法標有註解@CachePut,更新數據庫的同時寫入Redis緩存中。這樣當查詢到新增的數據時,可以直接從緩存中取出。如果沒有了@CachePut,調用findByUserName將拿到舊的緩存數據。

5、避免拿到舊的緩存數據,還可以使用@CacheEvict註解刪除相應的緩存。

    @Override
    @CacheEvict(cacheNames = "user", key = "'userInfo'")
    public User saveOrUpdateUser(User user) {
        return userRepository.save(user);
    }

修改saveOrUpdateUser()方法,凡是修改信息的時候,刪除相應的緩存。具體使用@CacheEvict還是@CachePut,要根據項目需要靈活使用。

6、使用@CacheConfig,簡寫代碼

/**
 * @author river
 * 2020/1/22
 */
@Service
@CacheConfig(cacheNames = "user")
public class UserServiceImpl implements UserService {

    @Autowired
    UserRepository userRepository;

    @Override
    public List<User> findByUserNameLike(String userName) {
        return userRepository.findByUserNameLike(userName);
    }

    @Override
    @Cacheable(key = "'userInfo'")
    public User findByUserName(String userName) {
        return userRepository.findByUserName(userName);
    }

    @Override
    @CacheEvict(key = "'userInfo'")
    public User saveOrUpdateUser(User user) {
        return userRepository.save(user);
    }
}

7、@Cacheable註解的補充

此註解還有兩個常用屬性,condition和unless,修改的代碼如下:

    @GetMapping("/findByUserNameLike")
    @Cacheable(cacheNames = "user", key = "'river'+666", condition = "#userName.length() > 5", unless = "#result.size()>0")
    public List<User> findByUserNameLike(String userName) {
        String name = userName + "%";
        return userService.findByUserNameLike(name);
    }

說明:

1、condition屬性中的意思是,需要查詢字符串userName的長度大於5纔會緩存查詢結果。

2、unless屬性中的意思是,除非查詢結果集的大小爲0,其他情況都緩存查詢結果。(即沒有查到數據不需要緩存的意思)

這兩個屬性分別是對輸入和輸出做一個過濾的作用。

3、返回的json串中,如果不想要顯示某個字段,加上@JsonIgnore即可。

4、以上兩個屬性使用的是Spring EL表達式,有興趣的可以研究研究!

 

覺得有用的老鐵贊一下唄~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章