Redis的地理位置(GEO)+Hypterloglog+事务测试

GEOADD 命令 - 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中,这些数据将会存储到sorted set

  • 有效的经度从-180度到180度。
  • 有效的纬度从-85.05112878度到85.05112878度。

当坐标位置超出上述指定范围时,该命令将会返回一个错误。

基本语法是:

geoadd 键名 值  经度 纬度  键名 值  经度 纬度

GEODIST 命令 - 返回两个给定位置之间的距离

如果两个位置之间的其中一个不存在, 那么命令返回空值。

指定单位的参数 unit 必须是以下单位的其中一个:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。

如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。

基本语法是:

geodist 键名 值1  值2  [单位]

GEORADIUS 命令 - 以给定的经纬度为中心, 找出某一半径内的元素

在给定以下可选项时, 命令会返回额外的信息:

  • WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 
  • WITHCOORD: 将位置元素的经度和维度也一并返回。
  • WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。
  • ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
  • DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。

基本语法是:georadius 键名 经度 纬度 范围 [单位] [WITHDIST|WITHCOORD|WITHHASH|ASC|DESC]

127.0.0.1:6379> geoadd city 120.52 30.44 "shanghai" 120.20 30.26667 "hangzhou" 
106.45 29.56667 "chongqin" 118.1 24.45557 "xiamen" 113 28.21667 "changsha"
(integer) 5
127.0.0.1:6379> geodist city chongqin xiamen
"1285840.6066"

127.0.0.1:6379> georadius city 120 30 200 km
1) "hangzhou"
2) "shanghai"
127.0.0.1:6379> georadius city 120 30 2000 km withdist asc   #返回与坐标(120,30)相距两千米内的城市,同时将结果由近到远返回
1) 1) "hangzhou"
   2) "35.3541"
2) 1) "shanghai"
   2) "69.9486"
3) 1) "xiamen"
   2) "644.6423"
4) 1) "changsha"
   2) "708.4320"
5) 1) "chongqin"
   2) "1308.1681"

GEORADIUSBYMEMBER 命令 - 找出位于指定范围内的元素,中心点是由给定的位置元素决定

这个命令和 GEORADIUS命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像GEORADIUS  那样, 使用输入的经度和纬度来决定中心点

指定成员的位置被用作查询的中心。

基本语法:

georadiusbymember 键名 值 范围 [单位]

GEOHASH 命令 - 返回一个或多个位置元素的 Geohash 表示

基本语法:

geohash 键名 值1 值2

哈希值的前缀越相似,说明两个地点越近

GEOPOS 命令 - 从key里返回所有给定位置元素的位置(经度和纬度)

基本语法:

geopos 键名 值1 值2

返回值

GEOPOS 命令返回一个数组, 数组中的每个项都由两个元素组成: 第一个元素为给定位置元素的经度, 而第二个元素则为给定位置元素的纬度

127.0.0.1:6379> georadiusbymember city chongqin 1200 km
1) "chongqin"
2) "changsha"

127.0.0.1:6379> geohash city hangzhou shanghai
1) "wtmkpjyuph0"
2) "wtmtnmrvze0"

127.0.0.1:6379> geopos city chongqin changsha shanghai
1) 1) "106.4500012993812561"
   2) "29.56666939001875249"
2) 1) "112.99999862909317017"
   2) "28.2166692963913377"
3) 1) "120.52000075578689575"
   2) "30.43999996130551011"

=========================================================================

Hypterloglog

Pfadd 命令 - 添加指定元素到 HyperLogLog 中。

Pgmerge 命令 - 将多个 HyperLogLog 合并为一个 HyperLogLog

 Pfcount 命令 - 返回给定 HyperLogLog 的基数估算值。

基数统计:如果允许容错(允许统计有误差),那么是一定可以使用Hyperloglog进行基数统计;如果不允许容错,那么可以使用set或者自己的数据类型

127.0.0.1:6379> pfadd mykey1 abd g h
(integer) 1
127.0.0.1:6379> pfadd mykey2 j k l mm
(integer) 1

127.0.0.1:6379> pfmerge mykey3 mykey1 mykey2 
OK
127.0.0.1:6379> pfcount mykey3
(integer) 7

 

=========================================================================

Redis事务

Multi 命令 - 标记一个事务块的开始。

Exec 命令 - 执行所有事务块内的命令。

Discard 命令 - 半路取消事务,放弃执行事务块内的所有命令。

Watch 命令 - 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

Unwatch 命令 - 取消 WATCH 命令对所有 key 的监视。

#正常执行事务
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr user_id
QUEUED
127.0.0.1:6379> incr user_id
QUEUED
127.0.0.1:6379> incr user_id
QUEUED
127.0.0.1:6379> get user_id
QUEUED
127.0.0.1:6379> ping
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) "3"
5) PONG
#编译时出现错误,整个事务所有语句不执行
127.0.0.1:6379> watch lock lock_times
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set money 1000
QUEUED
127.0.0.1:6379> incr money 100
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> set m2 200
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
#运行时出现错误,除了有错语句其他语句正常执行
127.0.0.1:6379> set k1 "v1"
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr k1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> get k3
QUEUED
127.0.0.1:6379> exec
1) (error) ERR value is not an integer or out of range
2) OK
3) OK
4) "v3"



前者事务监视变量同时开启事务要修改变量,当另一个事务也修改此变量时,前者事务必定失败

Redis的地理位置(GEO)+Hypterloglog+事务测试_第1张图片

 上面事务执行失败了,要重新开启事务修改前需要先unwatch

Redis的地理位置(GEO)+Hypterloglog+事务测试_第2张图片

 注意:这里事务如果没有加watch,那么其他事务更改了变量值的时候,另一个事务会获得变量值被修改的最新版本,然后对最新版本修改

Redis的地理位置(GEO)+Hypterloglog+事务测试_第3张图片

 悲观锁:认为什么时候都会出问题,任何时候都要加锁

乐观锁:认为什么时候都不会出问题,所以不会上锁,但是更新的时候会判断一些,在此期间是否有人修改过这个数据

获取version 更新的时候(exec)比较version

我们在Redis可以通过watch实现乐观锁,如:

Redis的地理位置(GEO)+Hypterloglog+事务测试_第4张图片

 

 

你可能感兴趣的:(Redis,redis,java)