redis在springcloud中的使用

1.redis的使用場景java

 作中央緩存,經過空間換時間node

特色:快、安全、持久、可用jedis  java客戶端mysql

啓動服務命令:redis-server.exe   redis.confredis

2.優化的好處spring

每次請求都要從數據庫中查詢數據,對數據庫服務器壓力很大;sql

3.經常使用的緩存實現數據庫

jpa/mybits的二級緩存,可是不能支持集羣;因此用到了redisjson

4.怎麼實現交互緩存

前臺請求-》先從redis中查詢數據,有就之久返回數據;沒有查詢到數據就從數據庫中查詢,並同步到redis中,再返回前臺;安全

5.保證redis中數據與數據庫中的數據一致

修改時,先修改數據庫中的數據再同步到redis中

6.redis怎麼儲存對象

序列化和json字符串(採納),,,通常使用json字符串的方式

--1:存:

  就是把數據庫的數據存到redis(json字符串)

--2:取:

  就是把redis(json字符串)的數據轉換成對象

--3對象與json字符串的轉換

咱們使用到了 Alibaba:fastjson---功能很強大

7.redis的項目實戰

--導包

<!--redis的依賴-->
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>



--建立一個redis的一個工具類

/**
* pool:
* get和set
*/
public class RedisUtil {

static JedisPool jedisPool = null;

static {
GenericObjectPoolConfig poolConfig = new JedisPoolConfig();
//參數設置:
poolConfig.setMaxTotal(30);//最大鏈接數
poolConfig.setMaxIdle(10);//最大空閒數
poolConfig.setMaxWaitMillis(3*1000);//超時時間
poolConfig.setTestOnBorrow(true);//借的時候進行測試

//你在作的時候,應該丟到properties的配置文件:直接用這個工具類
String host = "127.0.0.1";
int port = 6379;
int timeout = 5 * 1000;
String password = "root";//根據本身的redis密碼進行修改
jedisPool = new JedisPool(poolConfig, host, port, timeout, password);
}
//get和set
public static void set(String key,String value){
Jedis jedis=null;
try {
jedis = jedisPool.getResource();
jedis.set(key,value);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedis != null) {
jedis.close();
}
}
}
public static String get(String key){
Jedis jedis=null;
try {
jedis = jedisPool.getResource();
return jedis.get(key);
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (jedis != null) {
jedis.close();
}
}
}
}
--controller調用set和get
@RestController
@RequestMapping("/common")
public class RedisController implements RedisClient{

@RequestMapping(value = "/redis",method = RequestMethod.POST)
@Override
public void set(@RequestParam("key") String key,@RequestParam("value") String value){
RedisUtil.set(key,value);
}


@RequestMapping(value = "/redis/{key}",method = RequestMethod.GET)
@Override
public String get(@PathVariable("key") String key){
return RedisUtil.get(key);
}
--啓動類
@SpringBootApplication
@EnableEurekaClient
public class CommonApplication8848 {

public static void main(String[] args) {
SpringApplication.run(CommonApplication8848.class);
}
}
--yml配置
server:
port: 8848//端口
max-http-header-size: 4048576 #Request header is too large異常解決
spring:
application:
name: COMMON-PRIVODER
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 127.0.0.1:9300//地址
eureka:
instance:
hostname: localhsot
prefer-ip-address: true
client:
service-url:
defaultZone: http://localhost:7001/eureka/ //註冊到註冊中心
--給內部的消費者訪問
--redisclient
@RequestMapping("/common")
@FeignClient(value = "COMMON-PRIVODER",fallbackFactory = RedisClientCallBackFactory.class)//映射的服務名:在註冊中心的服務名,告訴使用哪個託底類
public interface RedisClient {

@RequestMapping(value = "/redis",method = RequestMethod.POST)
public void set(@RequestParam("key") String key, @RequestParam("value") String value);

@RequestMapping(value = "/redis/{key}",method = RequestMethod.GET)
public String get(@PathVariable("key") String key);
}

--RedisClientCallBackFactory
@Component 
public class RedisClientCallBackFactory implements FallbackFactory<RedisClient> {

@Override
public RedisClient create(Throwable throwable) {
return new RedisClient() {
@Override
public void set(String key, String value) {

}

@Override
public String get(String key) {
return null;
}
};
}
}
--消費者
--依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>


--service
* 使用中央緩存:
* 先從redis根據一個key獲取:
* 1:沒有:從mysql獲取,放入redis,並返回
* 2:有:就直接返回
--抽取常量
public class GlobalConstant {

//redis的:商品分類的key
public static final String TREE_DATA="tree_data";
public static final String PAGE_MODEL="page_model";//頁面靜態須要的數據
public static final String TEMPLATE_FILE="template_file";//頁面靜態須要的模板路徑
public static final String TARGET_FILE="target_file";//頁面靜態生成的靜態頁面路
}
 
@Override
public List<ProductType> treeData() {

//常量:
String treeDataRedis = redisClient.get(GlobalConstant.TREE_DATA);
if(StringUtils.isEmpty(treeDataRedis)){
//1:沒有:從mysql獲取,放入redis,並返回
redisClient.set(GlobalConstant.TREE_DATA,JSON.toJSONString(productTypes));//對象轉換成json字符串
System.out.println("========mysql========");
return productTypes;
}else{
// 2有:就直接返回
System.out.println("=====cache==========");
return JSON.parseArray(treeDataRedis,ProductType.class);//json字符串轉成對象 }}
相關文章
相關標籤/搜索