redis zremove删除不掉【bug】
前言
2024-4-14 22:47:52
以下内容源自《【bug】》
仅供学习交流使用
版权
禁止其他平台发布时删除以下此话
本文首次发布于CSDN平台
作者是CSDN@日星月云
博客主页是https://blog.csdn.net/qq_51625007
禁止其他平台发布时删除以上此话
redis zremove删除不掉
问题未解决
有没有大佬啊~
错误产生
redis zremove删除不掉
我看调试之后
在redis源码中
这个rawKey 和 rawValue
add和remove方法中是一致的
但是remove返回0
@Override
public Boolean add(K key, V value, double score) {
byte[] rawKey = rawKey(key);
byte[] rawValue = rawValue(value);
return execute(connection -> connection.zAdd(rawKey, score, rawValue), true);
}
@Override
public Long remove(K key, Object... values) {
byte[] rawKey = rawKey(key);
byte[][] rawValues = rawValues(values);
return execute(connection -> connection.zRem(rawKey, rawValues), true);
}
相关资源
方法调用
测试入口
@Test
public void test2() {
System.out.println("1.");
testAddData5();
System.out.println("2.");
testRemoveData5();
}
测试调用
@Test
public void testAddData5(){
EldData eldData=new GeneralData(1.8,60);
eldData.setDate(date);
dataService.addData(userId,action,eldData);
testSearchMap(action);
}
@Test
public void testRemoveData5() {
EldData eldData=new GeneralData(1.8,60);
eldData.setDate(date);
System.out.println(dataService.removeData(userId, eldData));
testSearchMap(action);
}
@Test
public void testSearchMap(String action){
HashMap<String, ArrayList> map = dataService.searchMap(userId,action);
System.out.println(map);
}
Service查询
//返回数据链表
public HashMap<String,ArrayList> searchMap(Integer userId,String action){
HashMap<String,ArrayList> map=new LinkedHashMap<>();
List<EldData> dataList = search(userId,action);
Class<?> dataClass=null;
switch (action){
case "General": dataClass= GeneralData.class; break;
case "BloodPressure": dataClass= BloodPressureData.class; break;
case "BloodRoutine": dataClass= BloodRoutineData.class; break;
case "LiverFunction": dataClass= LiverFunctionData.class; break;
case "RenalFunction": dataClass= RenalFunctionData.class; break;
case "BloodLipid": dataClass= BloodLipidData.class; break;
case "BloodGlucose": dataClass= BloodGlucoseData.class; break;
default: throw new BusinessException(PARAMETER_ERROR,"参数错误");
}
// 获取 EldData 子类的所有被ChineseName注解的属性名
List<String> fieldNames = new ArrayList<>();
Field[] subDataFields = dataClass.getDeclaredFields();
for (Field field : subDataFields) {
//添加是否有注解的判断
ChineseName chineseNameAnnotation = field.getAnnotation(ChineseName.class);
if (chineseNameAnnotation!=null){
fieldNames.add(field.getName());
map.put(field.getAnnotation(ChineseName.class).value(), new ArrayList<>());
}
}
//添加父类EldData的属性
List<String> eldDataFieldNames = new ArrayList<>();
Class<?> eldDataClass=EldData.class;
Field[] eldDataFields = eldDataClass.getDeclaredFields();
for (Field field : eldDataFields) {
//添加是否有注解的判断
ChineseName chineseNameAnnotation = field.getAnnotation(ChineseName.class);
if (chineseNameAnnotation!=null){
eldDataFieldNames.add(field.getName());
map.put(field.getAnnotation(ChineseName.class).value(), new ArrayList<>());
}
}
for (EldData data : dataList) {
//添加子类的链表
for (String fieldName : fieldNames) {
try {
Field field = dataClass.getDeclaredField(fieldName);
field.setAccessible(true);
ArrayList<Object> rowData =map.get(field.getAnnotation(ChineseName.class).value());
rowData.add(field.get(data));
map.put(field.getAnnotation(ChineseName.class).value(),rowData);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
//添加父类的链表
for (String fieldName : eldDataFieldNames) {
try {
Field field = eldDataClass.getDeclaredField(fieldName);
field.setAccessible(true);
ArrayList<Object> rowData =map.get(field.getAnnotation(ChineseName.class).value());
rowData.add(field.get(data));
map.put(field.getAnnotation(ChineseName.class).value(),rowData);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
}
return map;
}
//搜索数据
public List<EldData> search(Integer userId,String action) {
String key= ELD_DATA +action+":"+userId;
Set set = redisTemplate.opsForZSet().reverseRange(key, 0, limit-1);// 获取分数最高的limit个数据
if(set==null){
return new ArrayList<>();
}
ArrayList<EldData> resList = new ArrayList<>(set);
Collections.reverse(resList);
return resList;
}
Service增删改
// 将数据存储到有序集合中,分数为日期的时间戳
public boolean addData(Integer userId, String action,EldData data) {
String key= ELD_DATA + action + ":" + userId;
return redisTemplate.opsForZSet().add(key, data,data.getDate().getTime());
}
// 更新数据,先删除数据,后增加新数据
public boolean updateData(Integer userId,EldData oldData,EldData newData) {
long res=removeData(userId,oldData);
if (res==0){
//没有旧数据,就修改失败
return false;
}
return addData(userId, "",newData);
}
// 删除指定的数据
public long removeData(Integer userId, EldData data) {
String key= ELD_DATA +userId;
return redisTemplate.opsForZSet().remove(key, data);
}
注解
package com.jsss.echarts.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 如果某个属性需要前端展示,就添加`ChineseName`注解 <br>
* 如果某个属性是横轴数据,其`value`值是`datax` <br>
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ChineseName {
//中文name
String value();
}
实体类EldData
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class EldData {
//横轴的注解的值是datax
@ChineseName("datax")
Date date;
}
实体类GeneralData
package com.jsss.echarts.entity;
import com.jsss.echarts.annotation.ChineseName;
import lombok.*;
import java.sql.Date;
import java.text.DecimalFormat;
import java.util.Objects;
/**
* 通用数据
*/
@Data
@NoArgsConstructor
@ToString
@EqualsAndHashCode
public class GeneralData extends EldData{
@ChineseName("通用-身高(米)")
Double HT;
@ChineseName("通用-体重(千克)")
Integer WT;
@ChineseName("通用-身高体重指数(千克/米2)")
Double BMI;
public GeneralData(Double HT, Integer WT) {
this.HT = HT;
this.WT = WT;
double value = WT / Math.pow(HT, 2);
double roundedValue =Math.round(value * 10.0) / 10.0;
DecimalFormat df = new DecimalFormat("#.0");
String formattedValue = df.format(roundedValue);
this.BMI= Double.parseDouble(formattedValue);
}
// //横轴的注解的值是datax
// @ChineseName("datax")
// Date date;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
GeneralData that = (GeneralData) o;
return Objects.equals(HT, that.HT) && Objects.equals(WT, that.WT) && Objects.equals(BMI, that.BMI);
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), HT, WT, BMI);
}
}
解决
尝试添加了equals和hashCode()方法,还是解决不了
最后
2024-4-14 22:57:01
我们都有光明的未来
祝大家考研上岸
祝大家工作顺利
祝大家得偿所愿
祝大家如愿以偿
点赞收藏关注哦