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了。
可以看一下執行時的物件
使用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物件
相關推薦
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 boot、Redis、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 Boot中Redis的使用
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