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 開啟方法

如果上面方法沒有返回,需要手動開啟

  1. 找到 redis.conf 文件,配置允許訪問的ip
find / -name redis.conf
  1. 打開 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放在了阿里雲,需要添加安全組規則,自行百度

  1. 最后測試
 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 機制,對其他機器的本地緩存進行刪除。

關注微信公眾號,隨時移動端閱讀

公眾號.jpg)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM