public interface JedisClient { public String get(String key); public String set(String key, String value); public String hget(String hkey, String key); public long hset(String hkey, String key, String value); public long incr(String key); public long expire(String key, int second); public long ttl(String key); public long del(String key); public long hdel(String hkey, String key); public long zadd(String key,double score,User user); public Set<String> zgetAll(String key, long start, long end); //拿整个榜单 public long zaddList(String key,List<User> userList); //拿去榜单最后一名,比如前50名,这里就拿到第50名的User。积分变化时就拿这个值去判断,大于就丢user进redis,小于则不管 public Set<String> getTopLast(String key,long start,long end);}
@Servicepublic class JedisClientSingle implements JedisClient { @Autowired private JedisPool jedisPool; @Override public String get(String key) { Jedis jedis = jedisPool.getResource(); String string = jedis.get(key); jedis.close(); return string; } @Override public String set(String key, String value) { Jedis jedis = jedisPool.getResource(); String string = jedis.set(key, value); jedis.close(); return string; }//最基本的数据类型操作,key-value @Override public String hget(String hkey, String key) { System.out.println("jedisPool " + jedisPool); Jedis jedis = jedisPool.getResource(); System.out.println("jedis " + jedis); String string = jedis.hget(hkey, key); jedis.close(); return string; } @Override public long hset(String hkey, String key, String value) { Jedis jedis = jedisPool.getResource(); Long result = jedis.hset(hkey, key, value); jedis.close(); return result; } @Override public long incr(String key) { Jedis jedis = jedisPool.getResource(); Long result = jedis.incr(key); jedis.close(); return result; } @Override public long expire(String key, int second) { Jedis jedis = jedisPool.getResource(); Long result = jedis.expire(key, second); jedis.close(); return result; } @Override public long ttl(String key) { Jedis jedis = jedisPool.getResource(); Long result = jedis.ttl(key); jedis.close(); return result; } @Override public long del(String key) { Jedis jedis = jedisPool.getResource(); Long result = jedis.del(key); jedis.close(); return result; } @Override public long hdel(String hkey, String key) { Jedis jedis = jedisPool.getResource(); Long result = jedis.hdel(hkey, key); jedis.close(); return result; } @Override public long zaddList(String key,List<User> userList){ Jedis jedis = jedisPool.getResource(); Long result = null; for (int i=0;i<userList.size();i++){ result = jedis.zadd(key, userList.get(i).getScore(), JsonUtils.objectToJson(userList.get(i))); } jedis.close(); return result; } @Override public long zadd(String key,double score,User user){ Jedis jedis = jedisPool.getResource(); Long result = jedis.zadd(key, score, JsonUtils.objectToJson(user)); jedis.close(); return result; } @Override public Set<String> zgetAll(String key,long start,long end){ Jedis jedis = jedisPool.getResource(); Set<String> userSet =jedis.zrange(key, start, end); System.out.println("userSet :"+userSet); jedis.close(); return userSet; } //拿最后一名的,所以start跟end必须标记最后一名的位置索引 @Override public Set<String> getTopLast(String key,long start,long end) { Jedis jedis = jedisPool.getResource(); Set<String> userSet = jedis.zrange(key,start,end); System.out.println("userSet :"+userSet); jedis.close(); return userSet; }}
public class JsonUtils {//转成jsonarray public static String objectToJson(Object data) { String json = JSONArray.toJSONString(data); return json; } //string转java对象 public static User jsonObjectToUser(String userString) { User user = JSONObject.parseObject(userString.toString(),User.class); return user; } public static List<User> objectToUser(JSONArray array){ List<User> userList =new ArrayList<>(); for (int i=0;i<array.size();i++) { System.out.print("array.get(i) "+array.get(i).toString()); //parseObject解析的是一个字符串,强转成为String是不行的,必须打印成String语句 User user = JSONObject.parseObject(array.get(i).toString(),User.class); userList.add(user); } return userList; }}
@RestController@RequestMapping("/gag")public class GagController { @Autowired private GagService gagService; @Autowired private JedisClient jedisClient; @RequestMapping(value = "/gagList",produces="text/html;charset=UTF-8", method = {RequestMethod.GET,RequestMethod.GET}) public String testRedis(Long id){ List<Gag> gagList= null; try { String resulthget = jedisClient.hget("禁言表", id + ""); if (resulthget != null) { //字符串转为list System.out.println("有缓存啦啦啦!!!"); JSONArray array = JSONArray.parseArray(resulthget); gagList = (List) array; } else { System.out.println("禁言表没查过");//没有查过就读取整个表的list出来 gagList= gagService.findByUserId(id); } } catch (Exception e) { e.printStackTrace(); } try { String cacheString = JsonUtils.objectToJson(gagList);//读取出来后就加载缓存进去,但是要转化给json jedisClient.hset("禁言表", id + "", cacheString); } catch (Exception e) { e.printStackTrace(); } return JSON.toJSONString(gagList); }}
//拿整个榜单public Set<String> zgetAll(String key, long start, long end); //批量加入用户 public long zaddList(String key,List<User> userList); //拿去榜单最后一名,比如前50名,这里就拿到第50名的User。积分变化时就拿这个值去判断,大于就丢user进redis,小于则不管 public Set<String> getTopLast(String key,long start,long end);
//批量加入用户到redis@Override public long zaddList(String key,List<User> userList){ Jedis jedis = jedisPool.getResource(); Long result = null; for (int i=0;i<userList.size();i++){ result = jedis.zadd(key, userList.get(i).getScore(), JsonUtils.objectToJson(userList.get(i))); } jedis.close(); return result; }//单个用户加入。而且可用于更新操作!!!! @Override public long zadd(String key,double score,User user){ Jedis jedis = jedisPool.getResource(); Long result = jedis.zadd(key, score, JsonUtils.objectToJson(user)); jedis.close(); return result; } //全拿榜单信息(拿多少就多少。) @Override public Set<String> zgetAll(String key,long start,long end){ Jedis jedis = jedisPool.getResource(); Set<String> userSet =jedis.zrange(key, start, end); System.out.println("userSet :"+userSet); jedis.close(); return userSet; } //拿最后一名的,所以start跟end必须标记最后一名的位置索引 @Override public Set<String> getTopLast(String key,long start,long end) { Jedis jedis = jedisPool.getResource(); Set<String> userSet = jedis.zrange(key,start,end); System.out.println("userSet :"+userSet); jedis.close(); return userSet; }
@RequestMapping(value = "/queryTopN", produces = "text/html;charset=UTF-8", method = {RequestMethod.GET, RequestMethod.GET}) public String queryTopN() { List<User> userList = null; try { //拿出redis的排行榜结果 Set<String> resultSet = jedisClient.zgetAll("Toptest", (long) 0, (long) 20); System.out.println("resultSet " + resultSet.toString()); Iterator<String> iter = resultSet.iterator();//遍历它 if (resultSet.size() > 0) { //字符串转为list System.out.println("有缓存啦啦啦!!!"); userList = new ArrayList<>(); while (iter.hasNext()) { //把一个个对象用fastjson格式转换成jsonobject User user = JsonUtils.jsonObjectToUser(iter.next()); System.out.println("user " + user.toString()); userList.add(user); } return JSON.toJSONString(userList); } else { System.out.println("Toptest没查过"); userList = userService.queryTopN();//没查过就查一次再丢给redis } } catch (Exception e) { e.printStackTrace(); } try { //如果没有缓存就批量加入到redis缓存中 jedisClient.zaddList("Toptest", userList); } catch (Exception e) { e.printStackTrace(); } return JSON.toJSONString(userList); }
@RequestMapping(value = "/updateScore", produces = "text/html;charset=UTF-8", method = {RequestMethod.GET, RequestMethod.GET}) public String updateScore(Long id,Integer scoreCount) { User user = userService.queryById(id); scoreService.updateScore(user,scoreCount); return JSON.toJSONString(user); }
@Transactional @Override public void updateScore(User user, int scoreCount) { User userFind = new User(); Score score = new Score(); score.setChangeType("做任务"); score.setScore(scoreCount); score.setUser(user); scoreDao.insertScore(score); userDao.updateScore(user.getId(), scoreCount); //从redis拿出排行榜的list先 Set<String> userSet = jedisClient.getTopLast("Toptest", (long) 0, (long) 5); Iterator<String> iter = userSet.iterator();//遍历 它,判断这个用户存不存在了 List<User> userList = new ArrayList<>(); while (iter.hasNext()) { User userTemp = JsonUtils.jsonObjectToUser(iter.next()); System.out.println("user " + user.toString()); userList.add(userTemp); if (userTemp.getAccount().equals(user.getAccount())) {//如果存在就用存在的 userFind = userTemp; } } //如果原本有的就修改原有的。 if (userFind != null) { jedisClient.zadd("Toptest", (double) user.getScore(), userFind); return; } //如果没有就加进去嘛,根据排行榜来区分 if (userList.size() >= 20) { if (user.getScore() + scoreCount > userList.get(19).getScore()) { System.out.println("大于排名20名中的最后一名就丢进缓存 :"); System.out.println("userList :" + userList.toString()); } } else { System.out.println("排行榜小于20人就直接丢进缓存 :"); if (userFind != null) { jedisClient.zadd("Toptest", (double) user.getScore(), user); } System.out.println("user " + userFind); } }
联系客服