sorted set
当坐标位置超出上述指定范围时,该命令将会返回一个错误。
基本语法是:
geoadd 键名 值 经度 纬度 键名 值 经度 纬度
如果两个位置之间的其中一个不存在, 那么命令返回空值。
指定单位的参数 unit 必须是以下单位的其中一个:
如果用户没有显式地指定单位参数, 那么 GEODIST
默认使用米作为单位。
基本语法是:
geodist 键名 值1 值2 [单位]
在给定以下可选项时, 命令会返回额外的信息:
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"
这个命令和 GEORADIUS命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER
的中心点是由给定的位置元素决定的, 而不是像GEORADIUS 那样, 使用输入的经度和纬度来决定中心点
指定成员的位置被用作查询的中心。
基本语法:
georadiusbymember 键名 值 范围 [单位]
基本语法:
geohash 键名 值1 值2
哈希值的前缀越相似,说明两个地点越近
基本语法:
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"
=========================================================================
基数统计:如果允许容错(允许统计有误差),那么是一定可以使用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
=========================================================================
#正常执行事务
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"
前者事务监视变量同时开启事务要修改变量,当另一个事务也修改此变量时,前者事务必定失败
上面事务执行失败了,要重新开启事务修改前需要先unwatch
注意:这里事务如果没有加watch,那么其他事务更改了变量值的时候,另一个事务会获得变量值被修改的最新版本,然后对最新版本修改
悲观锁:认为什么时候都会出问题,任何时候都要加锁
乐观锁:认为什么时候都不会出问题,所以不会上锁,但是更新的时候会判断一些,在此期间是否有人修改过这个数据
获取version 更新的时候(exec)比较version
我们在Redis可以通过watch实现乐观锁,如: