成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

詳解SpringBoot集成redis

詳解SpringBoot集成redis

今天,日月在這里教大家如何使用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

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
可以看到,之后都是從緩存中獲取的。

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

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

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
把腿张开我要CAO死你在线观看 | 国产亚洲婷婷香蕉久久精品| 国产熟女真实乱精品视频| 国产在线精品一区二区在线看 | 日韩在线观看视频一区二区| 色欲色欲天天天WWW亚洲伊 | 日本高清WWW色视频总站| 色老头BGMBGMBGM| 五十路熟妇亲子交尾| 亚洲精品无码久久久久SM| 伊人伊成久久人综合 成人| 99久久99久久免费精品小说| 赤裸羔羊Ⅲ致命快感 电影| 国产精品xxxxav| 精品无码国产日韩制服丝袜| 毛很浓密超多黑毛的少妇| 差差差很疼视频30分钟无掩盖| 欧美电影在线观看| 欧美性猛尖ⅩⅩⅩⅩ乱大交| 搡老女人P老熟妇老熟女| 亚欧免费无码AⅤ在线观看| 亚洲一区二区三区高清AV| 坐公交车居然被弄了2个小时小说| 把她按在桌上疯狂顶撞| 国产精品无码V在线观看| 久本草在线中文字幕| 欧美极品性饥渴少妇大战黑人| 色噜噜狠狠色综合日日| 亚洲成AV人片一区二区| 37大但文体艺术A级都市天气| 啊轻点内射在线视频| 国产欧美一区二区精品性色 | 高一数学网课免费-2| 精品AV综合一区二区三区| 欧美VA久久久噜噜噜久久| 天堂中文А√在线| 亚洲最刺激成人无码| 被C哭着爬走又被拉回来挺进H| 国产欧美一区二区精品性色| 两个奶头被吃到高潮什么感觉 | 欧美人禽猛交乱配视频网站| 人妻少妇精品一区二区三区| 无码熟妇人妻AV| 一二三四免费观看高清视频| 不收费半夜年轻人看B站软件| 国产无套码AⅤ在线观看在线播放| 久久天天躁夜夜躁狠狠85| 日韩国产女人久久久| 亚洲精品无码av中文字幕电影网站 | 娇小XXXXBXBⅨ黑人XX| 欧美另类精品黑人巨大| 亚洲AV激情高潮抽搐乱色| 99精品国产99久久久久久97| 国产美女视频国产视视频| 免费人成视频X8X8入口| 无码中文字幕人妻在线一区| 50妺妺窝人体色www合集| 国产日产欧洲系列| 欧美日韩精品SUV| 亚洲国产精品VA在线看黑人| 暴躁少女CSGO| 欧洲成人午夜精品无码区久久| 97久久超碰福利国产精品…| 国产精品国产三级国产专I| 久久亚洲精品人成综合网| 双腿吊起揉捏花蒂| 真人新婚之夜破苞第一次视频| 超碰97久久国产精品牛牛| 果冻传媒AⅤ毛片无码| 秋霞鲁丝片AⅤ无码入口| 亚洲国产最大AV| 大黑大巴大战欧洲美女图片| 久久午夜私人影院| 无码人妻少妇色欲AV一区二区| 中文字幕人妻中文AV不卡专区| 国产小呦泬泬99精品| 欧美又粗又大BBBB疯视频AV| 亚洲日韩AV无码一区二区三区| 高清VIDEOSGRATIS欧| 美女裸露双奶头尿口无遮挡网站| 性欧美丰满熟妇XXXX性| 被夫の上司に犯中文字幕| 老阿姨哔哩哔哩B站肉片入口6 | 天堂99久久久久久久久久久| 在线成人A毛片免费播放| 少妇人妻中文字幕| 主人 跪好 知道错了吗| 狠狠色丁香婷婷久久综合不卡| 日韩精品无码一区二区三区视频| 中国JAPANESEXXXX少| 精品厕所偷拍各类美女TP嘘嘘| 体验区试看120秒啪啪免费| SM调教贱屁股眼哭叫求饶H| 无码AV无码一区二区| 无码人妻精品一区二区蜜桃视频| 97精品国产97久久久久久免费 | 麻豆AV一区二区三区久久| 无码熟妇人妻AV在线影片免费| MM1313亚洲国产精品无码| 久久亚洲AV无码精品色午夜麻豆| 亚洲 精品 制服 校园 无码| 东北大坑续集1至60| 欧美老人巨大XXXX做受视频| 一区二区操逼视频| 精品国产一区二区三区AV片| 午夜无码性爽快影院6080| 古装激情偷乱人伦视频| 人妻精品久久无码专区涩涩| 7777精品伊久久久大香线蕉| 久久久亚洲欧洲日产国码农村 | 午夜成人影片在线观看免费完整高| 亚洲精品无码不卡在线播放 | 奶头被民工们吸得又红又肿怎么办 | 久久久久亚洲AV无码麻豆| 亚洲AV怡红院AV男人的天堂| 国产传媒精品1区2区3区| 少妇人妻陈艳和黑人教练| 成人网站WWW污污污网站| 欧美性狂猛BBBBBBXXXX| 97色偷偷色噜噜狠狠爱网站97| 麻豆久久亚洲AV成人无码电影| 一本一本久久A久久精品综合麻豆| 精品无码国产一区二区三区麻豆 | 国内揄拍国内精品| 亚洲AV成人精品日韩一区18p| 国产清纯白嫩大学生正在播放 | 日本毛多水多做受视频| 爸的比老公大两倍儿媳叫什么呢| 欧洲少妇色XXXXX欧美美妇 | 日本无人区码卡3卡4卡区别| 久久夜色噜噜噜亚洲AV| 亚洲色偷偷综合亚洲av伊人| 精品少妇人妻AV无码久久| 亚洲精品欧美综合四区| 精品国产Ⅴ无码大片在线观看| 亚洲国产精品久久久久秋霞小 | 亚洲午夜无码久久久久软件| 久久精品日日躁夜夜躁欧美| 亚洲无码成人电影| 浪荡受NP纯肉公共场合BL男男| 中国大陆女RAPPER欢迎你| 男人下部进女人下部视频| A级毛片100部免费观看| 日99久9在线 | 免费| 粉嫩大学生无套内射无码卡视频 | とらぶるだいありぴーち在线| 人妻三级日本香港三级极97| 成 人 网 站国产免费观看 | 男女啪啪永久免费网站| FREE性欧美高清VIDEOS| 日本A级作爱免费观看在线| 丰满熟妇XXXX性久久久| 无线乱码A区B区C区D| 黑人强伦姧人妻完整版| 亚洲中文久久精品无码WW16| 免费热播女人毛片| 把腿张开老子cao烂你动态图| 少妇久久久久久被弄到高潮| 国产日产欧产综合| 亚洲欧美中文日韩V在线观看不卡| 久久无码精品一区二区三区| 99国精产品灬源码1| 三上悠亚SSNL-618无码播| 国产精品久久午夜夜伦鲁鲁| 亚洲精品无码久久久久不卡| 毛茸茸性XXXX毛茸茸毛茸茸| 宝宝锕~进去就不痛了在线观看| 少妇丰满爆乳被呻吟进入| 国产亚洲欧洲网友拍| 野花高清完整版免费观看视频大全| 免费无码午夜福利片| 成人免费无码AV| 小雪要撑破了黑人好大| 久久久受WWW免费人成| JAVASCRIPT中国免费| 污黄啪啪网18以下勿进| 久久精品熟女亚洲AV麻豆| 9丨精品妻人一区二区三区蜜桃| 日日摸日日碰夜夜爽暖暖视频| 国产区精品一区二区不卡中文| 野花香高清视频在线观看免费| 欧美又粗又长XXXXBBBB疯| 国产旡码高清一区二区三区| 亚洲熟妇无码AⅤ在线播放| 欧美视频一区二区图文| 国产精品免费久久久久久蜜桃| 亚洲熟妇久久精品| 人妻精品久久一区二区av| 国产又色又爽又黄的网站在线 | 日韩精品无码久久久久久| 国产激情一区二区三区小说| 亚洲综合AV永久无码精品一区二| 欧美性猛交XXXX黑人口味重| 国产精品久久久久久久网| 一本加勒比HEZYO无码资源网| 人善交VIDEO另类HD| 国产在线精品99一区不卡| 99久久国产综合精麻豆| 无套内内射视频网站| 人人做人碰人人添|