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