成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院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號
国产精品天干天干综合网| 国产午夜毛片V一区二区三区| 国产92刮伦脏话对白| 丰满熟妇乱又伦精品| 国产巨大爆乳在线观看| 精品少妇无码一区二区三批| 久久久久久精品久久久| 女人张开腿让男桶喷水高潮| 人妻无码久久一区二区三区免费| 十八禁无遮无拦视频免费| 小雪好湿用力啊进来轻点 | 波多野结衣av无码久久一区| 寡妇大J8又粗又大| 好吊色欧美一区二区三区视频| 久久久久成人精品无码中文字幕| 男人进入女人里面想动还是不想动 | 中文字字幕在线乱码| 爆乳邻居肉欲中文字幕| 国产精品免费_区二区三区观看| 激情无码白丝人妻又大又粗| 蜜桃AV一区二区三区| 日本三级欧美三级人妇视频| 亚洲 精品 综合 精品 自拍| 呦系列视频一区二区三区| 波多野结衣AV高清中文| 国产私人尤物无码不卡| 麻豆国产一卡二卡三卡| 色综合久久中文综合网| 亚洲国产成人精品无码区在线网站| 中英文字幕乱码英文正常| 丰满性熟妇ⅩXXOOOZZX| 精品三级久久久久电影我网| 欧美与黑人午夜性猛交久久久| 无码人妻精品一区二区三区9厂| 亚洲综合久久成人AV| 宝宝又大了1V1| 国色天香精品一卡2卡3卡| 女同学浮乱系列合集| 无码熟妇人妻Av又大又粗又爽| 亚洲综合网国产精品一区 | 国产午夜激无码AV片在线观看| 老司机精品成免费视频| 丝袜一区二区三区在线播放| 亚洲综合另类小说色区一| 吃奶呻吟打开双腿做受在线视频 | 亚洲GV天堂无码男同在线观看 | 日本少妇内射XXⅩⅩⅩⅩⅩⅩ| 亚洲成人AV免费| 拔萝卜高清视频大全免费观看| 国内精品免费视频自在线拍| 欧美激情国产精品视频一区二区 | 色狠狠色噜噜AV一区| 亚洲午夜精品久久久久久APP| 车后车座的疯狂的做的视频| 精品久久久久久成人AV| 日本一区二区三区免费播放| 亚洲人成小说网站色在线观看| 成人视频在线观看| 久久婷婷人人澡人爽人人喊| 熟睡入侵JEALOUSVUE| 中文字幕乱码亚洲无线码三区| 国产伦久视频免费观看视频| 欧美精品久久久久久久自慰 | 山东中年夫妇大白天露脸自拍| 一区二区三区AV高清免费波多| 国产丰满大乳无码免费播放| 女人大胆张开荫道口∞| 亚洲成AV人片无码迅雷下载 | 82岁老人找20多岁小伙子| 国外精产品W灬源码16| 日韩精品人妻无码久久影院 | 免费女人18毛片A毛片视频| 亚洲AV丰满熟妇一区| 成人国内精品久久久久影院VR| 久久人妻AV中文字幕| 亚洲AⅤ无码牛牛影视| 成人H动漫无码网站久久| 久久夜色噜噜噜亚洲AV| 性一交一乱一伦一在线小视频| 被粗大噗嗤噗嗤进出灌满浓浆| 狼人视频国产在线视频WWW色| 亚洲AV成人在线| 得到超级肉禽系统的小说怎么办| 蜜芽国产尤物AV尤物在线看| 亚洲精品无码久久久久久| 国产精品久久久久无码AV| 人妻AV一区二区三区AV免费| 中国 韩国 日本 免费看| 黑人60厘米全进去了| 天天做天天爱天天综合网2021| M豆传媒有限公司观看| 久久水蜜桃亚洲AV无码精品麻豆| 亚洲AⅤ秘区二区三区4| 国产成人免费A在线视频| 人人澡人人澡人人看添AV| 2021自拍偷在线精品自拍偷 | 国产无人区一码二码三码MBA | 亚洲性XXXXX极品少妇| 国精产品一区一区三区M| 玩弄朋友娇妻呻吟交换电影| 成熟妇女一区av| 人妻少妇粗大持久满足| 4399理论片午午伦夜理片| 久久久久亚洲AV无码专区首页网 | JAPANESE军人强迫| 奶头被几个流浪汉吃肿了| 一本大道色卡1卡2卡3乱码| 精品人妻少妇敕草AV无码专区 | 九九视频免费精品视频| 亚洲国产AⅤ精品一区二区百度| 国产品无码一区二区三区在线| 天堂VA在线高清一区| 吃奶呻吟打开双腿做受视频| 人人爽人人爽人人片A∨不卡| 99久久人妻无码中文字幕系列| 两只奶头被老头吸肿了| 影音先锋亚洲无码资源网| 久久久久久久女国产乱让韩| 亚洲欧美综合精品成人网站| 狠狠色丁香久久综合婷婷| 亚洲爆乳成AV人在线蜜芽| 好男人在在线社区WWW在线影院| 亚洲AV日韩AV高潮喷潮无码| 国产日韩在线欧美视频| 亚洲AⅤ日韩久久久久久| 国精产品一品二品国精日本| 亚洲AV无码成H人动漫无遮挡| 国内美女推油按摩在线播放 | 精品少妇一区二区| 亚洲色成人网站WWW永久小说| 久久精品国产精品亚洲色婷婷| 亚洲一区二区三区波多野结衣| 久久精品国产99国产精品亚洲| 亚洲熟妇丰满XXXXX国语| 久久精品国产亚洲AV麻豆王友容| 亚洲综合成人婷婷五月在线观看| 久久亚洲精品成人无码| 中国熟妇色XXXXⅩ老妇| 女性高爱潮免费有声视频网站| 99视频精品全部免费免费观看| 人伦片无码中文字| 岛国岛国免费V片在线观看| 天天躁日日躁狠狠躁人妻| 国产伦精品一区二区三区免费 | 亚洲AV成人片色在线高潮| 交换朋友夫妻互换客厅韩国5| 亚洲天天做日日做天天欢| 鲁丝一区二区三区| 99久久久无码国产麻豆| 日本熟妇人妻XXⅩHD| 国产成人亚洲欧美二区综合| 亚洲AV无码国产一区二区三区| 精品日产卡一卡二卡927| 中国少妇内射XXXXX-百度| 欧美黑人又大又粗XXXⅩ| 大BBW大BBW超大BBW| 午夜亚洲国产理论片2020| 加比勒色综合久久| 中国小YOUNV女YOUNV| 日本成熟…@视频| 国产精品自在线拍国产手青青机版| 亚洲大成色WWW永久泡芙| 老熟女多次高潮露脸视频| а天堂中文在线官网| 未成18不能看的视频| 精品欧美黑人一区二区三区| 中文字幕JUL975老公不在| 日本XXXX裸体XXXX自慰| 国产精品人人做人人爽| 亚洲乱码日产精品BD在线下载| 妺妺窝人体色www在线下载人| 成年女人毛片免费视频| 亚洲 中文字幕在线播| 乱子伦农村XXXXBBB| 成人作爱Av一级无码| 亚洲AV色区一区二区三区| 老司机久久一区二区三区| 成人拳交喷水在线播放| 亚洲AV无码国产精品色| 免费看的WWW哔哩哔哩| 高校美女内射含羞草| 亚洲欧美成人A∨在线观看| 欧美人与物VIDEOS另类| 国产精品色视频ⅩXXX| 又黄又爽又色的视频| 少妇大叫太大太爽受不了| 九九精品99久久久香蕉| 凹凸国产熟女精品视频| 亚洲AV无码AV吞精久久| 妺妺窝人体色WWW聚色窝丿| 国产成A人片在线观看视频| 亚洲中文字幕波多野结衣| 人妻少妇乱子伦精品无码专区毛片| 国产日产欧产综合| 18禁黄污无遮挡无码网站 | 日本丰满少妇高潮XXXX| 精品国产第一国产综合精品| 暗交小拗女一区二区三区三州| 亚洲成人免费AV| 日本丰满人妻熟妇BBBBB③B|