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

SpringBoot集成redis的示例分析

127次閱讀
沒有評論

共計 10409 個字符,預計需要花費 27 分鐘才能閱讀完成。

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

這篇文章給大家分享的是有關 SpringBoot 集成 redis 的示例分析的內容。丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,一起跟隨丸趣 TV 小編過來看看吧。

如何使用 springBoot 集成 redis
定義

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 可以省略,如果省略,會啟用默認的。輸入之后,會顯示如下界面:
SpringBoot 集成 redis 的示例分析

集成 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
SpringBoot 集成 redis 的示例分析
SpringBoot 集成 redis 的示例分析
通過控制臺輸出,我們可以看到是從數據庫中獲取的數據,并且存入了 redis 緩存中。

我們再次刷新瀏覽器
SpringBoot 集成 redis 的示例分析
可以看到,第二次是從緩存中讀取的,我們試試不斷刷新瀏覽器
SpringBoot 集成 redis 的示例分析

感謝各位的閱讀!關于“SpringBoot 集成 redis 的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向 AI 問一下細節

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-04發表,共計10409字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 阜新| 绩溪县| 丹凤县| 泽州县| 山东| 新化县| 冷水江市| 若尔盖县| 巴塘县| 新泰市| 介休市| 原平市| 宜城市| 绍兴市| 阿合奇县| 仁布县| 石门县| 两当县| 西平县| 新巴尔虎右旗| 乃东县| 漳浦县| 西林县| 衢州市| 博罗县| 邛崃市| 洞头县| 漳浦县| 无为县| 永德县| 云龙县| 格尔木市| 林口县| 九江县| 涟水县| 通辽市| 连南| 全州县| 佛山市| 依兰县| 和林格尔县|