SpringBoot基礎架構篇3(Redis)
show me the code and talk to me,做的出來更要說的明白
我是布林bl,你的支援是我分享的動力!
1 引入
資料庫達到瓶頸,有什麼解決方法。 Redis 可以很好解決這個問題。那讓我們來學習如何在 SpringBoot 使用 Redis。
2 確保 redis 開啟
安裝步驟省略。。。具體可以參考網上教程。
2.1 測試
telnet IP地址 埠(預設6379)
2.2 開啟方法
如果上面方法沒有返回,需要手動開啟
- 找到 redis.conf 檔案,配置允許訪問的ip
find / -name redis.conf
- 開啟 redis.conf
找到 bind 127.0.0.1 改為 #bind 127.0.0.1 找到 protected-mode yes 改為 protected-mode no(redis3.2版本以後) 找到daemonize yes 改為 daemonize no
3.儲存退出
:wq
4 . 設定本地防火牆
如果有防火牆: iptables(Linux上常用的防火牆軟體)
iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT
service iptables save #儲存iptables規則
5 . 阿里云云主機
如果redis放在了阿里雲,需要新增安全組規則,自行百度
- 最後測試
telnet IP地址 埠(預設6379)
成功得到返回
3 redis 作用
我們知道 redis 可以輔助 mysql,那我們應該怎樣使用這個輔助呢?我這裡說的是常見的情況。當我們的資料庫達到瓶頸了,這個是前提。同時是讀多於寫的情況,我們就可以使用 redis 了。
如今前後端互動通過 JSON 交流。基於這點,我們一般把資料轉成 json ,然後再轉成字元的資料格式存在 redis 裡面。這裡 json 是不能直接存在 redis 裡面的。 因為 redis 沒有 json 的資料結構。
當我們取出資料的時候,資料是一堆 json 的字串,因此我們需要將資料轉成物件,然後通 過springboot 轉成 json 。
4 redis常用命令
redis 有五種資料結構
- String 字串
- List 集合
- Set 集合
- Hash 集合
- SortedSet 集合
常見的 String 字串使用(增查改刪)
set a 'a' get a set a 'b' del a
4 搭建環境
4.1 專案結構
├─java
│ └─com
│ └─example
│ └─lsbredistest
│ └─controller
│ └─entity
└─resources
├─static
└─templates
4.2 application.yml
首先我們需要配置 redis 連線的使用者名稱密碼
### redis 快取配置
spring:
redis:
database: 0
host: ip
port: 6379
password: 123456
4.3 RedisController
核心程式碼
@RestController
@RequestMapping("/lsbredis")
public class RedisController {
@Resource
private StringRedisTemplate stringRedisTemplate;
@RequestMapping("/test")
public void test(){
// key : a value: a
// 增
stringRedisTemplate.opsForValue().set("a","a");
// 查
String a = stringRedisTemplate.opsForValue().get("a");
System.out.println("a的值:"+a);
// 改
stringRedisTemplate.opsForValue().set("a","b");
// 快取一個物件
List<User> list = new ArrayList<>();
list.add(new User(1l, "c1",1, "s1"));
list.add(new User(2l, "c2",2, "s2"));
list.add(new User(3l, "c3",3, "s3"));
Gson gson = new Gson();
String toJson = gson.toJson(list);
stringRedisTemplate.opsForValue().set("user",toJson);
}
}
注入配置
不知有沒有發現我們沒有配置 redis 的注入。究竟 redis 的如何自動注入的?通過查詢程式碼,我們可以發現 redis 已經通過 Springboot 自己在內部設定了。
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
上面的程式碼就是 Redis 的注入配置。省去了我們再去編寫程式碼。贊!
5 原始碼
https://github.com/buerbl/learnSpringboot/tree/master/lsb-redistest
6 深入一層
redis 快取可以減輕資料庫壓力,有什麼方法可以減輕 redis 壓力呢?
答案是當然有。我們可以使用 Guava做本地快取,減輕 redis 壓力,同時加快反問速度。
當然加本地快取也情況。單機環境下,加本地快取比較簡單,但是分散式環境下,加本地快取,當我們的快取更新的時候,我們需要額外處理其他機器的本地快取,不然資料就一致了。我們利用 redis的pub/sub 機制,對其他機器的本地快取進行刪除。
關注微信公眾號,隨時移動端閱讀