Spring Redis Delete不会删除key

csga3l58  于 2023-04-19  发布在  Spring
关注(0)|答案(6)|浏览(280)

我试图删除一个redis键,但由于某种原因,它没有删除,但也没有抛出异常。下面是我的删除代码:

import com.example.service.CustomerService;
import com.example.model.Customer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigInteger;
import java.util.*;

@Service
public class RedisCustomerService implements CustomerService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate; 

    private String uniqueIdKey = "customerId";

    private BigInteger uniqueId() {
        long uniqueId = this.redisTemplate.opsForValue().increment(uniqueIdKey, 1);
        return BigInteger.valueOf(uniqueId);
    }

    private String lastNameKey(BigInteger id) {
        return "customer:ln:" + id;
    }

    private String firstNameKey(BigInteger id) {
        return "customer:fn:" + id;
    }

    @Override
    public void deleteCustomer(BigInteger id) {
        redisTemplate.opsForValue().getOperations().delete(String.valueOf(id));
    }
}
ojsjcaue

ojsjcaue1#

ValueOperations没有 delete 方法。因此以下内容将不起作用:

redisTemplate.opsForValue().delete(key);

试试看

redisTemplate.delete(key);
6qftjkof

6qftjkof2#

使用ValueOperations删除的另一种方法是设置一个几乎立即过期的空值。Redis将自己处理驱逐。
例如,您可以设置如下值:

valueOperations.set("key", "value");

当你想删除的时候,你可以这样做:

valueOperations.set("key", "", 1, TimeUnit.MILLISECONDS);

两个操作中的密钥必须相同

368yc8dk

368yc8dk3#

在spring Boot 2之前,如果你在构建resttemplate时没有指定序列化器,在redis上你会看到这样的键:
“xac\xed\x00\x05t\x008mx.company.support.catalog.dao.keys”
但当尝试删除它与redisTemplate.delete(key)的关键是不擦除
一个简单的方法是获取字节中的键并继续删除它。
你班上的例子:

@Autowired
private RedisTemplate<String, Object> redisTemplate;

public boolean deleteKeyByPattern(String pattern) {
    Set<byte[]> patternResultConf = redisTemplate.getConnectionFactory().getConnection().keys(pattern.getBytes());
    if(Objects.nonNull(patternResultConf) && !patternResultConf.isEmpty()) {
        redisTemplate.getConnectionFactory().getConnection().del(patternResultConf.toArray(new byte[0][]));
    }
    return true;
}
ia2d9nvy

ia2d9nvy4#

试试这个:

public void deleteCustomer(BigInteger id) {
        redisTemplate.execute(new RedisCallback<String>() {
                @Override
                public String doInRedis(RedisConnection redisConnection) throws DataAccessException {
                        redisConnection.del(redisTemplate.getStringSerializer().serialize(String.valueOf(id)));
                        return null;
                }
        });
}
flvlnr44

flvlnr445#

public void deleteCustomer(BigInteger id) {
        redisTemplate.setDefaultSerializer(new StringRedisSerializer());
        redisTemplate.delete(String.valueOf(id));
 }
hs1ihplo

hs1ihplo6#

没有要使用的getOperation:

@Override
public void deleteCustomer(BigInteger id) {
    redisTemplate.opsForValue().delete(String.valueOf(id));
}

相关问题