本篇文章給大家介紹一下使用springboot集成redis的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。
REmote DIctionary Server(redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統。
Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。【相關推薦:Redis視頻教程】
它通常被稱為數據結構服務器,因為值(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>?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); ????} }</string>
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下載https://download.csdn.net/download/weixin_40623736/12692763
急需demo的兄弟就自行下載吧,不急可以留言郵箱,一般48小時內會發。
更多編程相關知識,請訪問:Redis視頻教程!!