package com.xiaozhi.blog.redis; import java.util.List; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.core.BulkMapper; import org.springframework.data.redis.core.RedisCallback; 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.vo.Range; import com.xiaozhi.blog.vo.User; //@Component public class FollowingDao1 { private static Log logger = LogFactory.getLog(FollowingDao1.class); @Autowired private StringRedisTemplate template; /** * 获取关注列表 * @param uid * @return */ public Set<String> getFollowings(String uid){ return template.opsForSet().members(KeyUtils.following(uid)); } /** * 分页获取关注列表 * @param uid * @return */ public List<User> getFollowings(final String uid, Range range) { SortQuery<String> query = SortQueryBuilder.sort(KeyUtils.following(uid)).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> followerSet= template.opsForSet().members(KeyUtils.followers(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(followerSet.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 getFollowingsNum(String uid){ return template.opsForSet().size(KeyUtils.following(uid)).intValue(); } public boolean isFollowing(String uid, String targetUid) { return following(uid).contains(targetUid); } /** * 加关注 * @param targetUser */ public boolean follow(final String targetUid,final String uid) { boolean result = (Boolean) template.execute(new RedisCallback<Object>() { @Override public Object doInRedis(RedisConnection connection)throws DataAccessException { try { connection.multi();//事务开启 connection.sAdd(KeyUtils.following(uid).getBytes(), targetUid.getBytes()); connection.hIncrBy(KeyUtils.uid(uid).getBytes(), "followingNum".getBytes(), 1);//对自己关注数+1操作 connection.sAdd(KeyUtils.followers(targetUid).getBytes(), uid.getBytes()); connection.hIncrBy(KeyUtils.uid(targetUid).getBytes(), "followerNum".getBytes(), 1);//对对方的粉丝数+1操作 connection.exec(); return true; } catch (Exception e) { logger.error("==================> follow error :"+e.toString()); }finally{ connection.close(); } return false; } }); return result; } /** * 停止关注 * @param targetUser */ public boolean stopFollowing(final String targetUid,final String uid) { boolean result = (Boolean) template.execute(new RedisCallback<Object>() { @Override public Object doInRedis(RedisConnection connection)throws DataAccessException { try { connection.multi();//事务开启 connection.sRem(KeyUtils.following(uid).getBytes(), targetUid.getBytes()); connection.hIncrBy(KeyUtils.uid(uid).getBytes(), "followingNum".getBytes(), -1);//对自己关注数-1操作 connection.sRem(KeyUtils.followers(targetUid).getBytes(), uid.getBytes()); connection.hIncrBy(KeyUtils.uid(targetUid).getBytes(), "followerNum".getBytes(), -1);//对对方的粉丝数-1操作 connection.exec(); return true; } catch (Exception e) { logger.error("==================> stopFollowing error :"+e.toString()); }finally{ connection.close(); } return false; } }); return result; } private RedisSet<String> following(String uid) { return new DefaultRedisSet<String>(KeyUtils.following(uid), template); } // private List<String> covertUidsToNames(String key) { // return template.sort(SortQueryBuilder.sort(key).noSort().get("uid:*->name").build()); // } // private RedisSet<String> followers(String uid) { // return new DefaultRedisSet<String>(KeyUtils.followers(uid), template); // } }