代码实现
@Component
public class UserInfoCacheData extends IValueRedisService<List<String>> {
@Override
protected String getRedisKey() {
return 'USER_INFO';
}
}
@Component
public class UserCacheUtils {
private static final Logger logger = LoggerFactory.getLogger(UserCacheUtils.class);
@Autowired
private UserInfoCacheData userInfoCacheData;
public Boolean existsKey(String uid) {
String key = getKey(uid);
List<String> uids = userInfoCacheData.get(key);
if (uids == null || uids.size() == 0) {
return false;
}
return uids.contains(uid);
}
public String setKey(String uid) {
String key = getKey(uid);
// 用List改动代码较少,用Set更合理
List<String> uids = userInfoCacheData.get(key);
logger.info("uids:" + uids);
if (uids == null) {
uids = new ArrayList<>();
}
if (!uids.contains(uid)) {
logger.info("new add uid:" + uid);
uids.add(uid);
userInfoCacheData.put(key, uids);
}
return key;
}
public Set<String> getKeys() {
return userInfoCacheData.keys();
}
public List<String> getByKey(String uid) {
String key = getKey(uid);
return userInfoCacheData.get(key);
}
public String removeByKey(String uid) {
String key = getKey(uid);
List<String> uids = getByKey(key);
if(uids.contains(uid)){
list=list.stream().filter(item->!item.equals(uid)).collect(Collectors.toList());
}
if(uids.size()>0){
//将原来key中保存的内容替换
userInfoCacheData.put(key, uids);
}else{
//列表中不包含任何元素时,删除这个key
userInfoCacheData.remove(key);
}
return key;
}
public String getKey(String str) {
String prefix = "_group";
return prefix + getHashKey(str);
}
public int getHashKey(String str) {
return (str.hashCode() & Integer.MAX_VALUE) % 50;
}
}
思考
1.当前将一个大Key拆分为100个相对小Key,在运行过程中发现拆分小Key的数据量少了,是否可以增加?增加的话如何增加?
历史记录
2023-12-08 15:10更新
removeByKey() 原来为
public String removeByKey(String uid) {
String key = getKey(uid);
userInfoCacheData.remove(key);
return key;
}
更改为
public String removeByKey(String uid) {
String key = getKey(uid);
List<String> uids = getByKey(key);
if(uids.contains(uid)){
list=list.stream().filter(item->!item.equals(uid)).collect(Collectors.toList());
}
if(uids.size()>0){
//将原来key中保存的内容替换
userInfoCacheData.put(key, uids);
}else{
//列表中不包含任何元素时,删除这个key
userInfoCacheData.remove(key);
}
return key;
}
更改原因:1.0方法删除key,会直接将整个分组中的元素全部删除掉,不符合要求。