1、NoSQL数据库
概述:NoSQL(Not Only SQL 的缩写)泛指非关系型的数据库,主要针对的是键值、文档以及图形类型数据存储。NoSQL 数据库天生支持分布式,数据冗余和数据分片等特性,旨在提供可扩展的高可用高性能数据存储解决方案。
NoSQL 数据库代表:HBase 、Cassandra、MongoDB、Redis。
NoSQL的特点
- 不遵循sql标准
- 不支持事务
- 远超于sql的性能
NoSQL适用场景
- 对数据高并发的读写
- 对海量数据的读写
NoSQL不适用场景
- 需要事务的场景
- 基于sql的结构化查询存储,处理复杂的关系,需要即席查询
注意:用不着sql和用了sql也不行的场景,可以考虑使用NoSQL
2、Redis数据库概述
2.1、Redis数据库的特点
- 数据存储在内存,支持持久化,主要用作备份恢复。
- 不仅支持简单的key-value模式,还支持多种数据结构(string、list、set、zset和hash)。
- 一般作为缓存数据库,辅助持久化的数据库。
- 周期性地把更新的数据写入磁盘或者把修改操作追加到记录文件。
- 存储的数据支持push/pop、add/remove、取交集并集差集等操作;且这些都是原子性操作。
- 支持不同方式的排序。
- 实现了master-slave(主从)同步。
2.2、应用场景:
- 配合关系型数据库做高速缓存
- 缓存高频访问的数据,降低数据库的IO
- 缓存session,在分布式架构中做session共享
- 多样的数据结构存储持久化数据
2.3、Redis相关知识:
端口号:6379
默认有16个数据库(0,1,…,15),初始默认使用0号库。所有库密码一样。
切换到8号库
select 8
清空当前库
flushdb
通杀全部库
flushall
2.4、Redis中关于key的操作
查看当前库中key的数量
dbsize
查看当前库所有key
keys *
判断某个key是否存在
exists 键名 # 1表示存在,0表示不存在
查看某个key的类型
type 键名
删除指定key的数据
del 键名 # 1表示删除成功
非阻塞删除指定key的数据(仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。)
unlink key 键名
给指定key设置过期时间
expire 键名 10 # 10s后过期
查看还有多少秒过期
ttl 键名 # -1表示永不过期,-2表示已过期
3、Redis中的五大数据结构
3.1、String
概述
string类型是redis中最基本的数据类型,一个key对应一个string类型的value,value最大为512M。
string类型是二进制安全的,即redis的string可以存储任何数据,包括图片和序列化对象。
常用指令
添加键值对
set 键名 value值 [EX seconds|PX milliseconds|KEEPTTL] [NX|XX]
-
EX:key的超时秒数
-
PX:key的超时毫秒数,与EX互斥使用
-
NX:当数据库中key不存在时,可以将key-value添加数据库
-
XX:当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥
获取对应key的value
get 键名
将给定的value追加到原值的末尾
append 键名 value值
获取key的value的长度
strlen 键名
只有在key不存在时才进行添加键值对的操作
setnx 键名 value值
将 key 中储存的数字值加1,如果为空,设置为1(只能对数字值操作)
incr 键名
将 key 中储存的数字值减1,如果为空,设置为-1(只能对数字值操作)
decr 键名
将 key 中储存的数字值增或减去自定义数字
incrby 键名 自定义数字
decrby 键名 自定义数字
同时设置多个key-value
mset 键名1 值1 键名2 值2 ...
同时获取多个key的value值
mget 键名1 键名2 ...
当且仅当所有给定 key 都不存在,才进行同时设置多个key-value操作
msetnx 键名1 值1 键名2 值2 ...
获得值的范围,类似java中的substring
getrange 键名 起始位置 结束位置
用value值从起始位置覆盖写入key所存储的字符串值
setrange 键名 起始位置 value
设置键值的同时,设置过期时间,单位秒
setex key 过期时间 value
以新换旧,设置了新值同时获得旧值
getset key value
演示
root@iZbp1dm5fdkrqk5zoa0y07Z:~# redis-cli
127.0.0.1:6379> keys * # 查看当前库下的所有key
(error) ERR wrong number of arguments for 'keys' command
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
3) "k3"
127.0.0.1:6379> exists k1
(integer) 1
127.0.0.1:6379> exists k4
(integer) 0
127.0.0.1:6379> type k1
string
127.0.0.1:6379> type k4
none
127.0.0.1:6379> del k3
(integer) 1
127.0.0.1:6379> del k4
(integer) 0
127.0.0.1:6379> unlink k2
(integer) 1
127.0.0.1:6379> expire k1 15
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 12
127.0.0.1:6379> set k2 v1
OK
127.0.0.1:6379> ttl k2
(integer) -1
127.0.0.1:6379> ttl k1
(integer) -2
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> dbsize
(integer) 0
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> flushsb
(error) ERR unknown command `flushsb`, with args beginning with:
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> dbsize
(integer) 0
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> append key1 val
(integer) 9
127.0.0.1:6379> get key1
"value1val"
127.0.0.1:6379> strlen key1
(integer) 9
127.0.0.1:6379> setnx key2 value2
(integer) 1
127.0.0.1:6379> setnx key1 value1
(integer) 0
127.0.0.1:6379> set key3 1
OK
127.0.0.1:6379> incr key3
(integer) 2
127.0.0.1:6379> decr key3
(integer) 1
127.0.0.1:6379> incrby key3 5
(integer) 6
127.0.0.1:6379> decrby key3 2
(integer) 4
127.0.0.1:6379> mset key4 value4 key5 value5 key6 value6
OK
127.0.0.1:6379> mget key1 key2 key3 key4 key5 key6
1) "value1val"
2) "value2"
3) "4"
4) "value4"
5) "value5"
6) "value6"
127.0.0.1:6379> msetnx key7 value7 key8 value8
(integer) 1
127.0.0.1:6379> setnx key9 20 value9
(error) ERR wrong number of arguments for 'setnx' command
127.0.0.1:6379> setex key9 20 value9
OK
127.0.0.1:6379> ttl key9
(integer) 15
127.0.0.1:6379> getset key9 newvalue9
(nil)
127.0.0.1:6379> get key9
"newvalue9"
127.0.0.1:6379> getset key8 newvalue8
"value8"
127.0.0.1:6379> getrange key9 0 1
"ne"
127.0.0.1:6379> setrange key9 3 val9
(integer) 9
127.0.0.1:6379> get key9
"newval9e9"
注意:mset、mget和msetnx具有原子性。
数据结构
String类型的数据结构是SDS(简单动态字符串),是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。
如图中所示,内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。
3.2、List
概述
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
常用指令
从左边/右边插入一个或多个值
lpush/rpush k1 v1 k2 v1 ...
从左边/右边吐出一个值(值在键在,值光键亡)
lpop/rpop key
从key1列表右边吐出一个值,插到key2列表左边。
rpoplpush key1 key2
按照索引下标获得元素(从左到右)
lrange key start stop
0左边第一个,-1右边第一个,(0 到 -1表示获取所有)
lrange key 0 -1
按照索引下标获得元素(从左到右)
lindex key index值
获得列表长度
llen key
在value的后面插入newvalue
linsert <key> before <value> <newvalue>
从左边删除n个value(从左到右)
lrem key n value
将列表key下标为index的值替换成value
lset key index value
演示
127.0.0.1:6379> lpush key1 value1 value2
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> lpush key10 value10 value11 value12
(integer) 3
127.0.0.1:6379> rpush key10 value13 value14 value15 value16
(integer) 7
127.0.0.1:6379> lpop key10
"value12"
127.0.0.1:6379> lpop key10
"value11"
127.0.0.1:6379> rpop key10
"value16"
127.0.0.1:6379> rpop key10
"value15"
127.0.0.1:6379> rpoplpush key10 key11
"value14"
127.0.0.1:6379> lpop key11
"value14"
127.0.0.1:6379> rpop key11
(nil)
127.0.0.1:6379> lrange key10 0 -1
1) "value10"
2) "value13"
127.0.0.1:6379> lpop key value17 value18
(error) ERR wrong number of arguments for 'lpop' command
127.0.0.1:6379> lpush key10 value17 value18
(integer) 4
127.0.0.1:6379> lrange key10 0 -1
1) "value18"
2) "value17"
3) "value10"
4) "value13"
127.0.0.1:6379> lrange key10 0 2
1) "value18"
2) "value17"
3) "value10"
127.0.0.1:6379> lindex key10 3
"value13"
127.0.0.1:6379> lrange key10 0 0
1) "value18"
127.0.0.1:6379> lrange key10 1 1
1) "value17"
127.0.0.1:6379> llen key10
(integer) 4
127.0.0.1:6379> linsert key10 before value13 value19
(integer) 5
127.0.0.1:6379> lrange key10 0 -1
1) "value18"
2) "value17"
3) "value10"
4) "value19"
5) "value13"
127.0.0.1:6379> lrem key10 2
(error) ERR wrong number of arguments for 'lrem' command
127.0.0.1:6379> lrem key10 2 value
(integer) 0
127.0.0.1:6379> lrem key10 2 value18
(integer) 1
127.0.0.1:6379> lrange key10 0 -1
1) "value17"
2) "value10"
3) "value19"
4) "value13"
127.0.0.1:6379> lrem key10 4 value13
(integer) 1
127.0.0.1:6379> lrange key10 0 -1
1) "value17"
2) "value10"
3) "value19"
127.0.0.1:6379> lset key10 1 value18
OK
127.0.0.1:6379> lrange key10 0 -1
1) "value17"
2) "value18"
3) "value19"
127.0.0.1:6379>
数据结构
当列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist(压缩列表)。当数据量比较多的时候会改成quicklist(快速链表)。
因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。
Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。
3.3、Set
概述
Redis的Set是string类型的无序集合,里面的元素不重复且无序。底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。
常用指令
将一个或多个 value值加入到集合 key 中,已经存在的值将被忽略
sadd key value1 value2 ...
取出该集合的所有值
smembers key
判断集合key是否为含有该value值,有1,没有0
sismember key value
返回该集合的元素个数
scard key
删除集合中的某个元素
srem key value1 value2 ....
随机从该集合中吐出一个值
spop key
随机从该集合中取出n个值。不会从集合中删除
srandmember key n
把集合中一个值从一个集合移动到另一个集合
smove source destination value
返回两个集合的交集元素
sinter key1 key2
返回两个集合的并集元素
sunion key1 key2
返回两个集合的差集元素(key1中的,不包含key2中的)
sdiff key1 key2
演示
127.0.0.1:6379> sadd key11 value1 value2 value3 value1
(integer) 3
127.0.0.1:6379>
127.0.0.1:6379> smember key11
(error) ERR unknown command `smember`, with args beginning with: `key11`,
127.0.0.1:6379> smembers key11
1) "value3"
2) "value1"
3) "value2"
127.0.0.1:6379> sismember key11 value1
(integer) 1
127.0.0.1:6379> sismember key11 value5
(integer) 0
127.0.0.1:6379> scard key11
(integer) 3
127.0.0.1:6379> srem key11 value1 value2
(integer) 2
127.0.0.1:6379> scard key11
(integer) 1
127.0.0.1:6379> spop key11
"value3"
127.0.0.1:6379> add key11 value4 value5 value6
(error) ERR unknown command `add`, with args beginning with: `key11`, `value4`, `value5`, `value6`,
127.0.0.1:6379> sadd key11 value4 value5 value6
(integer) 3
127.0.0.1:6379> spop key11
"value6"
127.0.0.1:6379> scard key11
(integer) 2
127.0.0.1:6379> srandmember key11 1
1) "value4"
127.0.0.1:6379> scard key11
(integer) 2
127.0.0.1:6379> smove key11 key12 value5
(integer) 1
127.0.0.1:6379> scard key11
(integer) 1
127.0.0.1:6379> scard key12
(integer) 1
127.0.0.1:6379> sinter key11 key12
(empty list or set)
127.0.0.1:6379> sadd key11 value5
(integer) 1
127.0.0.1:6379> sinter key11 key12
1) "value5"
127.0.0.1:6379> sunion key11 key12
1) "value5"
2) "value4"
127.0.0.1:6379> sdiff key11 key12
1) "value4"
127.0.0.1:6379>
数据结构
Set数据结构是字典,字典是用哈希表实现的。
Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。
3.4、Hash
概述
是一个string类型的field和value的映射表,特别适合存储对象。
常用指令
给key集合中的field键赋值value
hset key field value
从key集合的field取出value
hget key field
批量设置hash的值
hmset key field1 value1 field2 value2 ...
查看哈希表 key 中,给定域 field 是否存在
hexists key field
列出该hash集合的所有field
hkeys key
列出该hash集合的所有value
hvals key
为哈希表 key 中的域 field 的值加上增量
hincrby key field increment
将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在
hsetnx key field value
演示
127.0.0.1:6379> hset user name zs
(integer) 1
127.0.0.1:6379> hset user age 18
(integer) 1
127.0.0.1:6379> hset user gender man
(integer) 1
127.0.0.1:6379> hget user age
"18"
127.0.0.1:6379> hget user age
"18"
127.0.0.1:6379> hmset user address china emile sh123@qq.com phone 1321221
OK
127.0.0.1:6379> hexists user name
(integer) 1
127.0.0.1:6379> hexists user parents
(integer) 0
127.0.0.1:6379> hkeys user
1) "name"
2) "age"
3) "gender"
4) "address"
5) "emile"
6) "phone"
127.0.0.1:6379> hvals user
1) "zs"
2) "18"
3) "man"
4) "china"
5) "sh123@qq.com"
6) "1321221"
127.0.0.1:6379> hincrby user name 2
(error) ERR hash value is not an integer
127.0.0.1:6379> hincrby user age 3
(integer) 21
127.0.0.1:6379> hsetnx user name zss
(integer) 0
127.0.0.1:6379> hsetnx user id 1
(integer) 1
127.0.0.1:6379>
数据结构
field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。
3.5、Zset
概述
Zset的每个成员都关联了一个评分(score),评分(score)被用来升序排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
因为元素是有序的, 所以可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
常用指令
将一个或多个 member 元素及其 score 值加入到Zset中。
zadd <key><score1><value1><score2><value2>…
返回下标在start和stop之间的元素,闭区间。WITHSCORES表示可以让分数一起和值返回到结果集。
zrange <key><start><stop> [WITHSCORES]
返回Zset 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增排列。
zrangebyscore key minmax [withscores] [limit offset count]
同上,改为从大到小排列。
zrevrangebyscore key maxmin [withscores] [limit offset count]
为元素的score加上增量。
zincrby <key><increment><value>
删除该集合下,指定值的元素 。
zrem <key><value>
统计该集合,分数区间内的元素个数 。
zcount <key><min><max>
返回该值在集合中的排名,从0开始。
zrank <key><value>
演示
127.0.0.1:6379> zadd student 150 chinese 130 math 120 english 90 biology
(integer) 4
127.0.0.1:6379> zrange student 0 0
1) "biology"
127.0.0.1:6379> zrange student 0 4
1) "biology"
2) "english"
3) "math"
4) "chinese"
127.0.0.1:6379> zrange student 0 11
1) "biology"
2) "english"
3) "math"
4) "chinese"
127.0.0.1:6379> zrange student 0 11 withscores
1) "biology"
2) "90"
3) "english"
4) "120"
5) "math"
6) "130"
7) "chinese"
8) "150"
127.0.0.1:6379> zrangebyscore student 120 150
1) "english"
2) "math"
3) "chinese"
127.0.0.1:6379> zrevrangebyscore student 120 90
1) "english"
2) "biology"
127.0.0.1:6379> zincrby student 10 biology
"100"
127.0.0.1:6379> zrem student biology
(integer) 1
127.0.0.1:6379> zcount student
(error) ERR wrong number of arguments for 'zcount' command
127.0.0.1:6379> zcount student 100 150
(integer) 3
127.0.0.1:6379> zrank student
(error) ERR wrong number of arguments for 'zrank' command
127.0.0.1:6379> zrank student chinese
(integer) 2
数据结构
zset底层使用了两个数据结构
(1)hash。hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。
(2)跳跃表。跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。
4、Redis的发布和订阅
4.1、概述
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
Redis 客户端可以订阅任意数量的频道。
客户端可以订阅频道
当给这个频道发布消息后,消息就会发送给订阅的客户端
4.2、演示
客户端订阅频道
发布者将消息发送给频道
客户端接收到消息
注意:发布的消息没有持久化,客户端只能收到订阅后发布的消息,订阅之前频道的消息看不了。
5、Redis新数据类型
5.1、Bitmaps
概述
可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储0和1, 数组的下标在Bitmaps中叫做偏移量。它可以对字符串的位进行操作。
命令
设置Bitmaps中某个偏移量的值(0或1)
setbit<key><offset><value>
offset表示偏移量,从0开始。
案例:以用户的id作为偏移量,将男性用户记做1,女性用户记做0。userid=1, 6, 11, 15, 19的用户是男性。
root@iZbp1dm5fdkrqk5zoa0y07Z:~# redis-cli
127.0.0.1:6379> setbit users 1 1
(integer) 0
127.0.0.1:6379> setbit users 6 1
(integer) 0
127.0.0.1:6379> setbit users 11 1
(integer) 0
127.0.0.1:6379> setbit users 15 1
(integer) 0
127.0.0.1:6379> setbit users 19 1
(integer) 0
注意1:很多应用的用户id以一个指定数字(例如10000) 开头, 直接将用户id和Bitmaps的偏移量对应势必会造成一定的浪费, 通常的做法是每次做setbit操作时将用户id减去这个指定数字。
注意2:在第一次初始化Bitmaps时, 假如偏移量非常大, 那么整个初始化过程执行会比较慢, 可能会造成Redis的阻塞。
获取Bitmaps中某个偏移量的值
getbit<key><offset>
统计字符串从start字节到end字节比特值为1的数量(闭区间),start和end值可以使用负数:比如 -1 表示最后一个字节,而 -2 表示倒数第二个字节。start、end 是指bit组的字节的下标数。
bitcount<key>[start end]
注意:redis的setbit设置或清除的是bit位置,而bitcount计算的是byte位置。
做多个Bitmaps的and(交集) 、 or(并集) 、 not(非) 、 xor(异或) 操作并将结果保存在destkey中。
bitop and(or/not/xor) <destkey> [key…]
演示:
root@iZbp1dm5fdkrqk5zoa0y07Z:~# redis-cli
127.0.0.1:6379> setbit users1 1 1
(integer) 0
127.0.0.1:6379> setbit users1 2 1
(integer) 0
127.0.0.1:6379> setbit users1 5 1
(integer) 0
127.0.0.1:6379> setbit users1 9 1
(integer) 0
127.0.0.1:6379> setbit users2 0 1
(integer) 0
127.0.0.1:6379> setbit users2 1 1
(integer) 0
127.0.0.1:6379> setbit users2 4 1
(integer) 0
127.0.0.1:6379> setbit users2 9 1
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> bitop and andusers users1 users2
(integer) 2
127.0.0.1:6379> bitop or orusers users1 users2
(integer) 2
5.2、HyperLogLog
概述
遇到与统计相关的功能需求,比如统计网站PV(PageView页面访问量),可以使用Redis的incr、incrby轻松实现。例如UV(UniqueVisitor,独立访客)、独立IP数、搜索记录数等需要去重和计数的问题,这种求集合中不重复元素个数的问题称为基数问题。
什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
解决基数问题有很多种方案:
(1)数据存储在MySQL表中,使用distinct count计算不重复个数
(2)使用Redis提供的hash、set、bitmaps等数据结构来处理
以上的方案结果精确,但随着数据不断增加,导致占用空间越来越大,对于非常大的数据集是不切实际的。
HyperLogLog能够降低一定的精度来平衡存储空间。Redis的HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
命令
添加指定元素到 HyperLogLog 中(成功返回1,失败返回0)
pfadd <key>< element> [element ...]
root@iZbp1dm5fdkrqk5zoa0y07Z:~# redis-cli
127.0.0.1:6379> pfadd softs redis mysql java redis
(integer) 1
127.0.0.1:6379> pfadd softs redis
(integer) 0
计算HLL的近似基数,可以计算多个HLL
pfcount<key> [key ...]
127.0.0.1:6379> pfcount softs
(integer) 3
127.0.0.1:6379> pfadd newsofts redis java spring
(integer) 1
127.0.0.1:6379> pfcount softs newsofts
(integer) 4
将一个或多个HLL合并后的结果存储在另一个HLL中
pfmerge<destkey><sourcekey> [sourcekey ...]
127.0.0.1:6379> pfmerge mergesofts softs newsofts
OK
127.0.0.1:6379> pfcount mergesofts
(integer) 4
5.3、Geospatial
概述
redis基于该类型,提供了经纬度设置,范围查询,距离查询,经纬度Hash等关于地理信息的常见操作。
命令
添加地理位置(经度,纬度,名称)
geoadd<key>< longitude><latitude><member> [longitude latitude member...]
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen 116.38 39.90 beijing
(integer) 3
注意:
1、有效的经度从 -180 度到 180 度。有效的纬度从 -85.05112878 度到 85.05112878 度。
2、两极无法直接添加。
3、当坐标位置超出指定范围时,该命令将会返回一个错误。
4、已经添加的数据,是无法再次往里面添加的。
获得指定地区的坐标值
geopos <key><member> [member...]
127.0.0.1:6379> geopos china:city shanghai chongqing
1) 1) "121.47000163793563843"
2) "31.22999903975783553"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
获取两个位置之间的直线距离
geodist<key><member1><member2> [m|km|ft|mi ]
- m 表示单位为米[默认值]。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺
127.0.0.1:6379> geodist china:city shanghai beijing
"1068153.5181"
以给定的经纬度为中心,找出某一半径内的元素
georadius<key>< longitude><latitude>radius m|km|ft|mi
127.0.0.1:6379> georadius china:city 110 30 10000 km
1) "chongqing"
2) "shenzhen"
3) "shanghai"
4) "beijing"