Redis
主页 > 数据库 > Redis >

Redis实现点赞取消点赞的代码

2022-03-20 | 秩名 | 点击:

前言

异步实现

代码实现:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

/**

     *

     * @param userId 点赞的人

     * @param type 点赞与取消点赞的表示

     * @param textId   文章ID

     * @param entityUserId -- 被点赞的人,文章作者

     */

    private void like(long userId,int type,int textId,long entityUserId){

        redisTemplate.execute(new SessionCallback() {

            @Override

            public Object execute(RedisOperations operations) throws DataAccessException {

                String entityLikeKey = RedisKeyUtil.getEntityLikeKey(type, textId);

                String userLikeKey = RedisKeyUtil.getUserLikeKey(entityUserId);

                boolean isMember = redisTemplate.opsForSet().isMember(entityLikeKey, userId);

                //多个更新操作,需要事务

                operations.multi();

                if (isMember) {

                    //取消赞

                    redisTemplate.opsForSet().remove(entityLikeKey, userId);

                    redisTemplate.opsForValue().decrement(userLikeKey);

                } else {

                    //点赞

                    redisTemplate.opsForSet().add(entityLikeKey, userId);

                    redisTemplate.opsForValue().increment(userLikeKey);

                }

                return operations.exec();

            }

        });

 

    }

 

    /**

     *查询某实体(帖子,评论等)点赞数量

     * @param type 1点赞,2评论。0表示取消点赞

     * @param textId

     * @return

     */

    private long findEntityLikeCount(int type, int textId){

        String entityLikeKey = RedisKeyUtil.getEntityLikeKey(type, textId);

        return redisTemplate.opsForSet().size(entityLikeKey);

    }

 

    /**

     * 查询某人对某文章的点赞状态

     * @param textId 帖子ID

     * @param userId

     * @return

     */

    private int findEntityLikeStatus(int textId,long userId){

        String entityLikeKey = RedisKeyUtil.getEntityLikeKey(1, textId);

        //此处返回int,是为了进行扩展。比如扩展踩,为止2.等等情况

        return redisTemplate.opsForSet().isMember(entityLikeKey,userId)?1:0;

    }

 

    /**

     * 查询某个用户获得赞,用于在个人主页查看收获了多少赞

     * @param userId

     * @return

     */

    private int findUserLikeCount(long userId){

        String userLikeKey = RedisKeyUtil.getUserLikeKey(userId);

        Integer count = (Integer) redisTemplate.opsForValue().get(userLikeKey);

        // count.intValue()数据的整数形式;

        return count==null?0:count.intValue();

    }

Redis–key设置

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

public class RedisKeyUtil {

    private static final String SPLIT = ":";

    private static final String PREFIX_ENTITY_LIKE = "like:entity";

    private static final String PREFIX_USER_LIKE = "like:user";

    private static final String PREFIX_USER_COMMENTS="comments:user";

    /**

     *某个实体收到的赞,如帖子,

     * like:entity:entityType:entityId -> set(userId) 对应set,存入userId

     * @param entityType

     * @param entityId

     * @return

     */

    public static String getEntityLikeKey(int entityType, int entityId) {

        return PREFIX_ENTITY_LIKE + entityType + SPLIT + entityId;

    }

     *某个用户收到的总赞数

     * like:user:userId ->long

     * @param userId

    public static String getUserLikeKey(long userId) {

        return PREFIX_USER_LIKE + SPLIT + userId;

     * 汇总某个帖子的评论数量

    public static String getUserCommentsKey(int articleId) {

        return PREFIX_USER_COMMENTS + SPLIT + articleId;

原文链接:https://blog.csdn.net/qq_32370913/article/details/123552496
相关文章
最新更新