標籤:整合 imp 頻繁 resource process end pool org iss
Redis程式使用它?
Jedis 訪問redis java api
Redis-server & //後台運行
防火牆要關閉
ts-parent的pom.xml加上jedis依賴
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.6.0</version>
</dependency>
編寫測試類別
package jedis;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class TestJedis {
@Test
public void jedis(){
//串連redis伺服器,ip+port
String ip = "192.168.27.113";
//擷取到jedis對象
Jedis jedis = new Jedis(ip, 6379);
//調用redis set,key=name,value=tony
//jedis.set("name", "tony");
System.out.println(jedis.get("name"));
}
}
package jedis;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
public class TestJedis {
@Test
public void jedis(){
//串連redis伺服器,ip+port
String ip = "192.168.27.113";
//擷取到jedis對象
Jedis jedis = new Jedis(ip, 6379);
//調用redis set,key=name,value=tony
//jedis.set("name", "tony");
System.out.println(jedis.get("name"));
}
@Test//分區Shard池化
public void sharded(){
//建立一個Sharded池設定物件
JedisPoolConfig config = new JedisPoolConfig();
//最大的串連數
config.setMaxTotal(50);
//串連多個redis節點,ip和port的資訊
List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
//一個的節點資訊就ok
JedisShardInfo info1 =
new JedisShardInfo("192.168.27.113",6379);
shards.add(info1);
//建立分區池
ShardedJedisPool pool =
new ShardedJedisPool(config, shards);
//從池中擷取一個jedis連結
ShardedJedis jedis = pool.getResource();
System.out.println(jedis.get("name"));
}
}
把jedis和spring架構整合
通過xml配置把jedis的對象建立交給spring架構。
在哪裡使用緩衝?
package cn.tedu.store.service;
import java.io.IOException;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import cn.tedu.store.bean.dict.Area;
import cn.tedu.store.bean.dict.City;
import cn.tedu.store.bean.dict.Province;
import cn.tedu.store.mapper.DictMapper;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
@Service("dictService")
public class DictServiceImpl implements DictService {
@Resource
private DictMapper dictMapper;
//擷取spring架構建立的jedis對象
@Resource
private ShardedJedisPool shardedJedisPool;
//轉換對象到json或者json到java對象工具類
private static final ObjectMapper MAPPER = new ObjectMapper();
public List<Province> getProvinceList() {
return dictMapper.getProvinceList();
}
public List<City> getCityList(String provinceCode){
List<City> cityList = null;
//設定redis key的規則
String KEY = "TS_CITY_"+provinceCode;
//由池中擷取jedis對象
ShardedJedis jedis = shardedJedisPool.getResource();
//1.從redis中擷取資料,如果有資料直接返回
//注意set設定2次就會被覆蓋
if(jedis.exists(KEY)){//判斷key是否存在
String json = jedis.get(KEY);
JsonNode jsonNode;
try {
//從緩衝中擷取資料,然後把json轉成java對象,然後直接返回,無需訪問資料庫
jsonNode = MAPPER.readTree(json);
Object obj = MAPPER.readValue(jsonNode.traverse(),
MAPPER.getTypeFactory().constructCollectionType(List.class, City.class));
return (List<City>) obj; //減輕資料庫訪問壓力
} catch (Exception e) {
e.printStackTrace();
}
}else{
//傳統方式直接從資料庫讀取資料
cityList = dictMapper.getCityList(provinceCode);
//2.第一訪問時redis沒有值,必須從資料庫中擷取值後,把值放入redis
//把java list集合轉成字串json
try {
String json = MAPPER.writeValueAsString(cityList);
jedis.set(KEY, json);
return cityList;
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
public List<Area> getAreaList(String cityCode) {
return dictMapper.getAreaList(cityCode);
}
public String getProvinceNameByCode(String provinceCode) {
return dictMapper.getProvinceNameByCode(provinceCode);
}
public String getCityNameByCode(String cityCode) {
return dictMapper.getCityNameByCode(cityCode);
}
public String getAreaNameByCode(String areaCode) {
return dictMapper.getAreaNameByCode(areaCode);
}
}
Redis緩衝應用注意點:
1、是不是所有的資料都能放在緩衝中?
Reids能否替代mysql
當然不是,
緩衝是存放熱點資料,不會頻繁修改的資料!!
記憶體掉電會有什麼問題?
資料丟失。Redis每秒鐘會自動存檔c++。MemCache
Jedis+Redis+spring緩衝