Browse Source

分布式本地缓存

master
陈裕财 3 years ago
parent
commit
80cde2df58
  1. 5
      xm-core/src/main/java/com/xm/core/ctrl/XmProjectStateController.java
  2. 42
      xm-core/src/main/java/com/xm/core/service/cache/XmProductCacheService.java
  3. 43
      xm-core/src/main/java/com/xm/core/service/cache/XmProjectCacheService.java
  4. 70
      xm-core/src/main/java/com/xm/core/service/cache/sub/CacheMessageListener.java
  5. 65
      xm-core/src/main/java/com/xm/core/service/cache/sub/CahceChannelConfig.java

5
xm-core/src/main/java/com/xm/core/ctrl/XmProjectStateController.java

@ -139,11 +139,10 @@ public class XmProjectStateController {
Map<String,Object> m = new HashMap<>();
RequestUtils.transformArray(xmProductState, "ids");
PageUtils.startPage(xmProductState);
List<Map<String,Object>> xmProjectStateList = projectCacheService.getPortalProjectStates(); //列出XmProductState列表
List<Map<String,Object>> xmProjectStateList =null; //列出XmProductState列表
if(xmProjectStateList==null){
xmProjectStateList=xmProjectStateService.selectPortalProjectStates(xmProductState);
projectCacheService.putPortalProjectStates(xmProjectStateList);
}
}
PageUtils.responePage(m, xmProjectStateList);
m.put("data",xmProjectStateList);
Tips tips=new Tips("查询成功");

42
xm-core/src/main/java/com/xm/core/service/cache/XmProductCacheService.java

@ -1,13 +1,14 @@
package com.xm.core.service.cache;
import com.mdp.mq.sp.Publish;
import com.xm.core.entity.XmProduct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
@Service
@ -15,6 +16,12 @@ public class XmProductCacheService {
@Autowired
RedisTemplate redisTemplate;
Map<String,XmProduct> cache=new ConcurrentHashMap<>();
@Autowired
Publish publish;
String currDateKey="";
public String getKey(){
Calendar currCal=Calendar.getInstance();
@ -30,34 +37,37 @@ public class XmProductCacheService {
String getCacheKey() {
return "xm_product";
}
public void putProduct(String productId,XmProduct Product){
public void putProduct(String productId,XmProduct product){
String key=this.getKey();
String hashKey=productId;
redisTemplate.opsForHash().put(key, hashKey, Product);
redisTemplate.opsForHash().put(key, hashKey, product);
cache.put(productId,product);
publish.push("XM_PRODUCT_CACHE",productId);
}
public XmProduct getProduct(String productId){
String key=this.getKey();
String hashKey=productId;
return (XmProduct) redisTemplate.opsForHash().get(key, hashKey);
XmProduct product=cache.get(productId);
if(product==null){
String key=this.getKey();
String hashKey=productId;
product= (XmProduct) redisTemplate.opsForHash().get(key, hashKey);
cache.put(productId,product);
return product;
}else {
return product;
}
}
public void clear(String productId){
String key=this.getKey();
cache.remove(productId);
redisTemplate.opsForHash().delete(key,productId);
}
public void putPortalProductStates(List<Map<String,Object>> products){
String key=this.getKey();
String hashKey="portal";
redisTemplate.opsForHash().put(key, hashKey, products);
publish.push("XM_PRODUCT_CACHE",productId);
}
public List<Map<String,Object>> getPortalProductStates(){
String key=this.getKey();
String hashKey="portal";
return (List<Map<String,Object>>) redisTemplate.opsForHash().get(key, hashKey);
public void clearLocalCache(String productId) {
this.cache.remove(productId);
}
}

43
xm-core/src/main/java/com/xm/core/service/cache/XmProjectCacheService.java

@ -1,13 +1,14 @@
package com.xm.core.service.cache;
import com.mdp.mq.sp.Publish;
import com.xm.core.entity.XmProject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
@Service
@ -16,6 +17,12 @@ public class XmProjectCacheService {
@Autowired
RedisTemplate redisTemplate;
String currDateKey="";
Map<String, XmProject> cache=new ConcurrentHashMap<>();
@Autowired
Publish publish;
public String getKey(){
Calendar currCal=Calendar.getInstance();
String dateKey=currCal.get(Calendar.YEAR)+"-"+currCal.get(Calendar.DAY_OF_YEAR);
@ -30,29 +37,35 @@ public class XmProjectCacheService {
String getCacheKey() {
return "xm_project";
}
public void putProject(String projectId,XmProject Project){
public void putProject(String projectId,XmProject project){
String key=this.getKey();
String hashKey=projectId;
redisTemplate.opsForHash().put(key, hashKey, Project);
redisTemplate.opsForHash().put(key, hashKey, project);
this.cache.put(projectId,project);
}
public XmProject getProject(String projectId){
String key=this.getKey();
String hashKey=projectId;
return (XmProject) redisTemplate.opsForHash().get(key, hashKey);
XmProject project=cache.get(projectId);
if(project==null) {
String key = this.getKey();
String hashKey = projectId;
project= (XmProject) redisTemplate.opsForHash().get(key, hashKey);
cache.put(projectId,project);
return project;
}else{
return project;
}
}
public void putPortalProjectStates(List<Map<String,Object>> projects){
public void clear(String projectId){
String key=this.getKey();
String hashKey="portal";
redisTemplate.opsForHash().put(key, hashKey, projects);
}
cache.remove(projectId);
redisTemplate.opsForHash().delete(key,projectId);
public List<Map<String,Object>> getPortalProjectStates(){
String key=this.getKey();
String hashKey="portal";
return (List<Map<String,Object>>) redisTemplate.opsForHash().get(key, hashKey);
publish.push("XM_PROJECT_CACHE",projectId);
}
public void clearLocalCache(String projectId) {
this.cache.remove(projectId);
}
}

70
xm-core/src/main/java/com/xm/core/service/cache/sub/CacheMessageListener.java

@ -0,0 +1,70 @@
package com.xm.core.service.cache.sub;
import com.xm.core.service.cache.XmProductCacheService;
import com.xm.core.service.cache.XmProjectCacheService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@Service
public class CacheMessageListener implements MessageListener {
RedisSerializer<String> stringSerializer=RedisSerializer.string();
@Autowired
StringRedisTemplate redisTemplate;
@Autowired
XmProductCacheService xmProductCacheService;
@Autowired
XmProjectCacheService xmProjectCacheService;
private static final Logger logger = LoggerFactory.getLogger(CacheMessageListener.class);
/*定时心跳*/
@Scheduled(cron = "0/10 * * * * *")
public void timer() {
redisTemplate.convertAndSend("XM_PRODUCT_CACHE", "");
redisTemplate.opsForValue().set("headbea", "1");
}
@Override
public void onMessage(Message message, byte[] pattern) {
try {
// TODO Auto-generated method stub
String msg=message.toString();
logger.debug("消息下行开始----》"+msg);
//logger.debug(msg);
//心跳包
if("".equals(msg)||"\"\"".equals(msg)) {
return;
}
String channelName=stringSerializer.deserialize(pattern);
if(channelName.startsWith("XM_PRODUCT")) {
xmProductCacheService.clearLocalCache(msg);
}else if(channelName.startsWith("XM_PROJECT")) {
xmProjectCacheService.clearLocalCache(msg);
}else if(channelName.startsWith("XM_GROUP")) {
}
} catch (Exception e) {
logger.error("",e);
}finally {
logger.debug("消息下行结束!!!!!!!!");
}
}
}

65
xm-core/src/main/java/com/xm/core/service/cache/sub/CahceChannelConfig.java

@ -0,0 +1,65 @@
package com.xm.core.service.cache.sub;
import com.mdp.mq.sp.ChannelConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.Topic;
@Configuration
public class CahceChannelConfig implements ChannelConfig {
RedisMessageListenerContainer container;
@Autowired
CacheMessageListener messageListener;
@Override
public RedisMessageListenerContainer container(RedisMessageListenerContainer container) {
// TODO Auto-generated method stub
this.container=container;
container.addMessageListener(messageListener, topic("XM_PRODUCT_CACHE"));
container.addMessageListener(messageListener, topic( "XM_PROJECT_CACHE"));
container.addMessageListener(messageListener, topic( "XM_GROUP_CACHE"));
return container;
}
public void setMessageListener(MessageListener messageListener,Topic topic){
container.addMessageListener(messageListener, topic);
}
Topic topic(String channelName){
ChannelTopic topic=new ChannelTopic(channelName);
return topic;
}
@Override
public void removeMessageListener(MessageListener messageListener, Topic topic) {
container.removeMessageListener(messageListener,topic);
}
@Override
public void removeMessageListener(MessageListener messageListener) {
container.removeMessageListener(messageListener);
}
@Override
public void removeMessageListener(String listenerName,Topic topic) {
container.removeMessageListener(messageListener,topic);
}
@Override
public void addMessageListener(String listenerName, Topic topic) {
container.addMessageListener(messageListener,topic);
}
}
Loading…
Cancel
Save