1. 程式人生 > >Spring boot系列--redis使用之1

Spring boot系列--redis使用之1

簡介

在網際網路的應用中,redis被廣泛地使用。而在spring boot中使用redis,是非常簡單的。

spring boot 中的redis

要在spring boot中使用redis,在pom中加入spring-boot-starter-redis依賴。maven會新增spring-data-redis包,其中包含了jedis,jredis,lettuce,srp幾種實現。spring boot預設選擇jedis實現使用。

jedis配置

預設使用localhost的redis配置,如果你沒有修改任何配置,在本機上測試,不需要做任何配置。但在生成環境,必須配置真實的環境。

spring:
    # REDIS (RedisProperties)
    redis:
        # Redis資料庫索引(預設為0)    
        database:0
        # Redis伺服器地址
        host:localhost
        # Redis伺服器連線埠
        port:6379
        # Redis伺服器連線密碼(預設為空)
        password:
        # 連線池最大連線數(使用負值表示沒有限制)
        pool.max-active:8
        # 連線池最大阻塞等待時間(使用負值表示沒有限制)
pool.max-wait:-1 # 連線池中的最大空閒連線 pool.max-idle:8 # 連線池中的最小空閒連線 pool.min-idle:0 # 連線超時時間(毫秒) timeout:0

使用StringRedisTemplate來處理String

在spring-data-redis中提供了StringRedisTemplate,可以直接用來處理String資料了。

// 可以直接使用,spring會繫結 
@Autowired
private StringRedisTemplate template;

@RequestMapping("/foo"
) @ResponseBody public String foo() { ValueOperations<String, String> ops = template.opsForValue(); String key = "spring.boot.redis.test"; if (!this.template.hasKey(key)) { String str = "not found the key, now set it"; log.info(str); ops.set(key, str); return str; } else { String str = "Found key " + key + ", value=" + ops.get(key); log.info(str); return str; } }

可以看一下spring中的實現類:

/*
 * Copyright 2011-2013 the original author or authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.data.redis.core;

import org.springframework.data.redis.connection.DefaultStringRedisConnection;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.StringRedisConnection;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * String-focused extension of RedisTemplate. Since most operations against Redis are String based, this class provides
 * a dedicated class that minimizes configuration of its more generic {@link RedisTemplate template} especially in terms
 * of serializers.
 * <p/>
 * Note that this template exposes the {@link RedisConnection} used by the {@link RedisCallback} as a
 * {@link StringRedisConnection}.
 * 
 * @author Costin Leau
 */
public class StringRedisTemplate extends RedisTemplate<String, String> {

    /**
     * Constructs a new <code>StringRedisTemplate</code> instance. {@link #setConnectionFactory(RedisConnectionFactory)}
     * and {@link #afterPropertiesSet()} still need to be called.
     */
    public StringRedisTemplate() {
        RedisSerializer<String> stringSerializer = new StringRedisSerializer();
        setKeySerializer(stringSerializer);
        setValueSerializer(stringSerializer);
        setHashKeySerializer(stringSerializer);
        setHashValueSerializer(stringSerializer);
    }

    /**
     * Constructs a new <code>StringRedisTemplate</code> instance ready to be used.
     * 
     * @param connectionFactory connection factory for creating new connections
     */
    public StringRedisTemplate(RedisConnectionFactory connectionFactory) {
        this();
        setConnectionFactory(connectionFactory);
        afterPropertiesSet();
    }

    protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {
        return new DefaultStringRedisConnection(connection);
    }
}

在實現中,RedisTemplate和其子類中包含了幾種不同的Serializer,分別對應Key,Value,Hash……,而最簡單的String型別,在stringSerializer變數上例項化為StringRedisSerializer。

public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware {

    private boolean enableTransactionSupport = false;
    private boolean exposeConnection = false;
    private boolean initialized = false;
    private boolean enableDefaultSerializer = true;
    private RedisSerializer<?> defaultSerializer;
    private ClassLoader classLoader;

    private RedisSerializer keySerializer = null;
    private RedisSerializer valueSerializer = null;
    private RedisSerializer hashKeySerializer = null;
    private RedisSerializer hashValueSerializer = null;
    private RedisSerializer<String> stringSerializer = new StringRedisSerializer();

 ...

 /**
   * Constructs a new <code>RedisTemplate</code> instance.
   */
    public RedisTemplate() {}

    public void afterPropertiesSet() {

        super.afterPropertiesSet();

        boolean defaultUsed = false;

        if (defaultSerializer == null) {

            defaultSerializer = new JdkSerializationRedisSerializer(
                    classLoader != null ? classLoader : this.getClass().getClassLoader());
        }

        if (enableDefaultSerializer) {

            if (keySerializer == null) {
                keySerializer = defaultSerializer;
                defaultUsed = true;
            }
            if (valueSerializer == null) {
                valueSerializer = defaultSerializer;
                defaultUsed = true;
            }
            if (hashKeySerializer == null) {
                hashKeySerializer = defaultSerializer;
                defaultUsed = true;
            }
            if (hashValueSerializer == null) {
                hashValueSerializer = defaultSerializer;
                defaultUsed = true;
            }
        }

        if (enableDefaultSerializer && defaultUsed) {
            Assert.notNull(defaultSerializer, "default serializer null and not all serializers initialized");
        }

        if (scriptExecutor == null) {
            this.scriptExecutor = new DefaultScriptExecutor<K>(this);
        }

        initialized = true;
    }

} 

可以看到spring boot應用在啟動時,如果沒有檢查到對應的物件配置,則最後例項化defaultSerializer物件為JdkSerializationRedisSerializer了。

可以看一下執行時的物件
StringRedisTemplate物件例項

使用RedisTemplate

在程式中使用 RedisTemplate,如上所說,需要配置對應的serializer,否則對對應的資料處理時,要麼serializer物件為null,要麼使用的預設的則使用JdkSerializationRedisSerializer。

要配置我們的redisTemplate物件,可以在配置類中定義一個redisTemplate 的bean。

@Bean  
    public RedisTemplate<String, ? extends Object> redisTemplate(  
            RedisConnectionFactory factory) {  
        StringRedisTemplate template = new StringRedisTemplate(factory);  
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);  
        ObjectMapper om = new ObjectMapper();  
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);  
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);  
        jackson2JsonRedisSerializer.setObjectMapper(om);  
        template.setValueSerializer(jackson2JsonRedisSerializer);  
        template.afterPropertiesSet();  
        return template;  
    } 

在配置類中,定義了Jackson2JsonRedisSerializer,來作為ValueSerializer物件,對Model物件進行序列化和反序列化。

然後在程式處理的地方,可以使用這個bean物件了。

@Autowired
private RedisTemplate redisTemplate;


@RequestMapping("/user/{id}")
@ResponseBody
public String getUser(@PathVariable("id") long id) {
    log.info("---- getUser");
    //
    User user = new User(id, "[email protected]", "aa", "aa123456", "aa", "123");
    ValueOperations<String, User> operations = redisTemplate.opsForValue();
    operations.set("com.dcloud.user", user);
    // 有超時時間的redis set..
    operations.set("com.dcloud.user.ex", user, 10, TimeUnit.SECONDS);

    //
    boolean exists = redisTemplate.hasKey("com.dcloud.user");
    if (exists) {
        log.info("exists is true");
    } else {
        log.info("exists is false");
    }

    return "finished";
}


@RequestMapping(value = "/query")
@ResponseBody
public String query() {
    log.info("query from redis");
    ValueOperations<String, User> operations = redisTemplate.opsForValue();
    // 
    User ret = operations.get("com.dcloud.user");
    if (null == ret) {
        log.info("not exist user");
        return "finished query, and not exists";
    }

    log.info(ret.toString());

    return "finished query";
}

現在可以看一下執行時的redisTemplate物件
配置的redisTemple

相關推薦

Spring boot系列--redis使用1

簡介 在網際網路的應用中,redis被廣泛地使用。而在spring boot中使用redis,是非常簡單的。 spring boot 中的redis 要在spring boot中使用redis,在pom中加入spring-boot-starter-re

spring boot 系列三:spring boot 整合JdbcTemplate

closed com context boot pin pan url wired ace 前面兩篇文章我們講了兩件事情: 通過一個簡單實例進行spring boot 入門 修改spring boot 默認的服務端口號和默認context path 這篇文章我們來看下怎

spring boot 系列四:spring boot 整合JPA

rom prop pos output UNC actor href ali div 上一篇我們講了spring boot 整合JdbcTemplate來進行數據的持久化, 這篇我們來說下怎麽通過spring boot 整合JPA來實現數據的持久化。 一、代碼實現  修改

spring boot項目登陸緩存session至redis和cookies

進行 @param span set 參數 cat control session open 一、將獲取的openId(詳細步驟見賣家掃碼登陸獲取openId)作為參數傳入到SellerUserController中的login登陸方法。 註:此處設置token,是為了取

spring boot項目登出刪除緩存session至redis和cookies

logo edi str put info contains nbsp use lse 一、從request中讀出cookies集合,然後封裝成map,為的是能夠直接通過name得到相應的cookie即get方法 public static Cookie get(HttpS

spring boot項目redis分布式鎖的應用

key 什麽 其他 ng- 分布式鎖 即使 功能 pri ont SETNX key value 起始版本:1.0.0 時間復雜度:O(1) 將key設置值為value,如果key不存在,這種情況下等同SET命令。 當key存在時,什麽也不做。SETNX是”SET i

spring boot項目redis緩存

程序 ati 如果 lec 第一次 數據 寫入 緩存 list()方法 以程序為例,tomcat裏是我們的java應用,第一步會先從redis獲取,如果沒有,就會從db上面獲取,如果取出了,他還會把取出的東西重新寫回redis 使用緩存的步驟: 一、在SellApplic

Spring Boot 系列五:Spring Boot 通過devtools進行熱部署

前面已經分享過四篇學習文章: 1、Spring Boot 系統之一:Spring Boot 入門 2、Spring Boot 系統之二:Spring Boot 修改預設埠號和context path 3、Spring Boot 系統之三:Spring Boot 整合JdbcTemplat

Spring Boot開發系列(Redis)(三)--Spring boot 整合redis完成簡單的get,set操作

Spring Boot開發系列(Redis)(三)–Spring boot 整合redis完成簡單的get,set操作 【1】匯入reids相關依賴 <dependency> <groupId>redis.clients</g

Java高架構師、分散式架構、高可擴充套件、高效能、高併發、效能優化、Spring bootRedis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分散式專案實戰學習架構師

工作1-5年開發經驗,當你們提出漲工資的時候,或者要offer的時候底氣怎麼樣,是不是底氣十足,不給漲工資就辭職,是不是有自信提出來主管、或者是專案經理都能同意,他們相當設法把你留住。如果這樣你才是成功。什麼技術都沒有何談工資! 給你分析一下這些技術,給大家羅列一些技術,看

redis學習系列(二)--spring boot整合Redis叢集

spring boot整合Redis叢集 開發 新增依賴,載入Jedis <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g

spring boot 系列六:深入理解spring boot的自動配置

我們知道,spring boot自動配置功能可以根據不同情況來決定spring配置應該用哪個,不應該用哪個,舉個例子: Spring的JdbcTemplate是不是在Classpath裡面?如果是,並且DataSource也存在,就自動配置一個JdbcTemplate的Bean Thymeleaf是不

spring boot 系列二:spring boot 如何修改預設埠號和contextpath

上一篇檔案我們通過一個例項進行了spring boot 入門,我們發現tomcat埠號和上下文(context path)都是預設的, 如果我們對於這兩個值有特殊需要的話,需要自己制定的時候怎麼辦呢? 一、問題解決: 在src/main/resources目錄下新建檔案application.pro

Java爬蟲初體驗:簡單抓取IT家熱評(整合Spring Boot+Elasticsearch+Redis+Mybatis)

爬取主程式 使用Jsoup解析網頁原始碼 @Component public class WebCrawler { private static final String encoding = "utf-8"; @Autowired

Spring Boot系列(三):Spring BootRedis的使用

spring boot對常用的資料庫支援外,對nosql 資料庫也進行了封裝自動化。 redis介紹 Redis是目前業界使用最廣泛的記憶體資料儲存。相比memcached,Redis支援更豐富的資料結構,例如hashes, lists, sets等,同時支援資料持久

Spring Boot 系列1) 微服務介紹

相信做過ssh或者ssm專案的人都曾經被那些繁瑣的xml檔案所困擾,後來,隨著註解的出現,註解式開發變得越來越普及,但是有的時候,開發還是離不開xml。 Spring Boot的核心功能: 1.生產出獨立地jar檔案來執行,執行一個Spring Boot的專

spring進階 第一節 : spring boot 系列ssm專案實戰

spring進階 第一節 : spring boot 系列之ssm專案實戰 1.spring boot 介紹 特點 - 建立獨立的spring容器應用程式 - 內嵌容器(tomcat,jetty,undertow)無需w

spring boot爬坑旅途--redis-MyShiroSessionListener(shiroSession監聽)配置(12)

package com.zm.blog.config.shiro; import org.apache.shiro.session.Session; import org.apache.shiro.s

Spring Boot系列(四) Spring Boot 驗證

sse star split jsr 303 boot public mes 定義 runtime 這節沒有高深的東西, 但有一些學習思路值得借鑒. JSR 303 (Bean Validation) Maven依賴 <dependency> <g

Spring Boot2 系列教程(二十六)Spring Boot 整合 Redis

在 Redis 出現之前,我們的快取框架各種各樣,有了 Redis ,快取方案基本上都統一了,關於 Redis,鬆哥之前有一個系列教程,尚不瞭解 Redis 的小夥伴可以參考這個教程: Redis 教程合集 使用 Java 操作 Redis 的方案很多,Jedis 是目前較為流行的一種方案,除了 Jedi