共計 10474 個字符,預計需要花費 27 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章給大家分享的是有關 SpringBoot 怎樣集成 redis 的內容。丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,一起跟隨丸趣 TV 小編過來看看吧。
定義
REmote DIctionary Server(Redis) 是一個由 Salvatore Sanfilippo 寫的 key-value 存儲系統。
Redis 是一個開源的使用 ANSI C 語言編寫、遵守 BSD 協議、支持網絡、可基于內存亦可持久化的日志型、Key-Value 數據庫,并提供多種語言的 API。
它通常被稱為數據結構服務器,因為值(value)可以是 字符串 (String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets) 等類型。
reids 的優點
以下是 Redis 的一些優點。
異常快 – Redis 非常快,每秒可執行大約 110000 次的設置 (SET) 操作,每秒大約可執行 81000 次的讀取 / 獲取 (GET) 操作。
支持豐富的數據類型 – Redis 支持開發人員常用的大多數數據類型,例如列表,集合,排序集和散列等等。這使得 Redis 很容易被用來解決各種問題,因為我們知道哪些問題可以更好使用地哪些數據類型來處理解決。
操作具有原子性 – 所有 Redis 操作都是原子操作,這確保如果兩個客戶端并發訪問,Redis 服務器能接收更新的值。
多實用工具 – Redis 是一個多實用工具,可用于多種用例,如:緩存,消息隊列(Redis 本地支持發布 / 訂閱),應用程序中的任何短期數據,例如,web 應用程序中的會話,網頁命中計數等。
Redis 安裝
Window 下安裝
下載地址:https://github.com/MSOpenTech/redis/releases。
Redis 支持 32 位和 64 位。這個需要根據你系統平臺的實際情況選擇,這里我們下載 Redis-x64-xxx.zip 壓縮包到 C 盤,解壓后,將文件夾重新命名為 redis。
打開一個 cmd 窗口 使用 cd 命令切換目錄到 C:\redis
運行 redis-server.exe redis.windows.conf
如果想方便的話,可以把 redis 的路徑加到系統的環境變量里,這樣就省得再輸路徑了,后面的那個 redis.windows.conf 可以省略,如果省略,會啟用默認的。輸入之后,會顯示如下界面:
集成 redis
我們還是延用上一章的項目:Springboot 集成 springcloud-config 實現 dataSource 熱部署
1、添加依賴
!-- 集成 redis--
dependency
groupId org.springframework.boot /groupId
artifactId spring-boot-starter-redis /artifactId
version 1.4.1.RELEASE /version
/dependency
dependency
groupId com.alibaba /groupId
artifactId fastjson /artifactId
version 1.2.3 /version
/dependency
dependency
groupId com.fasterxml.jackson.core /groupId
artifactId jackson-databind /artifactId
/dependency
2、在配置中心里添加 redis 配置
spring.redis.host=127.0.0.1
#Redis 服務器連接端口
spring.redis.port=6379
#Redis 服務器連接密碼(默認為空)spring.redis.password=
#連接池最大連接數(使用負值表示沒有限制)spring.redis.pool.max-active=8
#連接池最大阻塞等待時間(使用負值表示沒有限制)spring.redis.pool.max-wait=-1
#連接池中的最大空閑連接
spring.redis.pool.max-idle=8
#連接池中的最小空閑連接
spring.redis.pool.min-idle=0
#連接超時時間(毫秒)spring.redis.timeout=30000
3、配置類 RedisConfig
import java.lang.reflect.Method;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.databind.ObjectMapper;
@Configuration
@EnableCaching
@RefreshScope
public class RedisConfig extends CachingConfigurerSupport{ @Value( ${spring.redis.host} )
private String host;
@Value(${spring.redis.port} )
private int port;
@Value(${spring.redis.timeout} )
private int timeout;
@Value(${spring.redis.password} )
private String password;
@Value(${spring.redis.pool.max-active} )
private int maxActive;
@Value(${spring.redis.pool.max-wait} )
private int maxWait;
@Value(${spring.redis.pool.max-idle} )
private int maxIdle;
@Value(${spring.redis.pool.min-idle} )
private int minIdle;
@RefreshScope
@Bean
public KeyGenerator wiselyKeyGenerator(){ return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) { sb.append(obj.toString());
}
return sb.toString();
}
};
}
@RefreshScope
@Bean
public JedisConnectionFactory redisConnectionFactory() { JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setHostName(host);
factory.setPort(port);
factory.setTimeout(timeout); // 設置連接超時時間
factory.setPassword(password);
factory.getPoolConfig().setMaxIdle(maxIdle);
factory.getPoolConfig().setMinIdle(minIdle);
factory.getPoolConfig().setMaxTotal(maxActive);
factory.getPoolConfig().setMaxWaitMillis(maxWait);
return factory;
}
@RefreshScope
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) { RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
// Number of seconds before expiration. Defaults to unlimited (0)
cacheManager.setDefaultExpiration(10); // 設置 key-value 超時時間
return cacheManager;
}
@RefreshScope
@Bean
public RedisTemplate String, String redisTemplate(RedisConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(factory);
setSerializer(template); // 設置序列化工具,這樣 ReportBean 不需要實現 Serializable 接口
template.afterPropertiesSet();
return template;
}
@RefreshScope
private void setSerializer(StringRedisTemplate template) { 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);
}
}
4、RedisUtils 類
import java.io.Serializable;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;
@Service
public class RedisUtils {
@Autowired
private RedisTemplate redisTemplate;
/**
* 寫入緩存
* @param key
* @param value
* @return
*/
public boolean set(final String key, Object value) {
boolean result = false;
try { ValueOperations Serializable, Object operations = redisTemplate.opsForValue();
operations.set(key, value);
result = true;
} catch (Exception e) { e.printStackTrace();
}
return result;
}
/**
* 寫入緩存設置時效時間
* @param key
* @param value
* @return
*/
public boolean set(final String key, Object value, Long expireTime ,TimeUnit timeUnit) {
boolean result = false;
try { ValueOperations Serializable, Object operations = redisTemplate.opsForValue();
operations.set(key, value);
redisTemplate.expire(key, expireTime, timeUnit);
result = true;
} catch (Exception e) { e.printStackTrace();
}
return result;
}
/**
* 批量刪除對應的 value
* @param keys
*/
public void remove(final String... keys) { for (String key : keys) { remove(key);
}
}
/**
* 批量刪除 key
* @param pattern
*/
public void removePattern(final String pattern) { Set Serializable keys = redisTemplate.keys(pattern);
if (keys.size() 0){ redisTemplate.delete(keys);
}
}
/**
* 刪除對應的 value
* @param key
*/
public void remove(final String key) { if (exists(key)) { redisTemplate.delete(key);
}
}
/**
* 判斷緩存中是否有對應的 value
* @param key
* @return
*/
public boolean exists(final String key) { return redisTemplate.hasKey(key);
}
/**
* 讀取緩存
* @param key
* @return
*/
public Object get(final String key) {
Object result = null;
ValueOperations Serializable, Object operations = redisTemplate.opsForValue();
result = operations.get(key);
return result;
}
/**
* 哈希 添加
* @param key
* @param hashKey
* @param value
*/
public void hmSet(String key, Object hashKey, Object value){ HashOperations String, Object, Object hash = redisTemplate.opsForHash();
hash.put(key,hashKey,value);
}
/**
* 哈希獲取數據
* @param key
* @param hashKey
* @return
*/
public Object hmGet(String key, Object hashKey){ HashOperations String, Object, Object hash = redisTemplate.opsForHash();
return hash.get(key,hashKey);
}
/**
* 列表添加
* @param k
* @param v
*/
public void lPush(String k,Object v){ ListOperations String, Object list = redisTemplate.opsForList();
list.rightPush(k,v);
}
/**
* 列表獲取
* @param k
* @param l
* @param l1
* @return
*/
public List Object lRange(String k, long l, long l1){ ListOperations String, Object list = redisTemplate.opsForList();
return list.range(k,l,l1);
}
/**
* 集合添加
* @param key
* @param value
*/
public void add(String key,Object value){ SetOperations String, Object set = redisTemplate.opsForSet();
set.add(key,value);
}
/**
* 集合獲取
* @param key
* @return
*/
public Set Object setMembers(String key){ SetOperations String, Object set = redisTemplate.opsForSet();
return set.members(key);
}
/**
* 有序集合添加
* @param key
* @param value
* @param scoure
*/
public void zAdd(String key,Object value,double scoure){ ZSetOperations String, Object zset = redisTemplate.opsForZSet();
zset.add(key,value,scoure);
}
/**
* 有序集合獲取
* @param key
* @param scoure
* @param scoure1
* @return
*/
public Set Object rangeByScore(String key,double scoure,double scoure1){ ZSetOperations String, Object zset = redisTemplate.opsForZSet();
return zset.rangeByScore(key, scoure, scoure1);
}
5、測試,修改 controller
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.chenqi.springboot.redis.RedisUtils;
import com.chenqi.springboot.service.TestService;
@RestController
public class SpringBootController {
public static final Logger log = LoggerFactory.getLogger(SpringBootController.class);
@Autowired
TestService testService;
@Autowired
private RedisUtils redisUtils;
@RequestMapping(value = /hello/{id} )
public String hello(@PathVariable(value = id) String id){
// 查詢緩存中是否存在
boolean hasKey = redisUtils.exists(id);
String str =
if(hasKey){
// 獲取緩存
Object object = redisUtils.get(id);
log.info(從緩存獲取的數據 + object);
str = object.toString();
}else{
// 從數據庫中獲取信息
log.info( 從數據庫中獲取數據
str = testService.test();
// 數據插入緩存(set 中的參數含義:key 值,user 對象,緩存存在時間 10(long 類型),時間單位) redisUtils.set(id,str,10L,TimeUnit.MINUTES);
log.info(數據插入緩存 + str);
}
return str;
}
}
啟動項目,第一次訪問:http://localhost:8002/hello/111
通過控制臺輸出,我們可以看到是從數據庫中獲取的數據,并且存入了 redis 緩存中。
我們再次刷新瀏覽器
可以看到,第二次是從緩存中讀取的,我們試試不斷刷新瀏覽器
可以看到,之后都是從緩存中獲取的。
到此我們的 redis 就配置好了。
SpringBoot 集成 Redis-demo 下載
急需 demo 的兄弟就自行下載吧,不急可以留言郵箱,一般 48 小時內會發。
感謝各位的閱讀!關于“SpringBoot 怎樣集成 redis”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
向 AI 問一下細節