springboot2.x 使用redis (入門)


在使用之前先簡單介紹一下,redis和mongoDB這兩個nosql的區別以及使用場景。

1. redis

redis是一個分布式緩存、高性能的key-value數據庫。支持存儲的value類型包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。數據操作在內存中,因此效率非常高。可以持久化到磁盤,所以在對不同數據集進行高速讀寫時需要權衡內存,因為數據量不能大於硬件內存。

2. mongoDB

mongoDB 是一種文檔性的數據庫。先解釋一下文檔的數據庫,即可以存放xml、json、bson類型系那個的數據。這些數據具備自述性(self-describing),呈現分層的樹狀數據結構。支持豐富的查詢語句。

使用場景總結

  • mongodb 更偏向保存數據,而 redis 更偏向保持狀態。

  • 業務數據量小且對效率有要求用redis.

  • mongoDB用於對海量數據的操作性能提升。

最簡單的就這幾點,最最重要的是你要知道一個叫緩存,一個是數據庫。想清楚了就理解了。
這些都是個人理解,關於事務方面的,雖然redis支持,但很弱,真正涉及到事務的場景基本不會用它的。

接下來,進入正題,首先你的機器上要先安裝redis,建議用docker.

docker使用redis

  1. 獲取redis鏡像
    執行命令docker pull redis

  2. 運行redis 並進行端口映射和持久化存儲

docker run -d --name myredis -p6379:6379 -v /d/dockerdata/redis/data:/data redis --appendonly yes

參數說明:

  • -d ——后台運行

  • -name —— 運行后容器的名字

  • -p 6379:6379 —— 端口映射,默認端口

  • -v /d/dockerdata/redis/data:/data —— 保存數據的位置。

  • redis –appendonly yes —— 在容器執行redis啟動命令,並打開redis持久化配置。

有可能會提示輸入Windows密碼,或者提示找不到文件存儲目錄,正常輸入密碼,指定位置創建文件夾就好。

  1. 測試運行是否成功
PS C:\Users\Gyyyang> docker exec -it myredis redis-cli
127.0.0.1:6379> info
# Server
redis_version:5.0.6
redis_git_sha1:00000000
......

spring boot項目中使用redis

1.添加 Redis 依賴

Spring Boot 官方已經為我們提供好了集成 Redis 的 Starter,我們只需要簡單地在 pom.xml 文件中添加如下代碼即可。

<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>

2.配置 Redis

spring:
    redis:
        host: 192.168.2.28
        port: 6379
        database: 0 # 數據庫索引,默認是0
        password:   # Redis 服務器連接密碼(默認為空)
        # 在2.0后 redis 底層已經默認修改為使用的是 Lettuce 而不是 Jedis 作為 Redis 驅動程序,但是仍然支持 Jedis,配置用法一致
        lettuce:  
          pool:
            max-active: 8  #連接池最大連接數(使用負值表示沒有限制)
            max-wait: -1   # 連接池最大阻塞等待時間(使用負值表示沒有限制)
            max-idle: 8    # 連接池中的最大空閑連接
            min-idle: 0    # 連接池中的最小空閑連接
        timeout: 0       # 連接超時時間(毫秒)

Spring Bootspring-boot-starter-data-redisRedis 的相關操作提供了一個高度封裝的 RedisTemplate 類,而且對每種類型的數據結構都進行了歸類,將同一類型操作封裝為 operation 接口。RedisTemplate 對五種數據結構分別定義了操作,如下所示:

  • 操作字符串:redisTemplate.opsForValue()

  • 操作 Hash:redisTemplate.opsForHash()

  • 操作 List:redisTemplate.opsForList()

  • 操作 Set:redisTemplate.opsForSet()

  • 操作 ZSet:redisTemplate.opsForZSet()

但是對於 string 類型的數據,Spring Boot 還專門提供了 StringRedisTemplate 類,而且官方也建議使用該類來操作 String 類型的數據。那么它和 RedisTemplate 又有啥區別呢?

  1. RedisTemplate 是一個泛型類,而 StringRedisTemplate 不是,后者只能對鍵和值都為 String 類型的數據進行操作,而前者則可以操作任何類型。

  2. 兩者的數據是不共通的,StringRedisTemplate 只能管理 StringRedisTemplate 里面的數據,RedisTemplate 只能管理 RedisTemplate 中 的數據。

RedisTemplate 的配置

一個 Spring Boot 項目中,我們只需要維護一個 RedisTemplate 對象和一個 StringRedisTemplate 對象就可以了。所以我們需要通過一個 Configuration 類來初始化這兩個對象並且交由的 BeanFactory 管理。在 config 包下面新建了一個 RedisConfig 類,其內容如下所示:

@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig {
 
    @Bean
    @ConditionalOnMissingBean(name = "redisTemplate")
    public RedisTemplate<String, Object> redisTemplate(
            RedisConnectionFactory redisConnectionFactory) {
 
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
 
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(jackson2JsonRedisSerializer);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashKeySerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
 
    @Bean
    @ConditionalOnMissingBean(StringRedisTemplate.class)
    public StringRedisTemplate stringRedisTemplate(
            RedisConnectionFactory redisConnectionFactory) {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

其中@Configuration 代表這個類是一個配置類,然后@AutoConfigureAfter(RedisAutoConfiguration.class) 是讓我們這個配置類在內置的配置類之后在配置,這樣就保證我們的配置類生效,並且不會被覆蓋配置。其中需要注意的就是方法名一定要叫redisTemplate 因為@Bean注解是根據方法名配置這個beanname的。

測試

新建一個實體類:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
    private static final Long  serialVersionUID = 111111111L;
    private String username;
    private String password;
    private Integer age;
​
    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }
}

測試代碼:

@SpringBootTest
class BootApplicationTests {
​
@Autowired
private RedisTemplate redisTemplate;
​
@Autowired
private StringRedisTemplate stringRedisTemplate;
    @Test
    void contextLoads() {
        String key = "name";
        stringRedisTemplate.opsForValue().set(key, "hai");
        String value = stringRedisTemplate.opsForValue().get(key);
​
        System.out.println(key + "----" + value);
​
        User user =new User();
        user.setUsername("yang");
        user.setPassword("ssss");
        user.setAge(12);
        String userKey = "yang";
        redisTemplate.opsForValue().set(userKey,user);
        User newUser = (User) redisTemplate.opsForValue().get(userKey);
        System.out.println("獲取緩存中key為" + userKey + "的值為:" + newUser);
    }
}

測試結果:

name----hai
獲取緩存中key為yang的值為:User{username='yang', password='ssss', age=12}

其他數據類型操作類似,就不一一列舉了,也可以下載一個可視化工具查看一下緩存。

文章內容純屬個人理解,可能存在錯誤,望及時指出,希望對你有用。


免責聲明!

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



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