Redis操作(三)RedisTemplate(3)RedisCallback回调机制

一、介绍

org.springframework.data.redis.core.RedisCallback

1、使用场景

springboot整合redis后, 我们经常使用RedisTemplate 和StringRedisTemplate两个模板类,

但有时候这并不能满足我们的需求, 需要使用 connect 处理, 除了 redisTemplate.getConnection() 之外, 还可以使用callback机制进行处理

二、使用

@Resource(name = "shardedJedisPool")  
    private ShardedJedisPool shardedJedisPool;  
      
    @Override  
    public <T> T execute(ConnectionCallback<T> action) {  
        ShardedJedis shardedJedis = null;  
        try{  
            // 从连接池中获取jedis分片对象  
            shardedJedis = shardedJedisPool.getResource();  
              
            return action.doInRedis(shardedJedis);  
              
        }catch (Exception e){  
            System.out.println(e.getMessage());  
        }finally {  
            if(null != shardedJedis){  
                shardedJedis.close();  
            }  
        }  
        return null;  
    }  
      
   /** 
     * attention:真正封装的方法,非常的简洁干脆 
     */  
    public String set(final String key, final String value){  
        return execute(new ConnectionCallback<String>() {  
            @Override  
            public String doInRedis(  
                    ShardedJedis shardedJedis) {  
                return shardedJedis.set(key, value);  
            }  
        });  
    }  
      
    public String get(final String key){  
        return execute(new ConnectionCallback<String>(){  
            @Override  
            public String doInRedis(ShardedJedis shardedJedis) {  
                return shardedJedis.get(key);  
            }  
        });  
    }

保存:

redisTemplate.execute(new RedisCallback<Object>() {  
        @Override  
        public Object doInRedis(RedisConnection connection)  
                throws DataAccessException {  
            connection.set(  
                    redisTemplate.getStringSerializer().serialize(  
                            "user.uid." + user.getUid()),  
                    redisTemplate.getStringSerializer().serialize(  
                            user.getAddress()));  
            return null;  
        }  
    });

(2)获取

return redisTemplate.execute(new RedisCallback<User>() {  
        @Override  
        public User doInRedis(RedisConnection connection)  
                throws DataAccessException {  
            byte[] key = redisTemplate.getStringSerializer().serialize(  
                    "user.uid." + uid);  
            if (connection.exists(key)) {  
                byte[] value = connection.get(key);  
                String address = redisTemplate.getStringSerializer()  
                        .deserialize(value);  
                User user = new User();  
                user.setAddress(address);  
                user.setUid(uid);  
                return user;  
            }  
            return null;  
        }  
    });

(3)删除

redisTemplate.execute(new RedisCallback<Object>() {  
        public Object doInRedis(RedisConnection connection) {  
            connection.del(redisTemplate.getStringSerializer().serialize(  
                    "user.uid." + uid));  
            return null;  
        }  
    });

使用 RedisTemplate 执行 SCAN 命令进行批量删除操作的步骤如下: 1. 首先,创建一个 RedisTemplate 对象,用于执行 Redis 命令操作。可以通过注入或者手动创建 RedisTemplate 对象。 2. 使用 RedisTemplate 的 execute 方法执行 SCAN 命令,该命令可以遍历 Redis 中的所有 key。 3. 在 SCAN 命令的回调函数中,可以对每个 key 进行判断和处理。如果符合删除条件,则可以使用 RedisTemplate 的 delete 方法删除该 key。 下面是一个示例代码: ```java @Autowired private RedisTemplate<String, Object> redisTemplate; public void batchDeleteByScan(String pattern) { ScanOptions options = ScanOptions.scanOptions().match(pattern).count(1000).build(); redisTemplate.executeWithStickyConnection((RedisCallback<Void>) connection -> { Cursor<byte[]> cursor = connection.scan(options); while (cursor.hasNext()) { byte[] keyBytes = cursor.next(); String key = new String(keyBytes, StandardCharsets.UTF_8); // 判断是否符合删除条件,这里以示例为准 if (key.startsWith("prefix")) { redisTemplate.delete(key); } } cursor.close(); return null; }); } ``` 在上述示例中,我们使用了 `executeWithStickyConnection` 方法来确保在 SCAN 命令执行期间使用同一个连接。这是因为 SCAN 命令可能需要多次执行才能遍历完所有的 key,而每次执行 SCAN 命令时都需要使用同一个连接。 请注意,上述示例中的 `pattern` 参数是用来匹配需要删除的 key 的模式,可以使用通配符进行模糊匹配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w_t_y_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值