Redis研学-三种特殊类型的常用命令

一 geospatial(地理位置)

朋友的定位,附近的人,打车距离计算(城市经纬度查询:可以查询一些测试数据)

java 复制代码
//规则:两级无法直接添加,一般会下载城市数据,直接通过java程序一次性导入 key(经 纬 地名)
//有效的经度从-180度到180度,纬度从-85.05112878度到85.05112878度,超出范围返回错误
geoadd china:city 116.40 39.90 beijing//设置北京的地理位置
geoadd china:city 121.47 31.23 shanghai//设置上海的地理位置
geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen//设置重庆 深圳
//获取城市经纬度 获得当前定位一定是一个坐标值
geopos china:city beijing//获取指定城市(北京)经纬度
geopos china:city beijing chongqing//获取北京重庆经纬度 
//计算两个坐标(北京到上海)之间的直线距离(千米)
geodist china:city beijing shanghai km
//以给定的经纬度为中心,找出每一半径中的元素(获取所有附近的人定位,通过半径查询 应用于好友定位) 
georadius china:city 110 30 1000 km//半径1000公里查询经纬度110 30
georadius china:city 110 30 1000 km withdist//输出查询结果带上直线距离
georadius china:city 110 30 1000 km withcoord//输出查询结果带上经纬度
georadius china:city 110 30 1000 km withdist withcoord count 1//半径内人数很多,只展示1个附近的人(可以通过count进行限制,限定展示人数,人少就有多少展示多少)
//以元素(北京)为中心,搜寻半径1000公里内的元素 应用于城市定位
georadiusbymember china:city beijing 1000 km
//获取当前城市经纬度所代表的字符串(将二维的经纬度转化为一维的11位字符串,越长越精确)
geohash china:city beijing
//geo的底层实现原理其实就是Zset 我们可以使用zset命令操作geo
zrange china:city 0 -1//获取当前所有的元素
zrem china:city beijing//移除geo中的指定元素

二 Hyperloglog(基数统计算法)

基数指集合中不重复的元素 A{1,3,5,7,8,7}基数为5 B{1,3,5,7,8}基数为5,可以接受误差

网页的UV(一个人访问一个网站多次,但还是算作一个人)

传统的方式,set保存用户的id,然后可以统计set中的元素数量作为标准判断

这个方式如果保存大量的用户id就会比较麻烦,我们的目的是为了计数,而不是保存用户id

Hyperloglog的优点:占用的内存是固定的,2^64位不同的基数,只需要废12kb的内存,从内存角度来比较Hyperloglog是首选。但它存在0.81%的错误率(官方说的统计UV数据可以忽略不计) 允许容错可以使用 不允许容错则不能使用

java 复制代码
pfadd mykey a b c d e f g//将大量元素存入mykey第一组元素
pfadd mykey2 q w e r t y u i//将大量元素存入mykey第二组元素
pfcount mykey//统计基数元素数量
pfmerge mykey3 mykey mykey2//取mykey和mykey2的基数并集 放入mykey3

三 Bitmaps(位存储)-位图 数据结构 二进制记录

统计疫情感染人数:0 1 0 1 1(0代表未感染 1代表已感染)

统计用户信息:登录 未登录,打卡365打卡(只用两种状态,都可以使用bitmaps)

365天=365bit 1字节=8bit 46个字节存储一个用户一年的信息

java 复制代码
setbit sign 0 1//设置 key 0(通过数字代表信息例如周几) 0(只有0 1两种状态)
getbit sign 0//查询周1的打卡记录 返回他的0 1状态
bitcount sign//统计操作 统计这周打卡的天数(状态为1的天数)

// 设置key从0-7表示周1到周日 0 未打卡 1 已打卡
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379>  setbit sign 3 0
(integer) 0
127.0.0.1:6379>  setbit sign 4 1
(integer) 0
127.0.0.1:6379>  setbit sign 5 1
(integer) 0
127.0.0.1:6379>  setbit sign 6 0
(integer) 0
127.0.0.1:6379>  setbit sign 7 0
(integer) 0
// 统计一周上了几天班
127.0.0.1:6379> bitcount sign
(integer) 3
127.0.0.1:6379>
相关推荐
小光学长13 分钟前
基于ssm的膳食健康管理系统e6whl4q7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·开发语言·数据库·学习·ssm
java1234_小锋14 分钟前
Java高频面试题:Redis到底支不支持事务啊?
java·redis·面试
一个天蝎座 白勺 程序猿21 分钟前
KingbaseES融合数据库:一库多能,企业数据管理新思路
数据库·性能优化·kingbasees·金仓数据库
橘颂TA31 分钟前
【MySQL】解锁表的 N 种牵手方式:SQL 连接与子查询漫游(复合查询)
数据库·mysql
数据知道38 分钟前
MongoDB基于角色的访问控制(RBAC):精细化权限管理的实用方法
数据库·mongodb
代码派44 分钟前
NineData社区版:免费+本地化部署,满足数据库DevOps、数据复制与一致性对比的数据库管理平台
运维·数据库·database·devops·数据库管理工具·ninedata·数据库迁移
jarvisuni1 小时前
GLM5实战测试,挑战Opus4.6 !
前端·数据库
wyt5314291 小时前
基于人脸识别和 MySQL 的考勤管理系统实现
数据库·mysql
数据知道1 小时前
MongoDB分片键选择策略:决定数据分布与查询性能的关键因素
数据库·mongodb
smchaopiao1 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python