redis拆分大key

代码实现

@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,会直接将整个分组中的元素全部删除掉,不符合要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值