日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

springboot 集成redis_一文详解Spring Boot 集成 Redis

發(fā)布時(shí)間:2025/3/15 javascript 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot 集成redis_一文详解Spring Boot 集成 Redis 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

redis設(shè)置:

  • 修改redis服務(wù)器的配置文件
vim /usr/local/redis/bin/redis.confbind 0.0.0.0 protected-mode no
  • 重新啟動(dòng)redis
systemctl restart redis.service #重新啟動(dòng)服務(wù)

注意:服務(wù)器的話需要設(shè)置安全組開放端口

1.導(dǎo)入依賴

org.springframework.boot spring-boot-starter-data-redis

2.全局配置文件中配置redis信息

# 應(yīng)用名稱spring: application: name: springboot-redis01 redis: host: 47.93.190.68 port: 6379 database: 0 jedis: #redis連接池信息 pool: max-active: 8 min-idle: 0 max-idle: 8 max-wait: -1server: servlet: context-path: /redis01

通過以上配置后springboot就為我們提供了RedisTemplate和StringRedisTemplate(對key,value形式的都是string操作)

相關(guān)操作

StringRedisTemplate

對string類型的操作方式:

//操作stringstringRedisTemplate.opsForValue().set("string01","string");System.out.println(stringRedisTemplate.opsForValue().get("string01"));//操作hash類型stringRedisTemplate.opsForHash().put("hash-user","username","name");stringRedisTemplate.opsForHash().put("hash-user","userage","age");//操作liststringRedisTemplate.opsForList().rightPushAll("list","l1","l2");//操作setstringRedisTemplate.opsForSet().add("set01", "daaa");//操作zsetstringRedisTemplate.opsForZSet().add("zset01", "zset", 1);
  • 綁定一個(gè)鍵(k)進(jìn)行操作:通常是對一個(gè)key進(jìn)行多次的操作時(shí)使用。
//沒有key就會(huì)添加keyBoundValueOperations boundValueOps = stringRedisTemplate.boundValueOps("name");//追加的方式boundValueOps.append("hahaha");boundValueOps.append("hahaha");System.out.println(boundValueOps.get());//重新賦值boundValueOps.set("hanwei hello");System.out.println(boundValueOps.get());

注意: 一旦綁定key之后后續(xù)根據(jù)返回對象的操作都是基于這個(gè)key的操作

redisTemplate

  • 一般操作是將對象存儲(chǔ)在redis中。
@Test public void testRedisTemplate(){ //通過這種方式是獲取不到stringRedisTemplate方式設(shè)置的值的 System.out.println(redisTemplate.opsForValue().get("name"));//null //設(shè)置key的序列化方式為string redisTemplate.setKeySerializer(new StringRedisSerializer()); //以下是設(shè)置value的序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); //jackson ObjectMapper objectMapper = new ObjectMapper(); //轉(zhuǎn)換json格式的時(shí)候?qū)⒃碱愋捅A?#xff0c;這樣在反序列化的時(shí)候就能知道對應(yīng)的類型信息 objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); //修改存儲(chǔ)在redis中的日期格式 objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd")); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); User user = new User(); user.setId(22).setName("hanhan").setBir(new Date()); redisTemplate.opsForValue().set("user",user); System.out.println(redisTemplate.opsForValue().get("user").toString()); //hash類型的是(key,(key,val)),所以需要單獨(dú)設(shè)置序列化方式 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); redisTemplate.opsForHash().put("user1","user",user); System.out.println(redisTemplate.opsForHash().get("user1", "user")); }

注意redistemplate默認(rèn)使用的是jdk的序列化,存儲(chǔ)到redis中會(huì)是下面的情況:,所以我們將key的序列化改為string類型的,將value改為json序列化。

mybatis中使用redis

mybatis自身緩存存在問題,本地緩存local cache

1.本地緩存存儲(chǔ)在當(dāng)前運(yùn)行的jvm內(nèi)存中,如果緩存數(shù)據(jù)過多會(huì)占用一定jvm內(nèi)存,導(dǎo)致應(yīng)用運(yùn)行緩存。

? 2.不能在分布式系統(tǒng)中做到緩存共享。

重寫mybatis cache 使用redis作分布式緩存

如果使用mybatis的二級緩存只需要在mapper文件中添加,二級緩存的作用范圍是每個(gè)maper。

自定義redis緩存作為mybatis的緩存

  • 導(dǎo)入依賴
org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-data-redis org.projectlombok lombok org.springframework.boot spring-boot-starter-test testjunit junit testcom.fasterxml.jackson.core jackson-databind org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.1com.alibaba druid 1.1.21mysql mysql-connector-java

注意:mybatis的xml文件如果再java文件下的話,一定要加resources將xml發(fā)布

  • 自定義RedisCache類
package com.han.cache;import com.han.util.ApplicationContextUtils;import org.apache.ibatis.cache.Cache;import org.springframework.context.ApplicationContext;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.StringRedisSerializer;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/** * @author M.han * @title: RedisCache * @projectName springboot-redis * @description: TODO * @date 2020/12/1520:18 */public class RedisCache implements Cache { private String id; public RedisCache(String id) { System.out.println("當(dāng)前加入緩存的id==》" + id); this.id = id; } @Override public String getId() { return id; } /*** * 放入緩存 * @param key * @param val */ @Override public void putObject(Object key, Object val) { System.out.println("KEY:" + key); System.out.println("val:" + val); //獲取對象 RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate"); redisTemplate.setKeySerializer(new StringRedisSerializer()); //存儲(chǔ)在Redis中,注意上面對key使用了string序列化,所以傳入的key是string類型的 redisTemplate.opsForValue().set(key.toString(), val); } /*** * 從緩存中獲取 * @param key * @return */ @Override public Object getObject(Object key) { System.out.println("從緩存中讀取了=》" + key); //獲取對象 RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate"); redisTemplate.setKeySerializer(new StringRedisSerializer()); return redisTemplate.opsForValue().get(key.toString()); } /*** * 刪除緩存中的數(shù)據(jù) */ @Override public Object removeObject(Object o) { return null; } /*** * 清空緩存 */ @Override public void clear() { } /*** * 緩存的命中概率 * @return */ @Override public int getSize() { return 0; } /*** * 讀寫鎖,可以為空,寫寫互斥,讀寫互斥,讀讀共享 * @return */ @Override public ReadWriteLock getReadWriteLock() { return new ReentrantReadWriteLock(); }}
  • 因?yàn)榫彺骖愂莔ybatis使用而沒有交給spring容器托管(因?yàn)樵趍ybatis執(zhí)行這個(gè)的時(shí)候要傳入id),但是在RedisCache類中需要注入RedisTemplate,所以自定義一個(gè)獲取spring工廠中的bean的工具類。
package com.han.util;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Component;/** * @author M.han * @title: ApplicationUtils * @projectName springboot-redis * @description: 獲取spring中的bean * @date 2020/12/15 20:26 */@Componentpublic class ApplicationContextUtils implements ApplicationContextAware { private static ApplicationContext applicationContext; /*** * * @param applicationContext 已經(jīng)創(chuàng)建好的工廠對象 * @throws BeansException */ @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { ApplicationContextUtils.applicationContext = applicationContext; } //下面是自定義獲取bean /*** *根據(jù)id來獲取bean */ public static Object getBean(String id){ return applicationContext.getBean(id); } /*** * 通過類型獲取bean * @param clazz * @return */ public static Object getBean(Class clazz){ return applicationContext.getBean(clazz); } /*** * 根據(jù)id和類型同時(shí)獲取bean * @param id * @param clazz * @return */ public static Object getBean(String id,Class clazz){ return applicationContext.getBean(id,clazz); }}
  • mapper.xml文件中指定redis緩存
<?xml version="1.0" encoding="UTF-8" ?> select id,username,password from user
  • yaml文件配置信息
# 應(yīng)用名稱spring: application: name: springboot-redis01 redis: host: port: database: 0 jedis: #redis連接池信息 pool: max-active: 8 min-idle: 0 max-idle: 8 max-wait: -1 datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://--------/db?characterEncoding=utf-8&serverTimezone=GMT%2B8 username: root password: server: servlet: context-path: /redis01mybatis: mapper-locations: classpath*:com/han/dao/*.xml type-aliases-package: com.han.pojologging: level: root: info com.han.dao: debug

注意啟動(dòng)文件上添加MapperScan注解掃描。

通過以上配置,只要redis緩存中有該數(shù)據(jù),mybatis就不會(huì)執(zhí)行查詢,而是從緩存中取數(shù)據(jù)。

作者|MrHanhan|博客園

總結(jié)

以上是生活随笔為你收集整理的springboot 集成redis_一文详解Spring Boot 集成 Redis的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产情侣酒店自拍 | 国产精品久久二区 | 欧美日韩性生活 | 久久久久无码国产精品一区 | 欧美一区免费观看 | 欧美激情视频一区二区三区在线播放 | 亚洲 欧美 精品 | 午夜在线观看av | 都市激情亚洲综合 | 97伊人久久 | 女人一级一片30分 | 翔田千里88av中文字幕 | 日本美女视频 | 亚洲av无码国产精品久久 | 国产一级免费视频 | 少妇户外露出[11p] | 岛国av不卡 | 天堂在线中文资源 | 日本不卡一区二区三区 | 久色成人| 成人综合激情 | 神马一区二区三区 | 日本三级在线 | 国语播放老妇呻吟对白 | 国产精品天天狠天天看 | 夜色资源网 | 日韩一区在线观看视频 | 欧美一级不卡视频 | 在线观看污 | 四虎永久在线精品 | 欧美日日骚 | 99草视频 | 激情男女视频 | 日韩三级久久 | 国产浮力影院 | 美梦视频大全在线观看高清 | 中文字幕亚洲精品在线观看 | 色国产视频 | 精品日韩在线观看 | 国产日韩一区 | 无码一区二区三区在线观看 | 国产一区二区视频在线观看免费 | av一区二区三区免费观看 | 国产福利电影在线 | 国产精品久久久久久久久久小说 | av在线h| 狠狠操女人 | 一区二区天堂 | 国产又黄又硬又粗 | 午夜激情av在线 | 男人的av | www嫩草 | 国产精品一区二区在线免费观看 | 婷婷五月精品中文字幕 | 国产乱码精品一品二品 | 亚洲二区一区 | 奇米成人网 | 亚洲天堂av在线免费观看 | 欧美sm凌虐视频网站 | 视频免费在线 | www..com国产| 中文字幕色哟哟 | 精品二区在线观看 | 亚洲a中文字幕 | 人妖干美女 | 美女扒开腿让人桶爽 | 男女羞羞在线观看 | 特黄视频在线观看 | 黄色片免费在线播放 | 999视频在线播放 | 插我一区二区在线观看 | 精品国产一区二区不卡 | 超碰成人免费 | 亚洲国产mv | 欧美视频免费在线 | 日韩欧美激情 | 亚洲欧美国产高清 | 日韩欧美一级在线 | 一区二区三区国产在线观看 | 麻豆91在线播放 | 欧美一级射 | 日韩精品人妻无码一本 | 成人av免费网址 | 亚洲一区欧美一区 | 亚洲一区a | 性xxxx视频播放免费 | 九一国产在线 | 国产视频a| 久久草av| 极品尤物魔鬼身材啪啪仙踪林 | 99综合色| 亚洲精品视频在线播放 | 国产精品亚洲综合 | 久久亚洲少妇 | 日本不卡高字幕在线2019 | 日韩欧美一级大片 | 欧美国产日韩在线观看成人 | 欧洲熟妇精品视频 | 免费成人结看片 |