show me the code and talk to me,作的出來更要說的明白
我是布爾bl,你的支持是我分享的動力!java
數據庫達到瓶頸,有什麼解決方法。 Redis 能夠很好解決這個問題。那讓咱們來學習如何在 SpringBoot 使用 Redis。mysql
安裝步驟省略。。。具體能夠參考網上教程。git
telnet IP地址 端口(默認6379)
複製代碼
若是上面方法沒有返回,須要手動開啓github
find / -name 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.保存退出redis
:wq
複製代碼
4 . 設置本地防火牆spring
若是有防火牆: iptables(Linux上經常使用的防火牆軟件)sql
iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT
service iptables save #保存iptables規則
複製代碼
5 . 阿里云云主機數據庫
若是redis放在了阿里雲,須要添加安全組規則,自行百度json
telnet IP地址 端口(默認6379)
複製代碼
成功獲得返回後端
咱們知道 redis 能夠輔助 mysql,那咱們應該怎樣使用這個輔助呢?我這裏說的是常見的狀況。當咱們的數據庫達到瓶頸了,這個是前提。同時是讀多於寫的狀況,咱們就可使用 redis 了。
現在先後端交互經過 JSON 交流。基於這點,咱們通常把數據轉成 json ,而後再轉成字符的數據格式存在 redis 裏面。這裏 json 是不能直接存在 redis 裏面的。 由於 redis 沒有 json 的數據結構。
當咱們取出數據的時候,數據是一堆 json 的字符串,所以咱們須要將數據轉成對象,而後通 過springboot 轉成 json 。
redis 有五種數據結構
常見的 String 字符串使用(增查改刪)
set a 'a'
get a
set a 'b'
del a
複製代碼
4 搭建環境
├─java
│ └─com
│ └─example
│ └─lsbredistest
│ └─controller
│ └─entity
└─resources
├─static
└─templates
複製代碼
首先咱們須要配置 redis 鏈接的用戶名密碼
### redis 緩存配置
spring:
redis:
database: 0
host: ip
port: 6379
password: 123456
複製代碼
核心代碼
@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 的注入配置。省去了咱們再去編寫代碼。贊!
redis 緩存能夠減輕數據庫壓力,有什麼方法能夠減輕 redis 壓力呢?
答案是固然有。咱們可使用 Guava作本地緩存,減輕 redis 壓力,同時加快反問速度。
固然加本地緩存也狀況。單機環境下,加本地緩存比較簡單,可是分佈式環境下,加本地緩存,當咱們的緩存更新的時候,咱們須要額外處理其餘機器的本地緩存,否則數據就一致了。咱們利用 redis的pub/sub 機制,對其餘機器的本地緩存進行刪除。