Redis-实战案例

资料来源 极客时间 Redis 亚风 原文视频:https://u.geekbang.org/lesson/535?article=681063

需求一 :帖子

同⼀个⽤户只能点赞⼀次,再次点击则取消点赞
如果当前⽤户已经点赞,则点赞按钮⾼亮实现
展示点赞数量并展示点赞top3(时间)的⽤户信息

@RestController
public class BlogController {@AutowiredStringRedisTemplate stringRedisTemplate;/*** 博客点赞功能,不需要排行榜* @param userID* @param blogID* @return*/@GetMapping("/likeBlog")public String likeBlog(String userID, String blogID) {String key = "blog" + ":" + blogID;Boolean member = stringRedisTemplate.opsForSet().isMember(key, userID);if (Boolean.TRUE.equals(member)) {System.out.println("已点赞,取消点赞");stringRedisTemplate.opsForSet().remove(key, userID);} else {System.out.println("没有点赞,进行点赞");stringRedisTemplate.opsForSet().add(key, userID);}return "OK";}/*** 博客点赞功能,需要排行榜* @param userID* @param blogID* @return*/@GetMapping("/likeBlogTop")public String likeBlogTop(String userID, String blogID) {String key = "blog" + ":" + blogID;Double score = stringRedisTemplate.opsForZSet().score(key, userID);if (Objects.nonNull(score)) {System.out.println("已点赞,取消点赞");stringRedisTemplate.opsForZSet().remove(key, userID);} else {System.out.println("没有点赞,进行点赞");// 时间 越靠前 得分越多stringRedisTemplate.opsForZSet().add(key, userID, System.currentTimeMillis());}return "OK";}/*** 博客点赞功能,返回top3* @param userID* @param blogID* @return*/@GetMapping("/getBlog")public Blog getBlog(String blogID, String userID) {String key = "blog" + ":" + blogID;Long count = stringRedisTemplate.opsForZSet().size(key);Blog blog = new Blog();blog.setBlogID(blogID);blog.setLikeCount(count);blog.setIsLike(Objects.nonNull(stringRedisTemplate.opsForZSet().score(key, userID)) );Set<String> likeUsers = stringRedisTemplate.opsForZSet().range(key, 0, 2);blog.setLikeUsers(likeUsers);return blog;}
}

需求二 : 附近的人或者商店

GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加⼊了对GEO的⽀持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。 其原理是geohash
GEOADD:添加⼀个地理空间信息,包含:经纬度、值
GEODIST:计算指定的两个点之间的距离并返回
GEOHASH:将指定member的坐标转为hash字符串形式并返回
GEOPOS:返回指定member的坐标
GEORADIUS:指定圆⼼、半径,找到该圆内包含的所有member,并按照与圆⼼之间的距离排序后返回。6.2以后已废弃。
GEOSEARCH:在指定范围内搜索member,并按照与指定点之间的距离排序后返回。范围可以是圆形或矩形。6.2新功能。
geohash 相关知识

@RestController
public class GeoController {@AutowiredStringRedisTemplate stringRedisTemplate;/*** 就算距离* @param x* @param y* @return*/@RequestMapping("radius")@ResponseBodypublic List<GeoResult<RedisGeoCommands.GeoLocation<String>>> radius(double x, double y){RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().limit(5)//包含成员距离中心点的距离.includeDistance();GeoResults<RedisGeoCommands.GeoLocation<String>> result = stringRedisTemplate.opsForGeo().radius("near",new Circle(new Point(x,y),new Distance(10000, Metrics.KILOMETERS)),args);return result.getContent();}/*** 添加地理坐标系* @return*/@RequestMapping("putLongLat")public String  putLongLat() {double x = 130.5423;double y = 30.54235;String key = "near";String member;for (int i = 0; i < 5; i ++) {x += i * 0.01;y += i * 0.01;member = "po" + i;stringRedisTemplate.opsForGeo().add(key, new Point(x, y), member);}return "OK";}
}

需求三:签到

把每⼀个bit位对应当⽉的每⼀天,形成了映射关系。⽤0和1标示业务状态,这种思路就称为位图(BitMap),Redis中是利⽤string类型数据结构实现BitMap,因此最⼤上限是512M,转换为bit则是 2^32 个bit位。
BitMap的操作命令有:
SETBIT:向指定位置 (offset)存⼊⼀个0或1
GETBIT:获取指定位置 (offset)的bit值
BITCOUNT:统计 BitMap中值为1的bit位的数量
BITFIELD:操作(查询、修改、⾃增) BitMap中bit数组中的指定位置
(offset)的值
BITFIELD_RO:获取BitMap中bit数组,并以⼗进制形式返回
BITOP:将多个BitMap的结果做位运算(与、或、异或)
BITPOS:查找bit数组中指定范围内第⼀个0或1出现的位置

@RestController
public class SignController {@AutowiredStringRedisTemplate stringRedisTemplate;@RequestMapping("sign")@ResponseBodypublic  String sign(String userId) {LocalDateTime now = LocalDateTime.now();String key= "sign:"+userId+ ":"+now.format(DateTimeFormatter.ofPattern("yyyyMM"));// 将当天的位变为 1stringRedisTemplate.opsForValue().setBit(key,now.getDayOfMonth()-1,true);return "SUCCESS";}@RequestMapping("signCount")@ResponseBodypublic Long signCount(String userId) {LocalDateTime now = LocalDateTime.now();String key= "sign:"+userId+ ":"+now.format(DateTimeFormatter.ofPattern("yyyyMM"));List<Long> result = stringRedisTemplate.opsForValue().bitField(key, BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(now.getDayOfMonth())).valueAt(0));if(CollectionUtils.isEmpty(result)){return 0L;}Long num = result.get(0);// 统计连续签到数量Long count = 0L;while(true){if((num&1)==0){break;}else{count++;}num >>>=1;}return count;}
}

需求四:UV统计

UV:全称Unique Visitor,也叫独⽴访客量,是指通过互联⽹访问、浏览这个⽹⻚的⾃然⼈。1天内同⼀个⽤户多次访问该⽹站,只记录1次。
PV:全称Page View,也叫⻚⾯访问量或点击量,⽤户每访问⽹站的⼀个⻚⾯,记录1次PV,⽤户多次打开⻚⾯,则记录多次PV。往往⽤来衡量⽹站的流量。
Hyperloglog(HLL)是从Loglog算法派⽣的概率算法,⽤于确定⾮常⼤的集合的基数,⽽不需要存储其所有值。
Redis中的HLL是基于string结构实现的(不允许出现相同元素),单个HLL的内存永远⼩于16kb,作为代价,其测量结果是概率性的,有⼩于0.81%的误差。不过对于UV统计来说,这完全可以忽略。

PFADD key element | [elements] #也就是支持数组 #命令用于将一个或多个元素添加到 HyperLogLog 中。如果 HyperLogLog 不存在,该命令将创建一个新的 HyperLogLog。如果 HyperLogLog已经存在,它将更新估计的基数。
PFCOUNT key | [keys] #也支持数组 #PFCOUNT 是 Redis 中用于获取 HyperLogLog(基数估计算法)数据结构的估计基数(不同元素的数量)的命令。该命令用于返回给定 HyperLogLog 的近似基数,即集合中的不同元素数量的估计值。
PFMERGE destkey sourcekey [sourcekey...] #合并key

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vc中关于 directx的配置,和dxsdk_extras(directshow)

2009-11-10 0:28此文章&#xff1a;自己编写 转载于《汤姆&杰瑞》 DirectShow 1 —— 下载与VC配置 1 DirectX SDK9 Directshow sdk 下载网址 &#xff1a;http://download.microsoft.com/download/d/9/1/d91c44b9-fbac-4e8e-bee1-4a75777923ec/dxsdk_feb2005_extras.exe 在…

BP神经网络识别手写数字项目解析及matlab实现

BP神经网络指传统的人工神经网络&#xff0c;相比于卷积神经网络(CNN)来说要简单些。 人工神经网络具有复杂模式和进行联想、推理记忆的功能, 它是解决某些传统方法所无法解决的问题的有力工具。目前, 它日益受到重视, 同时其他学科的发展, 为其提供了更大的机会。1986 年, Rom…

智能家居市场年增速近30%!苹果看齐亚马逊、谷歌,欲开辟三足鼎立

来源&#xff1a;物联网智库整理摘要&#xff1a;作为世界领先的科技巨头&#xff0c;亚马逊、谷歌和苹果相爱相杀许多年。在智能家居领域&#xff0c;三家的“战争”也会随着市场的成熟而更加激烈。尽管苹果目前稍显落后&#xff0c;但未来市场广阔谁主沉浮仍未可知。近日&…

简单实现UITableView索引功能(中英文首字母索引)(一) ByH罗

UITableView索引功能是常见的,主要是获取中英文的首字母并排序&#xff0c;系统自带获取首字母 //系统获取首字母 - (NSString *) pinyinFirstLetter:(NSString*)sourceString {NSMutableString *source [sourceString mutableCopy];CFStringTransform((__bridge CFMutableStr…

matlab——图像细化

所谓细化&#xff0c;就是从原来的图像中去掉一些点&#xff0c;但仍要保持原来的形状。 1、代码如下&#xff1a; close all;clear all;clc; %关闭所有图形窗口&#xff0c;清除工作空间所有变量&#xff0c;清空命令行 I1imread(circles.png); subplot(1,3,1),imshow(I1);…

中国60家最强汽车初创在此!芯片厂高调入局,智能网联强势霸榜

来源&#xff1a;智东西摘要&#xff1a;中国汽车科技最全地图&#xff01;2018年&#xff0c;知名市场研究机构毕马威再次设立了中国汽车科技领先企业50强和新锐企业10强榜单评选&#xff0c;并在近日公布了结果。备选企业包括在智能网联、汽车后市场服务、汽车制造技术、出行…

Python中矩阵库Numpy基本操作

NumPy是一个关于矩阵运算的库&#xff0c;熟悉Matlab的都应该清楚&#xff0c;这个库就是让python能够进行矩阵话的操作&#xff0c;而不用去写循环操作。 下面对numpy中的操作进行总结。 numpy包含两种基本的数据类型&#xff1a;数组和矩阵。 数组(Arrays) >>> …

作业6--团队项目之需求

队员&#xff1a;欧泽波 201306114428 杨洁华 201306114429 赵泽嘉 201306114430 林扬滨 201306114424 学生&#xff08;杨洁华&#xff09;&#xff1a;软件的界面太单调了&#xff0c;不好看&#xff0c;要是有卡通人物就好了&#xff0c;有些题老师也没教&#xff0c;不知道…

专设AI周会 高管悉数到场 微软CEO有多重视人工智能?

来源&#xff1a;CNBC 翻译 | 网易智能 (天门山)据CNBC报道&#xff0c;一般在每周的周四&#xff0c;微软首席执行官萨蒂亚纳德拉(Satya Nadella)和微软高管团队都要在一起开会&#xff0c;讨论该公司越来越多的人工智能&#xff08;AI&#xff09;项目。微软首席技术官凯文斯…

vb的VSFlexGrid控件

多行选中 VSFlexGrid的SelectionMode flexSelectionListBox&#xff0c;现在可以配合Ctrl进行多行选择 循环取值 用vsflexgrid.SelectedRows 可以得到你选择的行的总数量然后用循环可以得到具体的行中具体列的内容Dim Temp As StringDim i As IntegerFor i 0 To VSFlexGrid.…

汽车电子:下一个苹果产业链

来源&#xff1a;安信证券摘要&#xff1a;本文将从“7个层级深度解析”这次产业发展红利带来巨大且丰富的投资机遇。汽车电子产业&#xff0c;预计将是继家电、PC和手机之后又一次全产业链级别的大发展机遇&#xff0c;不同的是&#xff1a;1. 其构成产品附加值更高(高稳定/高…

模块化开发之sea.js实现原理总结

seajs官网说&#xff1a;seajs是一个模块加载器&#xff0c;所以学习它并不难。 在我的理解就是&#xff1a;本来我们是需要手动创建 script标签 引入 js文件的&#xff0c;但用seajs后&#xff0c;它就自动帮我们完成这些工作。 这里只说实现原理&#xff0c;具体使用请看seaj…

mysql获取各种日期

select curdate(); --获取当前日期 select last_day(curdate()); --获取当月最后一天。 select DATE_ADD(curdate(),interval -day(curdate())1 day); --获取本月第一天 select date_add(curdate()-day(curdate())1,interval 1 month); -- 获取下个月的第一天 select DATEDIFF(…

【干货】百度联合清华大学发布国内首个基于AI实践的《产业智能化白皮书》(附报告全文)...

来源&#xff1a;百度AI在4月9日举行的“百度大学 Alpha 学院首期学员毕业典礼”上&#xff0c;百度联合清华大学发布国内首个基于 AI 实践的行业重磅报告&#xff0c;《产业智能化白皮书——人工智能产业化发展地形初现端倪》。这是国内首次从产业演进的视角探讨 AI 与产业融合…

endl与'\n'的区别

endl\n刷新缓冲区&#xff0c;但是以下两段代码&#xff1a; #include<iostream> #include<iomanip> #include<cstdlib> …

全球语种谱系图,看看机器翻译需要跨越的大山

来源&#xff1a;语言春秋编辑 | 北外新闻中心 杨丹蕊摘要&#xff1a;当前机器翻译技术可以分成两类&#xff0c;一种是 Rich Resource NMT&#xff0c;也就是双语语料丰富的语言对&#xff08;比如中文 - 英文&#xff09;&#xff1b;另一种叫 Low Resource NMT&#xff0c…

Big Data Security Part One: Introducing PacketPig

Series Introduction Packetloop CTO Michael Baker (cloudjunky) made a big splash when he presented ‘Finding Needles in Haystacks (the Size of Countries)‘ at Blackhat Europe earlier this year. The paper outlines a toolkit based onApache Pig, Packetpig pack…

美国科学家成功恢复老年人工作记忆,望奠定认知干预疗法基础

来源&#xff1a;科技日报伴随着人体衰老&#xff0c;大脑对信息加工和贮存的能力也必然会下降&#xff0c;但如果这种能力可以被逆转呢&#xff1f;据英国《Nature Neuroscience》杂志8日在线发表的一项研究&#xff0c;美国科学家通过同步脑区节律——按特定节律刺激颞叶和额…

SQL Server--通过存储过程生成表数据的脚本

CREATE PROCEDURE dbo.UspOutputData   tablename sysname AS declare column varchar(1000) declare columndata varchar(1000) declare sql varchar(4000) declare xtype tinyint declare name sysname declare objectId int declare objectname sysname declare ident int…

广告机市场和产品

广告机行业分析 前言 关于广告机&#xff0c;不同的人有不同的认识&#xff0c;此部分主要说明文中所指广告机的范围。 在讨论前&#xff0c;先区分几个概念。 1、 广告机与数字标牌 数字标牌是数字标示牌的简称&#xff0c;指代显示任意信息的显示终端&#xff1b;广告机是指…