當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
SpringBoot 使用jedis整合redis实现缓存处理
生活随笔
收集整理的這篇文章主要介紹了
SpringBoot 使用jedis整合redis实现缓存处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 簡介
- redis基本結構:
- 代碼實現
- 1.新建Springboot項目,添加必要的依賴 pom.xml:
- 2. 在application.yml配置文件中添加 redis的相關配置
- 3.SpringBoot 添加 自定義 redis 配置類
- 4.創建redis工具類
- 5.User 實體類
- 6.redis使用實例(以存取為例):
- 7.啟動項目,進行測試
簡介
Redis 是完全開源的,遵守 BSD 協議,是一個高性能的 key-value 數據庫。
Redis 與其他 key - value 緩存產品有以下三個特點:
- Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
- Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
- Redis支持數據的備份,即master-slave模式的數據備份。
redis基本結構:
- String: 字符串
- Hash: 散列
- List: 列表
- Set: 集合
- Sorted Set: 有序集合
代碼實現
1.新建Springboot項目,添加必要的依賴 pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>org.springblade</groupId><artifactId>spd-hisserview-ymf</artifactId><version>0.0.1-SNAPSHOT</version><name>spd-hisserview-ymf</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><!-- 多數據源配置--><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.3.1</version></dependency><!-- mysql依賴--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- 引入 redis 依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><!-- 默認指定了lettuce,我們需要排除 ,并且引入jedis的客戶端--><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions></dependency><!-- jedis的客戶端 --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><!--sqlserver數據庫JDBC連接依賴--><dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>sqljdbc4</artifactId><version>4.0</version></dependency><!--MyBatisPlus啟動依賴--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency><!--Oracle數據庫JDBC連接依賴--><dependency><groupId>com.oracle</groupId><artifactId>ojdbc7</artifactId><version>12.2.0.1</version></dependency><!--JUNIT測試相關--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>2. 在application.yml配置文件中添加 redis的相關配置
server:port: 81spring:redis:#Redis配置host: 127.0.0.1##redis端口號port: 6379##redis密碼password:##redis連接超時時間(毫秒)timeout: 60000##Redis默認情況下有16個分片,這里配置具體使用的分片,默認時0database: 10application:name: viewServicedatasource:dynamic:primary: bdsz #設置默認的數據源或者數據源組,默認值即為masterstrict: true #設置嚴格模式,默認false不啟動. 啟動后在未匹配到指定數據源時候會拋出異常,不啟動則使用默認數據源.datasource:bdsz:driver-class-name: oracle.jdbc.driver.OracleDriver# 本地連接url: jdbc:oracle:thin:@//localhost:1521/orclusername: SYSTEMpassword: 961008Dyh# 遠程連接 # url: jdbc:oracle:thin:@//100.100.100.45:1521/PDBORCL # username: BDFPQS # password: BDFPQS123456szey:driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver# 本地連接url: jdbc:sqlserver://localhost:1433;databaseName=testusername: sapassword: 961008# 遠程連接 # url: jdbc:sqlserver://192.168.170.186:1433;databaseName=HERP # username: hrp_ymf # password: hrp_ymf#mybatis-plus配置控制臺打印完整帶參數SQL語句 mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpltenantId:szey: 100000bdsz: 2000003.SpringBoot 添加 自定義 redis 配置類
package org.springblade.config;/*** @ClassName: RedisConfig* @author: 〆、dyh* @since: 2022/4/2 15:36*/import lombok.Data; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.util.StringUtils; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig;/*** 使用jedis整合redis*/ @Data @Configuration public class RedisConfig {private static Logger logger = LoggerFactory.getLogger(RedisConfig.class);@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private int port;@Value("${spring.redis.password}")private String password;@Value("${spring.redis.timeout}")private int timeout;@Beanpublic JedisPool redisPoolFactory() throws Exception {logger.info("JedisPool 注入成功!");logger.info("redis地址:" + host + ":" + port);JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();//是否啟用pool的jmx管理功能,默認truejedisPoolConfig.setJmxEnabled(true);JedisPool JedisPool;if (StringUtils.hasText(password)) {JedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password);} else {JedisPool = new JedisPool(jedisPoolConfig, host, port, timeout);}logger.info("JedisPool:" + JedisPool);return JedisPool;} }4.創建redis工具類
package org.springblade.util;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool;import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Map;/*** @ClassName: RedisUtil* @author: 〆、dyh* @since: 2022/4/2 15:43*/@Component public class RedisUtil {@Autowiredprivate JedisPool jedisPool;@Value("${spring.redis.database}")private String database;//設置為0就是永不過期 單位秒private int expire = 0;/*** 獲取Jedis實例** @return*/public synchronized Jedis getJedis() {try {if (jedisPool != null) {Jedis resource = jedisPool.getResource();resource.select(Integer.parseInt(database)); //設置為第10個庫(db) spring.redis.databasereturn resource;} else {System.out.println("獲取的Redis鏈接為null");return null;}} catch (Exception e) {e.printStackTrace();System.out.println("獲取Redis鏈接出錯:" + e.getMessage());return null;}}/*** get value from redis** @param key* @return*/public byte[] get(byte[] key) {Jedis jedis = getJedis();byte[] value = null;try {value = jedis.get(key);} finally {jedis.close();}return value;}/*** get value from redis** @param key* @return*/public String get(String key) {Jedis jedis = getJedis();String value = null;try {value = jedis.get(key);} finally {jedis.close();}return value;}/*** set** @param key* @param value* @return*/public void set(byte[] key, byte[] value) {Jedis jedis = getJedis();try {jedis.set(key, value);if (expire != 0) {jedis.expire(key, expire);}} finally {jedis.close();}}/*** set** @param key* @param value* @return*/public void set(String key, String value) {Jedis jedis = getJedis();try {jedis.set(key, value);if (expire != 0) {jedis.expire(key, expire);}} finally {jedis.close();}}/*** set** @param key* @param value* @param expire* @return*/public void set(byte[] key, byte[] value, int expire) {Jedis jedis = getJedis();try {jedis.set(key, value);if (expire != 0) {jedis.expire(key, expire);}} finally {jedis.close();}}/*** 添加key=String,value=HashMap<String,String>類型的數據 hmset** @param key* @param inMap* @param expire 生命周期 單位秒*/public void hmset(String key, Map<String, String> inMap, int expire) {Jedis jedis = getJedis();try {jedis.hmset(key, inMap);if (expire != 0) {jedis.expire(key, expire);}} finally {jedis.close();}}/*** 獲取value類型為HashMap<String,String>類型的數據** @param key* @return*/public Map<String, String> hgetAll(String key) {Jedis jedis = getJedis();Map<String, String> value = null;try {value = jedis.hgetAll(key);} finally {jedis.close();}return value;}/*** del** @param key*/public void del(byte[] key) {Jedis jedis = getJedis();try {jedis.del(key);} finally {jedis.close();}}/*** del** @param key*/public void del(String key) {Jedis jedis = getJedis();try {jedis.del(key);} finally {jedis.close();}}/*** 判斷指定鍵是否存在** @param key* @return*/public boolean exists(String key) {Jedis jedis = getJedis();boolean flag = jedis.exists(key);jedis.close();return flag;}/*** 獲取key對應的值剩余存活時間** @param key* @return 正數:剩余的時間(秒) 負數:已過期*/public Long ttlKey(String key) {Jedis jedis = getJedis();try {return jedis.ttl(key);} catch (Exception e) {System.out.println(" -- Redis 獲取key對應的值剩余存活時間出錯,出錯原因:" + e);e.printStackTrace();return 0L;} finally {jedis.close();}}/*** 獲取key對應的值剩余存活時間** @param key* @return 正數:剩余的時間(秒) 負數:已過期*/public Long ttlKey(byte[] key) {Jedis jedis = getJedis();try {return jedis.ttl(key);} catch (Exception e) {System.out.println(" -- Redis 獲取key對應的值剩余存活時間出錯,出錯原因:" + e);e.printStackTrace();return 0L;} finally {jedis.close();}}/*** 存儲對象** @param key* @param obj* @param expire*/public void setObject(String key, Object obj, int expire) {Jedis jedis = getJedis();byte[] data = ObjTOSerialize(obj);jedis.set(key.getBytes(), data);if (expire != 0) {jedis.expire(key, expire);}jedis.close();}/*** 獲取對象** @param key* @return*/public Object getObject(String key) {Jedis jedis = getJedis();byte[] data = jedis.get(key.getBytes());Object obj = null;if (data != null) {obj = unSerialize(data);}jedis.close();return obj;}/*** 序列化一個對象** @param obj* @return*/public byte[] ObjTOSerialize(Object obj) {ObjectOutputStream oos = null;ByteArrayOutputStream byteOut = null;try {byteOut = new ByteArrayOutputStream();oos = new ObjectOutputStream(byteOut);oos.writeObject(obj);byte[] bytes = byteOut.toByteArray();return bytes;} catch (Exception e) {System.out.println("-- Redis序列化對象出錯:" + e);e.printStackTrace();}return null;}/*** 反序列化一個對象** @param bytes* @return*/public Object unSerialize(byte[] bytes) {ByteArrayInputStream in = null;try {in = new ByteArrayInputStream(bytes);ObjectInputStream objIn = new ObjectInputStream(in);return objIn.readObject();} catch (Exception e) {System.out.println("-- Redis反序列化對象出錯:" + e);e.printStackTrace();}return null;} }5.User 實體類
package org.springblade.entity;import lombok.Data;import java.io.Serializable;import lombok.Data;import java.io.Serializable;/*** @ClassName: User * @author: 〆、dyh* @since: 2022/4/3 19:58*/ @Data public class User implements Serializable {/*** 序列化*/private static final long serialVersionUID = -4938532764925446470L;private Integer user_id;private String openid;private String user_name;private String user_phone; }6.redis使用實例(以存取為例):
在需要redis存取的類中,注入RedisUtil ,然后使用 redisUtil 對象調用 存取 方法。
package org.springblade.controller;import org.springblade.entity.User; import org.springblade.util.RedisUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import java.util.Map;/*** @ClassName: UserController* @author: 〆、dyh* @since: 2022/4/3 19:58*/@RestController @RequestMapping("/user") public class UserController {/*** 初始3rd_session有效期 單位s 有效期為一天*/private static final int expire = 60 * 60 * 24;/*** 注入 RedisUtil*/@Autowiredprivate RedisUtil redisUtil;/*** 獲取用戶策略:先從緩存中獲取用戶,沒有則取數據表中的數據,再將數據寫入緩存** @param userId* @return*/@GetMapping("/getData")public Map<String, String> getUserInfoById(String userId) {String userKey = "user_" + userId;//從redis存儲中取所需數據Map<String, String> redisDataMap = redisUtil.hgetAll(userKey);if (redisDataMap == null || redisDataMap.size() == 0) {System.out.println("緩存不存在");//緩存不存在//模擬從數據庫中獲取用戶信息User userInfo = new User();userInfo.setUser_id(1);userInfo.setUser_name("張三");userInfo.setUser_phone("15720821396");//把用戶信息存入redis中redisDataMap.put("user_id", String.valueOf(userInfo.getUser_id()));redisDataMap.put("user_name", String.valueOf(userInfo.getUser_name()));redisDataMap.put("user_phone", String.valueOf(userInfo.getUser_phone()));//插入緩存redisUtil.hmset(userKey, redisDataMap, expire);} else {System.out.println("緩存存在,用戶信息:" + redisDataMap.toString());}return redisDataMap;} }7.啟動項目,進行測試
在瀏覽器中輸入http://localhost:81/user/getData?userId=1,第一次訪問:
再次訪問:
總結
以上是生活随笔為你收集整理的SpringBoot 使用jedis整合redis实现缓存处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android获取两条线之间的夹角度数
- 下一篇: tf的基本数学运算