springboot下使用redis原生jedis 并使用zsort实现简单热词

1.redis依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        
        <!-- jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>

2.redis配置文件 application.properties中添加

#=====redis config======
redis.sentinel.masterName=XXXXXXX
redis.host=XXXXXXX
redis.port=XXX
redis.password=XXXXX
redis.timeout=1000
redis.pool.maxTotal=200
redis.pool.maxWaitMillis=300
redis.pool.minIdle=10
redis.pool.maxIdle=50
redis.pool.testOnBorrow=true
redis.pool.testOnReturn=true
redis.pool.testWhileIdle=true
redis.sentinel.sentinel.list.host=ip:port,ip2:port2,ip3:port3
##=====redis config end======

3.初始化redis

public class RedisInit {
    private static String matserName;
    private static GenericObjectPoolConfig poolConfig;
    private static Set<String> sensitle;
    private static JedisSentinelPool jedisSentinelPool;

    private RedisInit() {
    }

    public static synchronized void init() {
        matserName = ConfigUtil.getProp("redis.sentinel.masterName");
        sensitle = new HashSet<>();
        String sentinelStr = ConfigUtil.getProp("redis.sentinel.sentinel.list.host");
        String[] split = sentinelStr.split(",");
        for (String sentinel : split) {
            sensitle.add(sentinel);
        }

        poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(Integer.parseInt(ConfigUtil.getProp("redis.pool.maxTotal")));
        poolConfig.setMaxWaitMillis(Long.parseLong(ConfigUtil.getProp("redis.pool.maxWaitMillis")));
        poolConfig.setMinIdle(Integer.parseInt(ConfigUtil.getProp("redis.pool.minIdle")));
        poolConfig.setMaxIdle(Integer.parseInt(ConfigUtil.getProp("redis.pool.maxIdle")));
        poolConfig.setTestOnBorrow(Boolean.parseBoolean(ConfigUtil.getProp("redis.pool.testOnBorrow")));
        poolConfig.setTestOnReturn(Boolean.parseBoolean(ConfigUtil.getProp("redis.pool.testOnReturn")));
        poolConfig.setTestWhileIdle(Boolean.parseBoolean(ConfigUtil.getProp("redis.pool.testWhileIdle")));
        jedisSentinelPool = new JedisSentinelPool(matserName, sensitle, poolConfig, 3000);
    }

    public static String getMatserName() {
        return matserName;
    }

    public static GenericObjectPoolConfig getPoolConfig() {
        return poolConfig;
    }

    public static Set<String> getSensitle() {
        return sensitle;
    }

    public static JedisSentinelPool getJedisSentinelPool() {
        return jedisSentinelPool;
    }
}
public class RedisClentFactory {


    public static Jedis getClient() {
        return RedisInit.getJedisSentinelPool().getResource();
    }
}
@Component
@Order(value = Ordered.LOWEST_PRECEDENCE)
public class ServiceInit implements InitializingBean {

    private static final Logger log = LoggerFactory.getLogger(ServiceInit.class);


    public ServiceInit() {
        super();
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("===============redis初始化开始===============");

        RedisInit.init();
        log.info("===============redis初始化完成===============");

    }
}

4.测试类以及zsort基本操作

@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class Test {
    private static Logger logger = LoggerFactory.getLogger(Test.class);
    @Test
    public void test() {
        Jedis jedis1 =null;
        try{
            jedis1 =  RedisClentFactory.getClient();
            //评分降序前四个
            Set<String> keys1 = jedis1.zrevrange("res", 0, 3);
            System.out.println(keys1);
            //取相应member的分值
            System.out.println(jedis1.zscore("res","红楼梦w"));
            System.out.println(jedis1.zscore("res","qqqqqqq"));


            logger.info("清除元素清空,清除前长度={}",jedis1.zcard("res"));
            jedis1.zremrangeByRank("res",0,jedis1.zcard("res"));
            jedis1.zremrangeByRank("res1",0,jedis1.zcard("res1"));
            jedis1.zremrangeByRank("today",0,jedis1.zcard("today"));

            //清除分值为0的记录
            jedis1.zremrangeByScore("res",0,0);

            //填充初始化记录
            for(int i=1;i<4;i++){
                jedis1.zincrby("res",1,"A");
                jedis1.zincrby("today",-1,"A");
                jedis1.zincrby("res",1,"B");
                jedis1.zincrby("today",-1,"B");
                jedis1.zincrby("res",1,"C");
                jedis1.zincrby("today",-1,"C");
                jedis1.zincrby("res",1,"D");
            }
            jedis1.zadd("res",2,"E");
            
            logger.info("取并集前:");
            logger.info("resA======={}======",jedis1.zscore("res","A"));
            logger.info("resB======={}======",jedis1.zscore("res","B"));
            logger.info("resC======={}======",jedis1.zscore("res","C"));
            logger.info("resD======={}======",jedis1.zscore("res","D"));
            logger.info("resE======={}======",jedis1.zscore("res","E"));
            logger.info("today======{}======",jedis1.zscore("today","A"));
            logger.info("today======{}======",jedis1.zscore("today","B"));
            logger.info("today======{}======",jedis1.zscore("today","C"));
            Set<String> keys2 = jedis1.zrevrange("res", 0, 3);
            System.out.println(keys2);
            //并集
            jedis1.zunionstore("res1","res","today");
            jedis1.zunionstore("res","res","today");
            logger.info("并集后后:");
            logger.info("resA======={}======",jedis1.zscore("res","A"));
            logger.info("resB======={}======",jedis1.zscore("res","B"));
            logger.info("resC======={}======",jedis1.zscore("res","C"));
            logger.info("resD======={}======",jedis1.zscore("res","D"));
            logger.info("resE======={}======",jedis1.zscore("res","E"));
            logger.info("today======{}======",jedis1.zscore("today","A"));
            logger.info("today======{}======",jedis1.zscore("today","B"));
            logger.info("today======{}======",jedis1.zscore("today","C"));
            logger.info("test--------->");
            logger.info("res1A======={}======",jedis1.zscore("res1","A"));
            logger.info("res1B======={}======",jedis1.zscore("res1","B"));
            logger.info("res1C======={}======",jedis1.zscore("res1","C"));
            logger.info("res1D======={}======",jedis1.zscore("res1","D"));
            logger.info("res1E======={}======",jedis1.zscore("res1","E"));
            logger.info("过期时间={}",jedis1.ttl("res"));//-1永不过期
            Set<String> keys3 = jedis1.zrevrange("res", 0, 3);
            System.out.println(keys3);
            System.out.println("++++++++++++++++++++++++++++++++++++++");

        }catch (Exception e){
            logger.info("error",e);
        }finally {
            if (null != jedis1) {
                jedis1.close();
            }
        }
    }

  
}

5.zsort实现简单热词功能,展示7天内的热词

定义枚举

public enum HotWordEnum {
    RESULT("res"),
    DAY1("day1"),
    DAY2("day2"),
    DAY3("day3"),
    DAY4("day4"),
    DAY5("day5"),
    DAY6("day6"),
    DAY7("day7"),
    TOYDAY("today");

    private String value;

    private HotWordEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return this.value;
    }

    public void setValue(String value) {
        this.value = value;
    }

实现记录和返回

public class TestHotWord {

    private static Logger logger = LoggerFactory.getLogger(TestHotWord.class);

    /**
     * @param keyword
     * 热词统计,每查询一次数量加一
     */
    @Override
    public void hotWordStatistics(String  keyword){
        Jedis jedis =null;
        try{
            jedis = RedisClentFactory.getClient();
            //查询词分数加一
            jedis.zincrby(HotWordEnum.RESULT.getValue(),1,keyword);
            //当天数据减一
            jedis.zincrby(HotWordEnum.TOYDAY.getValue(),-1,keyword);
        }catch (Exception e){
            logger.error("HotWordServiceImpl error",e);
        }finally{
            if(null!=jedis){
                jedis.close();
            }
        }

    }

    /**
     * 获取指定数量的搜索热词
     * @param num
     * @return
     */
    @Override
    public List<String> getSortedHotWords(Integer num){
        Jedis jedis =null;
        try{
            jedis = RedisClentFactory.getClient();
            //热词搜索次数降序排列,取前num个
            Set<String> keys = jedis.zrevrange(HotWordEnum.RESULT.getValue(), 0, num-1);
            List<String> res = new ArrayList<>(keys);
            return res;
        }catch (Exception e){
            logger.error("HotWordServiceImpl error",e);
            return null;
        }finally{
            if(null!=jedis){
                jedis.close();
            }
        }
    }
}

定时任务0点更新

public class HotwordJob {
    private static final Logger logger = LoggerFactory.getLogger(HotwordJob.class);
    public void doJob() {
        logger.info("开始执行HotwordJob");
        Jedis jedis =null;
        try{
            jedis = RedisClentFactory.getClient();

            //时时搜索结果与七天前当日结果做并集,去除七天前数据
            jedis.zunionstore(HotWordEnum.RESULT.getValue(),HotWordEnum.RESULT.getValue(),HotWordEnum.DAY1.getValue());
            //清除分值为0的数据
            jedis.zremrangeByScore(HotWordEnum.RESULT.getValue(),0,0);

            //每日搜索结果集前移一天
            jedis.zremrangeByRank(HotWordEnum.DAY1.getValue(),0,jedis.zcard(HotWordEnum.DAY1.getValue()));
            jedis.zunionstore(HotWordEnum.DAY1.getValue(),HotWordEnum.DAY1.getValue(),HotWordEnum.DAY2.getValue());

            jedis.zremrangeByRank(HotWordEnum.DAY2.getValue(),0,jedis.zcard(HotWordEnum.DAY2.getValue()));
            jedis.zunionstore(HotWordEnum.DAY2.getValue(),HotWordEnum.DAY2.getValue(),HotWordEnum.DAY3.getValue());

            jedis.zremrangeByRank(HotWordEnum.DAY3.getValue(),0,jedis.zcard(HotWordEnum.DAY3.getValue()));
            jedis.zunionstore(HotWordEnum.DAY3.getValue(),HotWordEnum.DAY3.getValue(),HotWordEnum.DAY4.getValue());

            jedis.zremrangeByRank(HotWordEnum.DAY4.getValue(),0,jedis.zcard(HotWordEnum.DAY4.getValue()));
            jedis.zunionstore(HotWordEnum.DAY4.getValue(),HotWordEnum.DAY4.getValue(),HotWordEnum.DAY5.getValue());

            jedis.zremrangeByRank(HotWordEnum.DAY5.getValue(),0,jedis.zcard(HotWordEnum.DAY5.getValue()));
            jedis.zunionstore(HotWordEnum.DAY5.getValue(),HotWordEnum.DAY5.getValue(),HotWordEnum.DAY6.getValue());

            jedis.zremrangeByRank(HotWordEnum.DAY6.getValue(),0,jedis.zcard(HotWordEnum.DAY6.getValue()));
            jedis.zunionstore(HotWordEnum.DAY6.getValue(),HotWordEnum.DAY6.getValue(),HotWordEnum.DAY7.getValue());

            jedis.zremrangeByRank(HotWordEnum.DAY7.getValue(),0,jedis.zcard(HotWordEnum.DAY7.getValue()));
            jedis.zunionstore(HotWordEnum.DAY7.getValue(),HotWordEnum.DAY7.getValue(),HotWordEnum.TOYDAY.getValue());

            //清除当天结果集
            jedis.zremrangeByRank(HotWordEnum.TOYDAY.getValue(),0,jedis.zcard(HotWordEnum.TOYDAY.getValue()));

        }catch (Exception e){
            logger.error("HotWordServiceImpl error",e);
        }finally{
            if(null!=jedis){
                jedis.close();
            }
        }
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值