Skip to content

Commit

Permalink
关于Redis热点key的一些思考
Browse files Browse the repository at this point in the history
  • Loading branch information
hupengfei123 committed Jul 10, 2019
1 parent 14faab8 commit 6e195a8
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
}
BeanDefinitionBuilder containerBeanDefinitionBuilder = BeanDefinitionBuilder
.genericBeanDefinition(RedisMessageListenerContainer.class);
//设置单机监听主节点的配置
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(node.getHost(),node.getPort());
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration);
lettuceConnectionFactory.afterPropertiesSet();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,23 @@
package com.example.springredis;

import com.example.springredis.hotkey.HotKey;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class SpringRedisApplication {

public static void main(String[] args) {
SpringApplication.run(SpringRedisApplication.class, args);
}


@RequestMapping("/hotkey/{key}")
public String getHotKey(@PathVariable String key){
return HotKey.getHotValue(key);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.example.springredis.hotkey;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;

/**
* @program: springBootPractice
* @description:
* @author: hu_pf
* @create: 2019-07-09 18:02
**/
public class HotKey {

private static Map<String,String> hotKeyMap = new ConcurrentHashMap<>();
private static List<String> hotKeyList = new CopyOnWriteArrayList<>();

static {
setHotKey("hu1","1");
setHotKey("hu2","2");
}

public static void setHotKey(String key,String value){
hotKeyMap.put(key,value);
hotKeyList.add(key);
}

public static void updateHotKey(String key,String value){
hotKeyMap.put(key,value);
}

public static String getHotValue(String key){
return hotKeyMap.get(key);
}

public static void removeHotKey(String key){
hotKeyMap.remove(key);
}

public static boolean containKey(String key){
return hotKeyList.contains(key);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.example.springredis.hotkey;


public enum HotKeyAction {

UPDATE(){
@Override
public void action(String key, String value) {
HotKey.updateHotKey(key,value);
}
},
REMOVE(){
@Override
public void action(String key, String value) {
HotKey.removeHotKey(key);
}
};
public abstract void action(String key,String value);
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,44 @@
package com.example.springredis.redis;

import com.example.springredis.hotkey.HotKey;
import com.example.springredis.hotkey.HotKeyAction;
import lombok.extern.slf4j.Slf4j;
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.RedisTemplate;
import org.springframework.stereotype.Component;


@Slf4j
@Component
public class KeyExpiredEventMessageListener implements MessageListener {

@Autowired
private RedisTemplate redisTemplate;

@Override
public void onMessage(Message message, byte[] pattern) {
String key = new String(message.getChannel());
key = key.substring(key.indexOf(":")+1);
String action = new String(message.getBody());
if (HotKey.containKey(key)){
String value = redisTemplate.opsForValue().get(key)+"";
switch (action){
case "set":
log.info("热点Key:{} 修改",key);
HotKeyAction.UPDATE.action(key,value);
break;
case "expired":
log.info("热点Key:{} 到期删除",key);
HotKeyAction.REMOVE.action(key,null);
break;
case "del":
log.info("热点Key:{} 删除",key);
HotKeyAction.REMOVE.action(key,null);
break;
}
}
log.info("监听到的信息:{},值是:{}", new String(message.getChannel()), new String(message.getBody()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnection;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.Jedis;

@Configuration
Expand Down Expand Up @@ -48,4 +50,15 @@ public RedisMessageListenerFactory redisMessageListenerFactory(BeanFactory beanF
return beans;
}
}

@Bean
public RedisTemplate<String,String> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String,String> redisTemplate=new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}

}

0 comments on commit 6e195a8

Please sign in to comment.