package com.xkcoding.rbac.security.util; import com.google.common.collect.Lists; import com.xkcoding.rbac.security.common.PageResult; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.Cursor; import org.springframework.data.redis.core.RedisConnectionUtils; import org.springframework.data.redis.core.ScanOptions; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import java.util.Collection; import java.util.List; /** * <p> * Redis工具类 * </p> * * @package: com.xkcoding.rbac.security.util * @description: Redis工具类 * @author: yangkai.shen * @date: Created in 2018-12-11 20:24 * @copyright: Copyright (c) 2018 * @version: V1.0 * @modified: yangkai.shen */ @Component @Slf4j public class RedisUtil { @Autowired private StringRedisTemplate stringRedisTemplate; /** * 分页获取指定格式key,使用 scan 命令代替 keys 命令,在大数据量的情况下可以提高查询效率 * * @param patternKey key格式 * @param currentPage 当前页码 * @param pageSize 每页条数 * @return 分页获取指定格式key */ public PageResult<String> findKeysForPage(String patternKey, int currentPage, int pageSize) { ScanOptions options = ScanOptions.scanOptions() .match(patternKey) .build(); RedisConnectionFactory factory = stringRedisTemplate.getConnectionFactory(); RedisConnection rc = factory.getConnection(); Cursor<byte[]> cursor = rc.scan(options); List<String> result = Lists.newArrayList(); long tmpIndex = 0; int startIndex = (currentPage - 1) * pageSize; int end = currentPage * pageSize; while (cursor.hasNext()) { String key = new String(cursor.next()); if (tmpIndex >= startIndex && tmpIndex < end) { result.add(key); } tmpIndex++; } try { cursor.close(); RedisConnectionUtils.releaseConnection(rc, factory); } catch (Exception e) { log.warn("Redis连接关闭异常,", e); } return new PageResult<>(result, tmpIndex); } /** * 删除 Redis 中的某个key * * @param key 键 */ public void delete(String key) { stringRedisTemplate.delete(key); } /** * 批量删除 Redis 中的某些key * * @param keys 键列表 */ public void delete(Collection<String> keys) { stringRedisTemplate.delete(keys); } }