久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

怎么使用springBoot集成redis

142次閱讀
沒有評論

共計 10467 個字符,預(yù)計需要花費 27 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

這篇文章將為大家詳細講解有關(guān)怎么使用 springBoot 集成 redis,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

REmote DIctionary Server(Redis) 是一個由 Salvatore Sanfilippo 寫的 key-value 存儲系統(tǒng)。

Redis 是一個開源的使用 ANSI C 語言編寫、遵守 BSD 協(xié)議、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value 數(shù)據(jù)庫,并提供多種語言的 API。

它通常被稱為數(shù)據(jù)結(jié)構(gòu)服務(wù)器,因為值(value)可以是 字符串 (String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets) 等類型。

reids 的優(yōu)點

以下是 Redis 的一些優(yōu)點。

異常快 – Redis 非常快,每秒可執(zhí)行大約 110000 次的設(shè)置 (SET) 操作,每秒大約可執(zhí)行 81000 次的讀取 / 獲取 (GET) 操作。
支持豐富的數(shù)據(jù)類型 – Redis 支持開發(fā)人員常用的大多數(shù)數(shù)據(jù)類型,例如列表,集合,排序集和散列等等。這使得 Redis 很容易被用來解決各種問題,因為我們知道哪些問題可以更好使用地哪些數(shù)據(jù)類型來處理解決。
操作具有原子性 – 所有 Redis 操作都是原子操作,這確保如果兩個客戶端并發(fā)訪問,Redis 服務(wù)器能接收更新的值。
多實用工具 – Redis 是一個多實用工具,可用于多種用例,如:緩存,消息隊列(Redis 本地支持發(fā)布 / 訂閱),應(yīng)用程序中的任何短期數(shù)據(jù),例如,web 應(yīng)用程序中的會話,網(wǎng)頁命中計數(shù)等。

Redis 安裝

Window 下安裝

下載地址:https://github.com/MSOpenTech/redis/releases。
Redis 支持 32 位和 64 位。這個需要根據(jù)你系統(tǒng)平臺的實際情況選擇,這里我們下載 Redis-x64-xxx.zip 壓縮包到 C 盤,解壓后,將文件夾重新命名為 redis。

打開一個 cmd 窗口 使用 cd 命令切換目錄到 C:\redis
運行 redis-server.exe redis.windows.conf
如果想方便的話,可以把 redis 的路徑加到系統(tǒng)的環(huán)境變量里,這樣就省得再輸路徑了,后面的那個 redis.windows.conf 可以省略,如果省略,會啟用默認的。輸入之后,會顯示如下界面:
怎么使用 springBoot 集成 redis

集成 redis

我們還是延用上一章的項目:Springboot 集成 springcloud-config 實現(xiàn) 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 服務(wù)器連接端口
spring.redis.port=6379
#Redis 服務(wù)器連接密碼(默認為空)spring.redis.password=
#連接池最大連接數(shù)(使用負值表示沒有限制)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); // 設(shè)置連接超時時間
 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); // 設(shè)置 key-value 超時時間
 return cacheManager;
 }
 
 @RefreshScope
 @Bean
 public RedisTemplate String, String  redisTemplate(RedisConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(factory);
 setSerializer(template); // 設(shè)置序列化工具,這樣 ReportBean 不需要實現(xiàn) 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;
 }
 /**
 *  寫入緩存設(shè)置時效時間
 * @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;
 }
 /**
 *  批量刪除對應(yīng)的 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);
 }
 }
 /**
 *  刪除對應(yīng)的 value
 * @param key
 */
 public void remove(final String key) { if (exists(key)) { redisTemplate.delete(key);
 }
 }
 /**
 *  判斷緩存中是否有對應(yīng)的 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);
 }
 /**
 *  哈希獲取數(shù)據(jù)
 * @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(從緩存獲取的數(shù)據(jù) + object);
 str = object.toString();
 }else{
 // 從數(shù)據(jù)庫中獲取信息
 log.info( 從數(shù)據(jù)庫中獲取數(shù)據(jù) 
 str = testService.test();
 // 數(shù)據(jù)插入緩存(set 中的參數(shù)含義:key 值,user 對象,緩存存在時間 10(long 類型),時間單位) redisUtils.set(id,str,10L,TimeUnit.MINUTES);
 log.info(數(shù)據(jù)插入緩存  + str);
 }
 return str;
 }
}

啟動項目,第一次訪問:http://localhost:8002/hello/111
怎么使用 springBoot 集成 redis
怎么使用 springBoot 集成 redis
通過控制臺輸出,我們可以看到是從數(shù)據(jù)庫中獲取的數(shù)據(jù),并且存入了 redis 緩存中。

我們再次刷新瀏覽器
怎么使用 springBoot 集成 redis
可以看到,第二次是從緩存中讀取的,我們試試不斷刷新瀏覽器
怎么使用 springBoot 集成 redis
可以看到,之后都是從緩存中獲取的。

到此我們的 redis 就配置好了。

SpringBoot 集成 Redis-demo 下載
急需 demo 的兄弟就自行下載吧,不急可以留言郵箱,一般 48 小時內(nèi)會發(fā)。

關(guān)于“怎么使用 springBoot 集成 redis”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向 AI 問一下細節(jié)

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-12-04發(fā)表,共計10467字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 汕头市| 剑河县| 镇康县| 弋阳县| 筠连县| 青浦区| 徐水县| 济源市| 长阳| 信宜市| 蒙山县| 嘉禾县| 电白县| 苏州市| 恭城| 桑日县| 隆化县| 平顶山市| 龙里县| 海宁市| 湖北省| 宝山区| 婺源县| 徐州市| 板桥市| 新竹市| 凤台县| 葵青区| 武城县| 满城县| 库伦旗| 武平县| 平江县| 尼玛县| 滦平县| 屏南县| 呈贡县| 云浮市| 夏邑县| 军事| 墨脱县|