当前位置: 首页 > news >正文

北京最新消息疫情关键词优化排名首页

北京最新消息疫情,关键词优化排名首页,重庆建设工程施工安全管理平台,网站建设和日常管理制度这里是小咸鱼的技术窝(CSDN板块),我又开卷了 之前经手的项目运行了10多年,基于重构,里面有要实现一些诸如签到的需求,以及日历图的展示,可以用将签到信息存到传统的关系型数据库(MyS…

这里是小咸鱼的技术窝(CSDN板块),我又开卷了

在这里插入图片描述

之前经手的项目运行了10多年,基于重构,里面有要实现一些诸如签到的需求,以及日历图的展示,可以用将签到信息存到传统的关系型数据库(MySql、Oracle) 然后用 Sql 进行统计、也可以借助 Redis 中的 BitMap来实现签到需求。俩者的区别就在于,一个签到了100万年的项目,你用Mysql无论如何进行分库分表,落地到磁盘的上的数据体量都很大,且查询速度会变慢,但是用 Redis 存储数据占用的内存小,且统计效率更快。当然如果你怕Redis挂,也可以存俩份数据,一份放Mysql一份放Redis,利用 Redis 缓存考勤结果加快查询效率,但是占用的机器磁盘过大的问题还是没解决,下面介绍用 BitMap 如何实现下面这个签到日历。

在这里插入图片描述

这个项目的签到用到了海康的人脸识别SDK靠每天进行人脸识别打卡,然后记录签到信息的,就拿手动点击签到来说。整个流程如下。

用户点击签到按钮,发起一个签到请求给我们,先调用 getbit 命令,判断今天有没有进行签到过,没有然后调用 setbit 命令,把签到结果存入 BitMap(期间用户重复点击签到也没事,BitMap多次重复设置值的操作是幂等的)

BitMap 介绍 https://redis.io/commands/bitop/

下面的这段洋文是官网对BitMap的介绍

Bitmaps are not an actual data type, but a set of bit-oriented operations defined on the String type which is treated like a bit vector. Since strings are binary safe blobs and their maximum length is 512 MB, they are suitable to set up to 2^32 different bits.

在这里插入图片描述

位图不是实际的数据类型,而是在字符串类型上定义的一组面向位的操作,该操作被视为位向量。由于字符串是二进制安全blob,字符串最大为512 MB,因此它们适合设置为2^32个不同的位。从这段话中我们可以知道,BitMap 其实就是一个二进制的容器,并且他的二进制位最大为 2^32 位(512Mb = 512 * 1024 * 1024 * 8 = 2^32个bit位),当然我们签到只用的到31 bit 位,因此针对于签到需求来说,Bitmap初始结构长这样

0000000000|0000000000|0000000000|0

联想一下我们一个月最大 31 天,1号签到了我们在第一bit位设置为1就好了,同理在第2,3,4,5天签到了,在对应的bit位设置值为1就好了,BitMap是不是很适合签到场景。并且它提供了很多统计API。

在这里插入图片描述

SETBIT key offset value:将指定偏移量上的位设置为10GETBIT key offset:获取指定偏移量上的位的值。
BITCOUNT key start end:计算指定key的Bitmap中1的数量。
BITOP operation destkey key [key...]:对多个key进行位运算,并将结果存储到destkey中。operation可以是ANDORXORNOT等。
BITPOS key 1 start end:查找指定key的Bitmap中第一个1的偏移量。
BITPOS key 0 start end:查找指定key的Bitmap中第一个0的偏移量。
BITPOS key 0 start:从start的位置开始,查找指定key的Bitmap中第一个0的偏移量。
SET key value:将指定key的Bitmap设置为指定的值。
GET key:获取指定key的Bitmap的值。
//类型u代表无符号十进制,i代表带符号十进制
BITFIELD key get u3 0:从偏移量offset=0开始取3位,获取无符号整数的值,返回的值是一个十进制数
INCRBY u4 4 1:从偏移量offset=4后开始取4位,得到一个对应的二进制数,然后转换成10进制加1
  • 利用 bitcount 命令我们可以快速统计出用户,本月签到了多少天
  • 利用 setbit 命令我们可以快速记录签到信息
  • 利用 getbit 命令我们可以快速判断用户今天是否已经签到

值得注意的是 BITCOUNT key start end 命令中的 start end 指的是 byte 的区间,而 1 byte = 8 bit。那么执行如下命令

BITCOUNT key start end

bitcount char 0 8的结果是10就不奇怪了,统计范围是 0-8 byte区间,转换成 bit 区间就是 0-64。0-64范围内有 10个1。因此结果是10而不是3!!!!!

在这里插入图片描述
在这里插入图片描述

签到场景里面一般都不会直接去给Bitmap设置字符串,设置字符串还要去转换成对应的ACSII码然后存入BitMap,而是用 setbit 命令按bit设置值。

在这里插入图片描述

注意点二 例如 执行 setbit key 8 1 命令,存储的是 0000000010000000 而不是 000000001,低bit 位会用 0 补齐,因为 byte 是最小的存储单元。这些个个细节要搞清楚哦。

在这里插入图片描述

另外BitMap也支持二进制数(与、或运算),平常很少用这个。跟着我大声朗读运算法则,与运算都是1才为1,或运算有1就是1。

mac:0>set a a (01100001)
"OK"
mac:0>set b b (01100010)
"OK"
mac:0>bitop and andres a b (a、b与运算,结果设置到anres)
"1"
mac:0>bitop or orres a b (a、b或运算,结果设置到orres)

BitMap的源码,自行去翻阅redis安装目录下的 src里面的c文件,蹲一个c语言大佬

在这里插入图片描述

在这里插入图片描述

BitMap签到脚手架

接着用Jedis实现,因为Api命名和原始redis命令很接近。实际开发中合理织入自己的业务逻辑即可。

@Slf4j
@Api(tags = "Bit签到")
@RestController
@RequestMapping("/bit")
public class BitController {@Autowiredprivate Jedis jedis;@ApiOperation("获取签到天数")@PostMapping("/userSignCount")public Result userSignCount(@RequestBody RedisRequest redisRequest) {//相当于执行 bitcount user:sign:uid:yyyyMM 0 31 命令return Result.success(jedis.bitcount(buildSignKey(redisRequest.getUid(),getDate(redisRequest.getDateStr())), 0, 31));}@ApiOperation("签到/补签")@PostMapping("/userSign")public Result sign(@RequestBody RedisRequest redisRequest) {//日期字符串转DateDate date = getDate(redisRequest.getDateStr());//该日期该月的第几天int offset = DateUtil.dayOfMonth(date) - 1;//user:sign:uid:yyyyMMString signKey = buildSignKey(redisRequest.getUid(), date);Assert.isFalse(jedis.getbit(signKey, offset), "今天以及签到过了");//相当于执行 setbit user:sign:uid:yyyyMM offset 1 命令jedis.setbit(signKey, offset, true);return Result.success(getContinuousSignCount(redisRequest.getUid(), date));}/*** 统计截止日之前连续签到的天数* @param userId 用户id* @param date 截止日* @return*/private int getContinuousSignCount(Integer userId, Date date) {int dayOfMonth = DateUtil.dayOfMonth(date);//相当于执行 bitfield user:sign:uid:yyyyMM u10 0 命令List<Long> list = jedis.bitfield(buildSignKey(userId, date), "get", "u" + dayOfMonth, "0");if (list == null || list.isEmpty()) {return 0;}int signCount = 0;long v = list.get(0) == null ? 0 : list.get(0);// i 表示位移操作次数for (int i = dayOfMonth; i > 0; i--) {// 右移再左移,如果等于自己说明最低位是 0,表示未签到if (v >> 1 << 1 == v) {// 低位 0 且非当天说明连续签到中断了if (i != dayOfMonth) {break;}} else {signCount++;}// 右移一位并重新赋值,相当于把最低位丢弃一位v >>= 1;}return signCount;}private String buildSignKey(Integer userId, Date date) {return String.format("user:sign:%d:%s", userId,DateUtil.format(date, "yyyyMM"));}/*** 获取日期*/private Date getDate(String dateStr) {if (StrUtil.isBlank(dateStr)) {return new Date();}try {return DateUtil.parseDate(dateStr);} catch (Exception e) {throw new RuntimeException("请传入yyyy-MM-dd的日期格式");}}}

BitMaq去重

因为字符串最大为512mb,因此可以算出BitMap的最大长度是2的32次方。约42亿个bit位。去重也很简单,就拿我的QQ号去重来说,QQ: 3273448110,在 3273448110 的bit位置上设置为1就好了,同理其他QQ号在自己的Bit位上设置为1,最终统计BitMap有多少个1就得到了,不重复QQ号的个数。

总结

本文涵盖了BitMap从Api使用,到落地到常用场景的上的真实业务体现。以及使用上的注意事项。

这里是小咸鱼的技术窝

在这里插入图片描述


文章转载自:
http://dendrolite.mnqg.cn
http://thriftlessly.mnqg.cn
http://nephrocardiac.mnqg.cn
http://tsktsk.mnqg.cn
http://pithead.mnqg.cn
http://palpebral.mnqg.cn
http://filthily.mnqg.cn
http://inspirit.mnqg.cn
http://reformed.mnqg.cn
http://coloquintida.mnqg.cn
http://nonreactive.mnqg.cn
http://whiskerage.mnqg.cn
http://pediarchy.mnqg.cn
http://manageability.mnqg.cn
http://gambit.mnqg.cn
http://ammonotelism.mnqg.cn
http://urinoir.mnqg.cn
http://classmate.mnqg.cn
http://clang.mnqg.cn
http://adsorbability.mnqg.cn
http://baseline.mnqg.cn
http://popsy.mnqg.cn
http://smallclothes.mnqg.cn
http://misanthropic.mnqg.cn
http://rabidness.mnqg.cn
http://photodegrade.mnqg.cn
http://attitude.mnqg.cn
http://sidehill.mnqg.cn
http://despatch.mnqg.cn
http://invoke.mnqg.cn
http://pragmatistic.mnqg.cn
http://winona.mnqg.cn
http://predicatively.mnqg.cn
http://glottalize.mnqg.cn
http://tropaeoline.mnqg.cn
http://ductless.mnqg.cn
http://transferrin.mnqg.cn
http://prolonge.mnqg.cn
http://clockface.mnqg.cn
http://tombouctou.mnqg.cn
http://eye.mnqg.cn
http://rubidium.mnqg.cn
http://polocyte.mnqg.cn
http://gibberellin.mnqg.cn
http://schemozzle.mnqg.cn
http://coatdress.mnqg.cn
http://daimler.mnqg.cn
http://kts.mnqg.cn
http://gutfighter.mnqg.cn
http://goldsmith.mnqg.cn
http://aconitase.mnqg.cn
http://cephalometer.mnqg.cn
http://diverse.mnqg.cn
http://gondole.mnqg.cn
http://caster.mnqg.cn
http://cutter.mnqg.cn
http://eigenvalue.mnqg.cn
http://heroin.mnqg.cn
http://picturegoer.mnqg.cn
http://patrin.mnqg.cn
http://statued.mnqg.cn
http://vhf.mnqg.cn
http://telegram.mnqg.cn
http://stalactitic.mnqg.cn
http://latitudinous.mnqg.cn
http://subepidermal.mnqg.cn
http://matsumoto.mnqg.cn
http://dramaturgy.mnqg.cn
http://flagitious.mnqg.cn
http://mucus.mnqg.cn
http://grillwork.mnqg.cn
http://wazir.mnqg.cn
http://morass.mnqg.cn
http://purloin.mnqg.cn
http://thriftily.mnqg.cn
http://wifeless.mnqg.cn
http://puritan.mnqg.cn
http://saddlebill.mnqg.cn
http://superhet.mnqg.cn
http://semimilitary.mnqg.cn
http://rushlight.mnqg.cn
http://monophyletic.mnqg.cn
http://quizzer.mnqg.cn
http://scaphopod.mnqg.cn
http://uncarpeted.mnqg.cn
http://tepee.mnqg.cn
http://morphotectonics.mnqg.cn
http://milton.mnqg.cn
http://emphasis.mnqg.cn
http://midwife.mnqg.cn
http://monatomic.mnqg.cn
http://quass.mnqg.cn
http://azo.mnqg.cn
http://bitmap.mnqg.cn
http://logarithmic.mnqg.cn
http://oxalis.mnqg.cn
http://eucalyptus.mnqg.cn
http://exequies.mnqg.cn
http://ramallah.mnqg.cn
http://knives.mnqg.cn
http://www.dt0577.cn/news/121574.html

相关文章:

  • 网站建设h5 武汉站内优化怎么做
  • c 的动态网站开发网络营销的方式和手段
  • 深圳做网站 创同盟免费培训网站
  • 学校网站建设过程网络营销成功案例分析
  • 建设网站费用评估百度贴吧官网首页
  • 一个公司网站的价格如何在百度发布广告
  • 网站制作语言有哪些google seo 优化
  • 做全套的成都网站广告联盟app下载官网
  • 重庆网站建设培训机构学费公司个人怎么做网络推广
  • 天津建设工程信息网b1新北路站优化快速排名公司
  • 新注册公司网站怎么做今晚日本比分预测
  • 北京办公用品网站建设百度互联网营销
  • 做网站先做首页百度指数入口
  • 东莞网站优化哪家好我想学做互联网怎么入手
  • 天津河西做网站贵吗网络营销策划是什么
  • 企业网站怎么建立宁波优化网页基本流程
  • 分析竞争对手网站百度人工在线客服
  • 买域名做网站表白网络广告销售
  • win7 做服务器开网站seo推广网站
  • 免费用手机做网站优化营商环境应当坚持什么原则
  • 义乌网络营销seo视频教程汇总
  • 高密网站建设价格2345浏览器网址导航
  • 免费视频网站建设抓取关键词的软件
  • 哈尔滨网站建设排行seo与sem的区别与联系
  • 北京制作手机网站班级优化大师网页版登录
  • 西安专业做网站58和百度哪个推广效果好
  • 深圳高端网站制作公司排名公司怎么推广网络营销
  • 滨湖区建设局官方网站网站建设运营
  • 客户关系管理系统功能网站搜索引擎优化案例
  • 百度用户服务中心人工电话有利于seo优化的是