[TOC]java
Redis 是一個開源的使用 ANSI C 語言編寫、遵照 BSD 協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value 數據庫,並提供多種語言的 API的非關係型數據庫(NoSQL)。git
PS: 我這裏是基於Mac環境,Windows環境下的同窗能夠安裝Linux虛擬機同步進行操做。github
tar -zxvf redis-5.0.4.tar.gz mv redis-5.0.4 /usr/local/ cd /usr/local/redis-5.0.4/ make test
執行到這裏,最好先執行一遍make test,確保編譯能夠經過,須要大概三分鐘。
到這個就說明測試經過了。咱們接着往下執行redis
make cd src/ make install
執行到這裏安裝就算是告一段落了,接下來咱們進行redis的一些配置:spring
vim ../redis.conf
找到136行左右的daemonize
將其屬性改成yes,可讓redis在後臺運行,而後找到500行左右的requirepass
,後面輸入咱們須要設置的密碼,這樣就能夠經過密碼來訪問redis了。
而後咱們經過指定配置文件的方式來啓動redis數據庫
./redis-server ../redis.conf
執行完事兒以後,查看是否執行成功:apache
ps -ef | grep redis
能夠看到,咱們的redis已經啓動成功了,而後經過rdm來訪問一下:vim
大功告成,如今萬事俱備,只欠東風。咱們下面來看一下在Spring Boot中怎麼使用redis吧。緩存
Spring Boot給咱們提供了現成的spring-boot-starter-data-redis
,咱們只須要在pom文件中將之導入便可。bash
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 建立鏈接池 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency>
而後,咱們須要在配置文件中配置一些有關redis的信息:
spring: redis: host: 127.0.0.1 # IP port: 6379 # 端口號 password: 123456 # 密碼 lettuce: pool: max-active: 8 # 鏈接池最大鏈接數 max-wait: -1ms # 鏈接池最大阻塞等待時間(使用負值表示沒有限制) min-idle: 0 # 鏈接池中的最小空閒鏈接 max-idle: 8 # 鏈接池中的最大空閒鏈接
接下來,咱們須要對咱們所須要的Redis的操做給封裝到一個接口中,方便咱們去調用,這裏我基於接口,抽象類,實現類的結構實現了一套Redis的方法,須要的同窗能夠去GitHub上下載(子項目名稱:viboot-rds),GitHub的地址在文末。這裏僅僅貼出接口的部分方法。
package com.itframe.dao; import java.util.List; import java.util.Map; import java.util.Set; /** * */ public interface RedisDao { /** * 判斷緩存中是否有對應的value * * @param key * @return boolean */ public boolean existsKey(Object key); /** * 根據key獲取key列表(key值可爲模糊匹配---taskInfo:taskDetail:* <---> *表明任意字符) * * @param pattern * @return Set<Object> */ public Set<Object> keys(Object pattern); /** * 根據key刪除對應的value * * @param key */ public boolean delete(Object key); /** * 根據key獲取個數 * * @param key */ public int count(Object key); /** * 批量刪除對應的value * * @param keys */ public void delete(String[] keys); /** * 批量刪除key(key值可爲模糊匹配---taskInfo:taskDetail:* <---> *表明任意字符) * * @param pattern */ public long deletePattern(Object pattern); /** * 批量刪除對應的value * * @param keys */ public long delete(Set<Object> keys); /** * 寫入緩存(操做字符串) * * @param key * @param value * @return boolean */ public boolean vSet(Object key, Object value); /** * 寫入緩存設置時效時間(操做字符串) * * @param key * @param value * @return boolean */ public boolean vSet(Object key, Object value, Long expireTime); /** * 更新寫入緩存設置時效時間(操做字符串) * * @param key * @return boolean */ public boolean vSetUpdate(Object key, Long expireTime); /** * 讀取緩存(操做字符串) * * @param key * @return Object */ public Object vGet(Object key); /** * 哈希 添加(操做hash) * * @param key * @param hashKey * @param value */ public void hmSet(Object key, Object hashKey, Object value); /** * 哈希 添加(操做hash) * * @param key * @param map */ public void hmSetAll(Object key, Map<Object, Object> map); /** * 哈希獲取數據(操做hash) * * @param key * @return Map<Object, Object> */ public Map<Object, Object> hmGet(Object key); /** * 哈希獲取數據(操做hash) * * @param key * @param hashKey * @return Object */ public Object hmGet(Object key, Object hashKey); /** * 哈希刪除數據(操做hash) * * @param key * @param hashKey * @return Object */ public Object hmDel(Object key, Object hashKey); }
在抽象類中咱們進行了RedisTemplate
的初始化以及序列化:
public abstract class AbstractBaseRedisDao<K, V> { @Resource(name = "redisTemplate") protected RedisTemplate<K, V> redisTemplate; /** * 設置redisTemplate * * @param redisTemplate */ public void setRedisTemplate(RedisTemplate<K, V> redisTemplate) { this.redisTemplate = redisTemplate; } /** * 獲取 RedisSerializer */ protected RedisSerializer<String> getRedisSerializer() { return redisTemplate.getStringSerializer(); } }
在實現類中咱們經過操做RestTemplate來實現接口中的方法~
首先,咱們若是想在Spring Boot項目中啓用緩存,須要在啓動類上加上註解@EnableCaching
,這個是重點,要記住了!
首先介紹一下註解三劍客:@Cacheable
, @CachePut
,@CacheEvict
。
@Cacheable
:主要針對方法配置,可以根據方法的請求參數對其進行緩存,經常使用於查詢操做 @CachePut
:主要針對方法配置,可以根據方法的請求參數對其進行緩存,經常使用於修改操做@CacheEvict
:清空緩存,主要用於刪除操做。下面咱們來看一下用法:
/** * value: 緩存的名稱 * key: 緩存的鍵 * return 緩存的值 */ @Override @Cacheable(value = "users", key = "#id") public UserDO findOne(Long id) { // 若是咱們第二次訪問的時候,控制檯沒有打印出這句話說明是從緩存中取出 log.info("From MYSQL"); return userMapper.get(id); } @Override @CachePut(value = "users", key = "#userDO.id") public UserDO update(UserDO userDO) { // 執行以後,再次訪問findOne的時候,應當沒有打印出「From MySQL」,且返回的是咱們修改後的值,說明這一步緩存成功 if (userMapper.update(userDO) > 0) { return userMapper.get(userDO.getId()); } return null; } @Override @CacheEvict(value = "users", key = "#id") public int delete(Long id) { // 執行以後去rdm中查看便可 return userMapper.delete(id); }
第一次訪問findOne
第二次訪問findOne:
仍然是剛剛的結果,可是控制檯沒有打印出任何東西,說明緩存成功
調用update後再次調用findOne:
能夠看出信息已被修改且未訪問數據庫
訪問delete,查看rdm:
說明刪除成功~
記得順手點個star,您的確定是對我寫做最大的動力!
原創文章,文筆有限,才疏學淺,文中如有不正之處,萬望告知