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"
前者事务监视变量同时开启事务要修改变量,当另一个事务也修改此变量时,前者事务必定失败
上面事务执行失败了,要重新开启事务修改前需要先unwatch
注意:这里事务如果没有加watch,那么其他事务更改了变量值的时候,另一个事务会获得变量值被修改的最新版本,然后对最新版本修改
悲观锁:认为什么时候都会出问题,任何时候都要加锁
乐观锁:认为什么时候都不会出问题,所以不会上锁,但是更新的时候会判断一些,在此期间是否有人修改过这个数据
获取version 更新的时候(exec)比较version
我们在Redis可以通过watch实现乐观锁,如: