SpringBoot+Redis分页功能

本文详细介绍了在SpringBoot项目中如何通过YML配置文件配置Redis,包括连接参数、RedisTemplate的定制以及Redis工具类的使用,涵盖了缓存操作、zSet存储和分页功能的示例。
摘要由CSDN通过智能技术生成

1、yml配置

spring:
  redis:
    database: 0 #redis服务器数据库
    host: 127.0.0.1
    port: 6379
    password:
    timeout: 5000
    lettuce:
      pool:
        max-active: 200  #最大连接数据
        max-wait: -1  #最大阻塞时间
        max-idle: 8 #最大空闲时间
        min-idle: 0  #最小空闲时间

2、Redis配置

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 配置连接工厂
        template.setConnectionFactory(factory);

        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);

        ObjectMapper om = new ObjectMapper();
        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
//        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        // 值采用json序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());

        // 设置hash key 和value序列化模式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();

        return template;
    }

}

3、redis工具类

@Slf4j
@Component
public class RedisUtil {
    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 缓存失效时间
     *
     * @param key
     * @param time
     * @return
     */
    public boolean expire(String key, long time, TimeUnit timeUnit) {
        try {
            if (time > 0) {
                redisTemplate.expire(key, time, timeUnit);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public void clear() {
        try {
            Set<String> keys = redisTemplate.keys("*");
            redisTemplate.delete(keys);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public List<String> getKeys(String key) {
        Set<String> sets = redisTemplate.keys(key);
        return new ArrayList<>(sets);
    }

    /**
     * 判断key是否存在
     *
     * @param key 键
     * @return true 存在 false不存在
     */
    public boolean hasKey(String key) {
        try {
            return Boolean.TRUE.equals(redisTemplate.hasKey(key));
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 删除缓存
     *
     * @param key 一个、多个
     */
    @SuppressWarnings("unchecked")
    public boolean del(String... key) {
        Boolean del = false;
        if (key != null && key.length > 0) {
            if (key.length == 1) {
                del = redisTemplate.delete(key[0]);
            } else {
                Long count = redisTemplate.delete(CollUtil.toList(key));
                if (count != null && count > 0) {
                    del = true;
                }
            }
        }
        if (del == null) {
            del = false;
        }
        return del;
    }

    public void delByLikeKeys(String key) {
        if (StrUtil.isNotBlank(key)) {
            redisTemplate.delete(Objects.requireNonNull(redisTemplate.keys(key + "*")));
        }


    }

    /**
     * 普通缓存获取
     *
     * @param key 键
     * @return 值
     */
    public Object get(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }

    /**
     * 模糊查询
     *
     * @param key
     * @return
     */
    public List<Object> getByLike(String key) {
        if (key == null) {
            return null;
        }
        Set<String> set = redisTemplate.keys(key + "*");
        if (set == null){
            return null;
        }

        List<Object> objectList = redisTemplate.opsForValue().multiGet(set);
        return objectList;
    }

    public List<Object> getByKes(Set<String> set){
        if (CollUtil.isEmpty(set)){
            return null;
        }
        List<Object> objectList = redisTemplate.opsForValue().multiGet(set);
        if (CollUtil.isEmpty(objectList)){
            return null;
        }
        List<Object> collect = objectList.stream().filter(Objects::nonNull).collect(Collectors.toList());
        return collect;
    }


    /**
     * 普通缓存放入
     *
     * @param key   键
     * @param value 值
     * @return true成功 false失败
     * 96
     */

    public boolean set(String key, Object value) {
        try {
            redisTemplate.opsForValue().set(key, value);
            return true;

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

    }

    /**
     * 普通缓存放入并设置时间
     *
     * @param key   键
     * @param value 值
     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期
     * @return true成功 false 失败
     */

    public boolean set(String key, Object value, long time, TimeUnit timeUnit) {
        try {
            if (time > 0) {
                redisTemplate.opsForValue().set(key, value, time, timeUnit);
            } else {
                set(key, value);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;

        }

    }

    /**
     * 将list放入缓存
     *
     * @param key   键
     * @param value 值
     * @return
     */
    public boolean lSet(String key, List<Object> value) {

        try {
            redisTemplate.opsForList().rightPushAll(key, value);
            return true;

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

    }

    /**
     * 将list放入缓存
     *
     * @param key   键
     * @param value 值
     * @param time  时间(秒)
     */

    public boolean lSet(String key, List<Object> value, long time) {
        try {
            redisTemplate.opsForList().rightPushAll(key, value);
            if (time > 0){
                expire(key, time, TimeUnit.SECONDS);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * zSet 管道存储
     * @param key
     * @param map
     */
    public void zSetPipelined(String key, Map<Integer, String> map){
        redisTemplate.executePipelined(new RedisCallback<Object>() {
            @Override
            public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {
                map.forEach((score, value) -> {
                    redisConnection.zSetCommands().zAdd(key.getBytes(), score, value.getBytes());
                });
                return null;
            }
        });
    }

    /**
     * zSet 分页取值
     * @param key
     * @param pageNum
     * @param pageSize
     * @return
     */
    public Set zSetGetByPage(String key, long pageNum, long pageSize){
        if (Boolean.TRUE.equals(redisTemplate.hasKey(key))){
            long start = (pageNum - 1) * pageSize;
            long end = pageNum * pageSize - 1;
            Long size = redisTemplate.opsForZSet().size(key);
            if (size == null){
                end = -1;
            }else {
                if (end > size) {
                    end = -1;
                }
            }
            return redisTemplate.opsForZSet().range(key, start, end);
        }
        return null;
    }

    public Set getZSet(String key, long start, long end){
        return redisTemplate.opsForZSet().range(key, start, end);
    }

    /**
     * zSet 获取总条数
     * @param key
     * @return
     */
    public Long zSetTotal(String key){
        Long count = redisTemplate.opsForZSet().size(key);
        return  count;
    }

}

4、存储【zSet】

      Map<Integer, String> zsetMap = new HashMap<>(1);
      zsetMap.put(student.getRow(), JSONUtil.toJsonStr(student));
      redisUtil.zSetPipelined(redisKey, zsetMap);

5、分页

    @ApiOperation(value = "redis分页")
    @PostMapping("/redisPage")
    public ResultData getRedisZsetPage(@Validated @RequestBody StudentQuery query){
        List<Student> list = new ArrayList<>();
        Long total = redisUtil.zSetTotal(query.getRedisKey());
        if (total == null || total == 0){
            return ResultData.error().message("无数据!");
        }else {
            Set objects = redisUtil.zSetGetByPage(query.getRedisKey(), query.getPageNo(), query.getPageSize());
            if (objects != null){
                Student bean;
                for (Object object : objects) {
                    bean = JSONUtil.toBean(JSONUtil.toJsonStr(object), Student.class);
                    list.add(bean);
                }
            }
            return ResultData.success().data("total", total).data("rows", list);
        }
    }

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值