Redis其他数据类型
打开Xshell之后,如何打开6379?
[root@iZ2ze5s090y2d3q50krshoZ ~]# redis-cli -a 密码
1、bitmap 位图
help @string
GETBIT key offset
含义:对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
summary: Returns the bit value at offset in the string value stored at key
since: 2.2.0
举例:
# 对不存在的 key 或者不存在的 offset 进行 GETBIT, 返回 0
127.0.0.1:6379> EXISTS bit
(integer) 0
127.0.0.1:6379> GETBIT bit 113
(integer) 0
# 对已存在的 offset 进行 GETBIT
127.0.0.1:6379> SETBIT bit 113 1
(integer) 0
127.0.0.1:6379> GETBIT bit 113
(integer) 1
SETBIT key offset value
summary: Sets or clears the bit at offset in the string value stored at key
since: 2.2.0
含义:对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
举例:
redis> SETBIT bit 10086 1
(integer) 0
redis> GETBIT bit 10086
(integer) 1
redis> GETBIT bit 100 # bit 默认被初始化为 0
(integer) 0
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
summary: Perform arbitrary bitfield integer operations on strings
since: 3.2.0
含义:对字符串执行任意位于位域整数操作
BITCOUNT key [start end]
summary: Count set bits in a string
since: 2.6.0
含义:得到总数
举例:
127.0.0.1:6379> SETBIT mykeys 10 1
(integer) 0
127.0.0.1:6379> SETBIT mykeys 11 1
(integer) 0
127.0.0.1:6379> SETBIT mykeys 21 1
(integer) 0
127.0.0.1:6379> SETBIT mykeys 10 2
(integer) 0
127.0.0.1:6379> BITCOUNT mykeys
(integer) 4
BITOP operation destkey key [key ...]
summary: Perform bitwise operations between strings
since: 2.6.0
含义:在字符串之间执行位操作
公司记录某个人一个月的打卡情况
一年365天怎么记录一个人在某个网站的登录,活跃情况
两个状态的都能用这种方法进行性能压榨
都是操作二进制位来进行记录,就只有0 和 1 两个状态!
365 天 = 365 bit 1字节 = 8bit 46 个字节左右!
测试登录次数
127.0.0.1:6379> setbit login 0 1
(integer) 0
127.0.0.1:6379> setbit login 3 1
(integer) 0
127.0.0.1:6379> bitcount login 0 -1
(integer) 2
周一:1 周二:0 周三:0 周四:1 ......
查看某一天是否有打卡!
统计操作,统计 打卡的天数!
2、Geospatial 地理位置
127.0.0.1:6379> help @geo
GEOADD key longitude latitude member [longitude latitude member ...]
summary: Add one or more geospatial items in the geospatial index represented using a sorted set
since: 3.2.0
GEODIST key member1 member2 [unit]
summary: Returns the distance between two members of a geospatial index
since: 3.2.0
GEOHASH key member [member ...]
summary: Returns members of a geospatial index as standard geohash strings
since: 3.2.0
GEOPOS key member [member ...]
summary: Returns longitude and latitude of members of a geospatial index
since: 3.2.0
/**初学者知道就行//
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
summary: Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a point
since: 3.2.0
含义:查询标识地理空间索引的排序集,以获取与某一点的最大距离的成员
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
summary: Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a member
since: 3.2.0
朋友的定位,附近的人,打车距离计算?
在Redis3.2 版本推出了Geospatial ! 这个功能可以推算地理位置的信息,两地之间的距离。
可以查询一些测试数据:http://www.jsons.cn/lngcodeinfo/0706D99C19A781A3/
给定几个城市的经纬度:
太原:112.549248,37.857014
北京:116.405285,39.904989
成都:104.065735,30.659462
武汉:114.298572,30.584355
西安: 108.948024,34.263161
洛阳:112.434468,34.663041
getadd
# getadd 添加地理位置
# 规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
# 有效的经度从-180度到180度。
# 有效的纬度从-85.05112878度到85.05112878度。
# 当坐标位置超出上述指定范围时,该命令将会返回一个错误。
# 127.0.0.1:6379> geoadd china:city 39.90 116.40 beijing
(error) ERR invalid longitude,latitude pair 39.900000,116.400000
# 参数 key 值()
#插入城市的经纬度
127.0.0.1:6379> geoadd china:city 112.549284 37.857014 taiyuan
127.0.0.1:6379> geoadd china:city 116.405285 39.904989 beijing
127.0.0.1:6379> geoadd china:city 104.065735 30.659462 chengdu
127.0.0.1:6379> geoadd china:city 114.298572 30.584355 wuhan
127.0.0.1:6379> geoadd china:city 108.948024 34.263161 xian
127.0.0.1:6379> geoadd china:city 112.434468 34.663041 luoyang
# 获取指定的城市的经度和纬度!
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.40528291463851929"
2) "39.9049884229125027"
127.0.0.1:6379> geopos china:city beijing luoyang
1) 1) "116.40528291463851929"
2) "39.9049884229125027"
2) 1) "112.43446558713912964"
2) "34.6630405862934694"
#两人之间的距离!
#单位:
#m 表示单位为米。
#km 表示单位为千米。
#mi 表示单位为英里。
#ft 表示单位为英尺。
#georadius 以给定的经纬度为中心, 找出某一半径内的元素
#我附近的人? (获得所有附近的人的地址,定位!)通过半径来查询!
#获得指定数量的人,200
#所有数据应该都录入:china:city ,才会让结果更加请求!
#查询太原到北京的距离
127.0.0.1:6379> geodist china:city beijing taiyuan
"404109.2735"
127.0.0.1:6379> geodist china:city beijing taiyuan km
"404.1093"
#找某个地点(微信定位)方圆1000km内的城市,附近的朋友
127.0.0.1:6379> georadius china:city 110 32 500 km
1) "xian"
2) "luoyang"
3) "wuhan"
# 找出位于指定元素周围的其他元素!
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "taiyuan"
2) "beijing"
3) "xian"
4) "luoyang"
# 查看地图中全部的元素
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chengdu"
2) "xian"
3) "luoyang"
4) "wuhan"
5) "taiyuan"
6) "beijing"
# 移除指定元素!
127.0.0.1:6379> zrem china:city beijing
(integer) 1
3、 Hyperloglog(基数)
推荐一个博客:
关于这个算法的一个博客:https://www.jianshu.com/p/55defda6dcd2
场景如网页的 UV (一个人访问一个网站多次,但是还是算作一个人!)
通过使用一种特殊的算法,而达到使用一个固定空间达到统计基数的作用。
这种算法有误差,是一种概率学问题。0.81% 错误率! 但对于统计UV这类的任务,是可以忽略不计的!
测试使用
如果允许有误差,那么一定可以使用 Hyperloglog !
如果不允许误差,就使用 set 或者自己的数据类型即可!
127.0.0.1:6379> help @hyperloglog
PFADD key element [element ...]
summary: Adds the specified elements to the specified HyperLogLog.
since: 2.8.9
PFCOUNT key [key ...]
summary: Return the approximated cardinality of the set(s) observed by the HyperLogLog at key(s).
since: 2.8.9
PFMERGE destkey sourcekey [sourcekey ...]
summary: Merge N different HyperLogLogs into a single one.
since: 2.8.9
127.0.0.1:6379> pfadd pf a b c d e f g
(integer) 1
127.0.0.1:6379> pfadd pf2 c d e f g
(integer) 1
127.0.0.1:6379> pfcount pf pf2
(integer) 7
127.0.0.1:6379> pfmerge a pf pf2
OK
网友评论