go使用redis位运算做用户点赞统计

该博客介绍了如何利用Go语言和Redis的位运算来统计用户点赞数。通过初始化一个二进制字符串并利用Redis的SetBit、GetBit和BitCount命令,可以高效地进行点赞状态的设置和统计。示例代码展示了从初始化到点赞操作再到获取点赞数量的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

go使用redis位运算做用户点赞统计

使用redis的位运算,统计点赞数.
使用"0"字符作为初始化的二进制字符, 二进制为: 00110000
使用redis的命令:
set: set key value
setbit: setbit key offset value(0或1)
getbit: getbit key offset(下标)
bitcount: bitcount key [start, end](start:为开始字符下标, end:为字符的最大长度减1)
使用实例: https://github.com/yunziyuan/cntech-go

名称第一位第二位第三位第四
字符0000
字符下标0123
对应二进制00110000001100000011000000110000
对应下标012345678…1516…2324…31
初始化redis连接
  var RedisConn *redis.Client
  var ctx = context.Background()
  func InitRedis()  {
  	RedisConn = redis.NewClient(&redis.Options{
  		Addr:"127.0.0.1:7109",
  		Password:"",
  		DB:0,
  	})
  	//defer RedisConn.Close()
  }
初始化存储
  // 初始化点赞数据 key: 存在业务 total: 存储总数量
  // 使用0字符串的二进制作为二进制
  func initClick(key string, total int64) (bool,error) {
  	// 拼接字符长度
  	if total <= 0 {
  		return false, errors.New("总长度不正确")
  	}
  	str := "0"
  	var l int
  	if total > 8 {
  		l = int(math.Ceil(float64(total) / 8.00))
  		for i := 1; i < l; i++ {
  			str +="0"
  		}
  	}
  	// 计算需要置0的位置
  	var sitZeros []int64
  	for i := 0; i < l * 8; i++ {
  		fSit := int64(2 + 8 * i)
  		if fSit >= int64(l * 8) {
  			break
  		}
  		sits := []int64{
  			fSit, fSit + 1,
  		}
  		sitZeros = append(sitZeros, sits...)
  	}
  	// 字符:      0000
  	// 对应二进制: 00110000 00110000 00110000 00110000
  	// 对应下标:   01234567 8.....15 16....23 24....31
  	err := RedisConn.Set(ctx, key, str,0).Err()
  	if err != nil {
  		fmt.Println("设置失败:", err)
  	}
  	// 将对应1的位置修改为0
  	// 需要置0的位置 2,3,10,11,18,19,26,27
  	for _,v := range sitZeros {
  		err = RedisConn.SetBit(ctx, key, v, 0).Err()
  		if err != nil {
  			fmt.Println("置0失败:", err)
  			return false, err
  		}
  	}
  	return true, nil
  }
按下标进行点赞
  // 获取点赞数量 使用32个二进制位表示
  func clickNum(key string) (int64,error) {
  	// 统计所有的位置的1的数量
  	// 字符:        0000
  	// 对应位置下标: 0123
  	l,err := RedisConn.StrLen(ctx, key).Result()
  	if err != nil {
  		return 0, err
  	}
  	sit := redis.BitCount{Start: 0,End: l-1}
  	num, err := RedisConn.BitCount(ctx, key, &sit).Result()
  	if err != nil {
  		return 0, err
  	}
  	return num, nil
  }
统计点赞数
  // 点赞设置 sit:点赞下标  value 设置值 只能是 0或者1
  func clickSet(key string, sit int64, value int) (bool,error) {
  	err:= RedisConn.SetBit(ctx, key, sit, value).Err()
  	if err != nil {
  		fmt.Println("置0失败:", err)
  		return false, err
  	}
  	return true, nil
  }
使用实例
  func main()  {
  	InitRedis()
  	// 初始化点赞
  	key := "click2"
  	//bol, err := initClick(key, 33)
  	//if !bol || err != nil {
  	//	log.Fatal("初始化数据失败:",err)
  	//}
  
  	// 点赞
  	bol, err := clickSet(key,87, 1)
  	if !bol || err != nil {
  		log.Fatal("点赞失败:",err)
  	}
  	fmt.Println("点赞成功")
  
  	// 统计点赞
  	num, err := clickNum(key)
  	if err != nil {
  		log.Fatal("点赞获取失败:", err)
  	}
  	fmt.Println("点赞人数:", num)
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值