Spring Redis Delete不会删除密钥

时间:2014-01-11 05:36:29

标签: spring redis

我正在尝试删除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));
    }
}

5 个答案:

答案 0 :(得分:24)

ValueOperations没有删除方法。所以以下内容不起作用:

redisTemplate.opsForValue().delete(key);

尝试

redisTemplate.delete(key);

答案 1 :(得分:1)

使用ValueOperations进行删除的另一种方法是设置一个将立即失效的空值。 Redis会自行处理搬迁。

例如,您可以设置一个像这样的值:

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

要删除时,您可以执行以下操作:

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

两个操作中的键必须相同

答案 2 :(得分:0)

试试这个:

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;
                }
        });
}

答案 3 :(得分:0)

在春季启动2之前,如果在构建resttemplate时未指定序列化程序,则在redis上,您会看到如下所示的键:

“ xac \ xed \ x00 \ x05t \ x008mx.company.support.catalog.dao.keys”

但是当尝试使用key删除密钥时,密钥不会被擦除

一种简单的方法是以字节为单位获取密钥,然后继续删除它。

班上的例子:

redisTemplate.delete(key)

答案 4 :(得分:-1)

没有使用getOperation:

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