package com.xiaozhi.blog.redis; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BulkMapper; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.query.SortQuery; import org.springframework.data.redis.core.query.SortQueryBuilder; import org.springframework.data.redis.support.collections.DefaultRedisSet; import org.springframework.data.redis.support.collections.RedisSet; import org.springframework.stereotype.Component; import com.xiaozhi.blog.utils.KeyUtils; import com.xiaozhi.blog.utils.ListPage; import com.xiaozhi.blog.vo.Range; import com.xiaozhi.blog.vo.User; //@Component public class FollowerDao1 { private static Log logger = LogFactory.getLog(FollowerDao1.class); @Autowired private StringRedisTemplate template; /** * 分页获取粉丝列表 * @param uid * @return */ public List<User> getFollowers(final String uid,String key, Range range) { SortQuery<String> query = SortQueryBuilder.sort(key).noSort() .get("#") .get("uid:*->name") .get("uid:*->school") .get("uid:*->company") .get("uid:*->followerNum") .get("uid:*->portraitUrl") .get("uid:*->nickname") .limit(range.being, range.end-range.being+1).build(); final Set<String> followingSet= template.opsForSet().members(KeyUtils.following(uid));// BulkMapper<User, String> hm = new BulkMapper<User, String>() { public User mapBulk(List<String> bulk) { User user = new User(); user.setId(bulk.get(0)); user.setName(bulk.get(1)); user.setSchool(bulk.get(2)); user.setCompany(bulk.get(3)); user.setFollowerNum(Integer.valueOf(bulk.get(4)==null?"0":bulk.get(4))); user.setPortraitUrl(bulk.get(5)); user.setNickname(bulk.get(6)); if(followingSet.contains(user.getId().toString())){//判断是否相互关注 user.setLink(true); }else{ user.setLink(false); } //logger.debug("######################user :"+user); return user; } }; return template.sort(query, hm); } /** * 返回总粉丝数 * @param uid * @return */ public int getFollowersNum(String uid){ return template.opsForSet().size(KeyUtils.followers(uid)).intValue(); } /** * 我关注的人关注他的人 * @param uid * @param targetUid * @return */ public ListPage<User> alsoFollowed(String uid, String targetUid,Integer page,Integer pagesize) { RedisSet<String> tempSet = following(uid).intersectAndStore(followers(targetUid),KeyUtils.alsoFollowed(uid, targetUid)); String key = tempSet.getKey(); template.expire(key, 5, TimeUnit.SECONDS); int firstResult = (page-1)*pagesize; int lastResult = (page-1)*pagesize+pagesize-1; int allResults = tempSet.size(); List<User> users=this.getFollowers(uid, key, new Range(firstResult,lastResult)); return new ListPage<User>(users, firstResult, lastResult, allResults); } /** * 我和他共同关注的人 * @param uid * @param targetUid * @return */ public ListPage<User> commonFollowers(String uid, String targetUid,Integer page,Integer pagesize) { RedisSet<String> tempSet = following(uid).intersectAndStore(following(targetUid),KeyUtils.commonFollowers(uid, targetUid)); String key = tempSet.getKey(); template.expire(key, 5, TimeUnit.SECONDS); int firstResult = (page-1)*pagesize; int lastResult = (page-1)*pagesize+pagesize-1; int allResults = tempSet.size(); List<User> users=this.getFollowers(uid, key, new Range(firstResult,lastResult)); return new ListPage<User>(users, firstResult, lastResult, allResults); } private RedisSet<String> following(String uid) { return new DefaultRedisSet<String>(KeyUtils.following(uid), template); } private RedisSet<String> followers(String uid) { return new DefaultRedisSet<String>(KeyUtils.followers(uid), template); } }