用户表有数字的唯一字段情况下用Redis的BitMap实现点赞功能

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 用户表有数字的唯一字段情况下用Redis的BitMap实现点赞功能

用户表有数字的唯一字段情况下用Redis的BitMap实现点赞功能(不能保存数据)


用户ID为数字的情况下用redis bitmaps实现点赞功能


需求如下:


1.点赞

2.取消点赞

3.查看是否点赞

4.统计有多少点赞


1.BitMap简介


(1)BitMap是一连串的二进制数字(0,1),每一位所在的位置为偏移(offset),在BitMap上可以执行AND,OR,XOR以及其他操作。


(2)位图计数

位图计数的意思是统计BitMap中值为1的位的个数,位图计数的效率是很高的。


(3)Redis BitMap

Redis中允许使用二进制的Key和二进制的Value,BitMap就是二进制的Value。


2.需求实现


(1)点赞/取消点赞

假设用户的数字Id为123456L,对textId为text1的微博点赞。首先根据textId生成赞数据存储的Redis key,比如生成策略为praise_{textId},userId为123456L的用户点赞,只需要将praise_text1的第123456位置为1即可(取消赞则置为0)。

(2)是否点赞

就是根据key和偏移量的值来查询对应的值是1还是0.查询userId为123456L的用户是否给praise_text1点赞,就只需查询praise_text1的第123456位置是否为1即可。

(3)统计有多少点赞

就是利用位图计数的原理来实现。

Jedis把很多方法都封装好了,理解了BitMap的思想后代码实现就是非常简单的了。

import redis.clients.jedis.Jedis;
/**
 * @Author Zhongger
 * @Description 
 * @Date 2020.3.19
 */
public class RedisDriver {
    private Jedis jedis=null;
    public RedisDriver(){
        jedis=new Jedis("localhost",6379);
        jedis.auth("123456");
    }
    /**
     * 点赞
     * @param textId 内容id
     * @param userId 用户id
     */
    public void praise(String textId,Long userId){
        jedis.setbit("praise_" + textId, userId, true);
        System.out.println(userId+"给"+textId+"点赞");
    }
    /**
     * 取消赞
     * @param textId 内容id
     * @param userId 用户id
     */
    public void unPraise(String textId,Long userId){
        jedis.setbit("praise_" + textId, userId, false);
        System.out.println(userId+"取消了"+textId+"的点赞");
    }
    /**
     * 是否点赞
     * @param textId 内容id
     * @param userId 用户id
     * @return true/false
     */
    public boolean isPraise(String textId, Long userId){
        Boolean flag = jedis.getbit("praise_" + textId, userId);
        System.out.println(userId+"给"+textId+"点赞了吗?"+flag);
        return flag;
    }
    /**
     *  查询点赞次数
     *  @param  textId 内容id
     *  @return 一个text被点赞的次数
     */
    public Long praiseCount(String textId){
        Long bitcount = jedis.bitcount("praise_" + textId);
        System.out.println(textId+"的点赞数为"+bitcount);
        return bitcount;
    }
    public static void main(String[] args) {
        RedisDriver driver = new RedisDriver();
        driver.praise("text1",123456L);
        driver.unPraise("text1",123456L);
        driver.praise("text1",10000L);
        driver.praise("text1",10002L);
        driver.praiseCount("text1");
    }
}

运行结果如下:


20200319150818525.png

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
19天前
|
存储 缓存 NoSQL
深入了解Redis键管理:探索Redis键命令及其功能与应用场景
深入了解Redis键管理:探索Redis键命令及其功能与应用场景
|
19天前
|
消息中间件 存储 缓存
探索Redis CLI:功能强大的Redis命令行工具及其应用场景
探索Redis CLI:功能强大的Redis命令行工具及其应用场景
|
19天前
|
存储 NoSQL Serverless
位运算的魅力:使用Redis Bitmap高效处理百万级布尔值
位运算的魅力:使用Redis Bitmap高效处理百万级布尔值
108 0
|
19天前
|
存储 NoSQL BI
Redis 实战篇:巧用 Bitmap 实现亿级海量数据统计
Redis 实战篇:巧用 Bitmap 实现亿级海量数据统计
75 0
|
19天前
|
存储 NoSQL 算法
深入浅出Redis(十一):Redis四种高级数据结构:Geosptial、Hypeloglog、Bitmap、Bloom Filter布隆过滤器
深入浅出Redis(十一):Redis四种高级数据结构:Geosptial、Hypeloglog、Bitmap、Bloom Filter布隆过滤器
|
19天前
|
SQL NoSQL Java
Redis数据类型 Hash Set Zset Bitmap HyperLogLog GEO
Redis数据类型 Hash Set Zset Bitmap HyperLogLog GEO
24 0
|
19天前
|
缓存 NoSQL Java
【亮剑】分布式锁是保证多服务实例同步的关键机制,常用于互斥访问共享资源、控制访问顺序和系统保护,如何使用注解来实现 Redis 分布式锁的功能?
【4月更文挑战第30天】分布式锁是保证多服务实例同步的关键机制,常用于互斥访问共享资源、控制访问顺序和系统保护。基于 Redis 的分布式锁利用 SETNX 或 SET 命令实现,并考虑自动过期、可重入及原子性以确保可靠性。在 Java Spring Boot 中,可通过 `@EnableCaching`、`@Cacheable` 和 `@CacheEvict` 注解轻松实现 Redis 分布式锁功能。
|
19天前
|
存储 监控 NoSQL
|
19天前
|
NoSQL 算法 Java
Redis入门到通关之BitMap实现签到
Redis入门到通关之BitMap实现签到
23 2
|
19天前
|
存储 NoSQL API
Redis入门到通关之GEO实现附近的人功能
Redis入门到通关之GEO实现附近的人功能
17 0