Redis是一款高效的key-value数据库,其支持存储各种数据类型,包括字符串、列表、哈希等。其中,存储地理经纬度数据的功能使它在实时地理位置相关应用程序方面变得越来越流行。本文将介绍Redis存储地理经纬度数据的简便方式。
一、Redis的地理位置数据类型
Redis提供了几种地理位置数据类型,我们常用的是Geohash。Geohash是一种表示经度和纬度坐标的编码方式,它将二维的坐标转换为一维的字符串,方便存储和处理。
二、地理位置数据存储
Redis的地理位置数据存储需要用到命令:GEOADD。该命令用于将给定的经纬度坐标添加到指定的key中。命令的格式如下:
“`GEOADD key longitude latitude member“`
其中,key为字符串类型,经度和纬度分别用double类型进行表示,member表示该位置的名称。
例如,我们有一家餐厅,经纬度分别为116.480881和39.989633,名称为“小吃街”。
我们可以使用以下命令将该位置信息存储到Redis中:
“`GEOADD restaurant 116.480881 39.989633 “小吃街”“`
其中,restaurant为Redis中存储位置信息的键值。如果在地理位置上拥有多个不同的餐厅,我们可以使用如下命令将它们全部添加到Redis中:
“`GEOADD restaurant 116.480881 39.989633 “小吃街” 116.497429 39.997454 “烤肉” 116.508301 39.920021 “海底捞”“`
需要注意的是,在使用GEOADD命令时,经纬度为double类型,member为字符串类型。
三、地理位置查询
在Redis中,我们可以使用GEOPOS命令来查询指定成员的经纬度坐标。命令的格式如下:

“`GEOPOS key member [member …]“`
其中,key为存储位置信息的键值,member表示待查询的位置名称,查询结果以经纬度的形式进行返回。
例如,我们希望查询“小吃街”餐厅的经纬度坐标,则可以使用以下命令:
“`GEOPOS restaurant “小吃街”“`
查询结果如下:
1) 1) "116.48088163137436"2) "39.989632646802446"
需要注意的是,在使用GEOPOS命令时,如果查询的member不存在,则会返回nil值。
四、地理位置周围查询
在实际应用中,我们需要根据用户的地理位置信息获取周围的餐厅或商店等信息。此时,Redis提供了GEOAROUND命令,可以查询指定地理位置附近的成员。
命令的格式如下:
“`GEOAROUND key longitude latitude radius m [WITHDIST] [WITHCOORD] [ASC|DESC] [COUNT count]“`
其中,key为存储位置信息的键值,longitude和latitude分别表示待查询位置的经度和纬度,radius表示查询半径(以米为单位),m表示距离的单位(m或km)。WITHDIST表示返回结果时同时返回成员与待查询位置间的距离;WITHCOORD表示返回结果时同时返回经纬度坐标;ASC或DESC表示结果的排序方式(升序或降序);COUNT表示查询结果的数量限制。
例如,我们希望查询距离“小吃街”餐厅1千米内有哪些商家,则可以使用以下命令:
“`GEOAROUND restaurant 116.480881 39.989633 1000 km“`
查询结果如下:
1) 1) "海底捞"2) 1) "116.50830179452896118"2) "39.92002093066737696"3) "26.8421"2) 1) "小吃街"2) 1) "116.48088163137435913"2) "39.98963264680244635"3) "0.0000"
需要注意的是,如果不加上以上提到的参数条件,GEOAROUND会返回所有符合条件的结果,这个数值是非常大的,所以必须加上以上提到的参数条件。
五、总结
通过GEOADD、GEOPOS和GEOAROUND等命令,Redis存储地理经纬度数据变得非常简单。这个特性极大地拓展了Redis的实时地理应用场景,尤其适合需要实时获取周围位置信息的应用场景。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
redis对象操作setTimeout(),在哪里可以查到用法?
redis对象操作setTimeout()的用法如下:setTimeout, expire设定一个key的活动时间(s)$redis->setTimeout(x, 3);有关redis的一系列set操作总结如下://SET 集合的相关操作// sadd 集合添加数据 初始化数据for($i=0; $i < 10 ; $i++){$redis->sadd(myset,$i+rand(10,99));}//srem 删除集合中的一个元素$bool = $redis->srem(myset,16);echo (int) $bool;//sMove 将value元素从名称为srckey的集合移到名称为dstkey的集合$bool = $redis->sMove(myset, myset1, 35);echo $bool;//smembers 显示集合中的元素$data = $redis->smembers(myset);// sIsMember, sContains 名称为key的集合中查找是否有value元素,有ture 没有 false$bool = $redis->sismember(myset,555);echo (int)$bool;//scard ssize集合key元素的个数echo $redis->scard(myset); //sInterStore//求交集并将交集保存到output的集合//$redis->sInterStore(output, key1, key2, key3)$redis->sinterstore(output,myset,myset1);$data = $redis->smembers(output);echo
;print_r($data);// sUnionStore求并集并将并集保存到output的集合//$redis->sUnionStore(output, key1, key2, key3);$redis->sunionstore(uoutput,myset,myset1);$data = $redis->smembers(uoutput);echo;print_r($data);//sort// 排序,分页等// 参数// by => some_pattern_*,// limit => array(0, 1),// get => some_other_pattern_* or an array of patterns,// sort => asc or desc,// alpha => TRUE,// store => external-key$data = $redis->sort(myset,array(sort=>desc));echo;print_r($data);//ZSET 有序集合的相关操作//zadd添加元素 zAdd(key, score, member):for($i=0; $i < 10 ; $i++){$redis->zadd(zset,$i+rand(10,99),$i+rand(100,999));}//zrangezRange(key, start, end,withscores) 返回指定范围的元素//zRevRange(key, start, end,withscores):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素: 是否输出socre的值,默认false,不输出//zRangeByScore, zRevRangeByScore//$redis->zRangeByScore(key, star, end, array(withscores, limit ));//返回名称为key的zset中score >= star且score <= end的所有元素$data = $redis->zrange(zset,0,3,withscores);//end -1 返回所有元素加withscoreswithscores做值 使用echo;print_r($data);//zDelete, zRem//zRem(key, member) :删除名称为key的zset中的元素member$redis->zrem(zset,456);//zCount//$redis->zCount(key, star, end);//返回名称为key的zset中score >= star且score <= end的所有元素的个数echo $redis->zcount(zset,10,50);//zRemRangeByScore, zDeleteRangeByScore$redis->zRemRangeByScore(key, star, end);//zremrangebyscore 删除 socre 大于star score 小于 end d的元素//删除名称为key的zset中score >= star且score <= end的所有元素,返回删除个数//zScore 返回名称为key的zset中元素val2的scoreecho $redis->zScore(zset, 503);//zRank, zRevRankzrank(set,value) 返回value 在集合中的位置 索引从0开始echo$redis->zrank(zset,723);//zIncrBy//$redis->zIncrBy(key, increment, member);//如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为increment//zUnion/zInter 就集合的合集和交集//HASH 哈希的相关操作//hset 初始化数据for( $i=0; $i < 10 ;$i++){$redis->hset(myhash,$i,rand(10,99)+$i);}//hget(myhash,key1) 返回哈希 myhash 中键为key1的对应的数值echo $redis->hget(myhash,0);//hLen 返回名称为h的hash中元素个数echo $redis->hlen(myhash);//hDel 删除名称为h的hash中键为key1的域echo $redis->hdel(myhash,0);// hKeys返回名称为key的hash中所有键$data = $redis->hkeys(myhash);//hVals返回名称为h的hash中所有键对应的value$data = $redis->hvals(myhash);//hGetAll 返回名称为h的hash中所有的键(field)及其对应的value$data = $redis->hgetall(myhash);echo;print_r($data);//hExists 判断某个hash的对应的键是否存在echo $redis->hexists(myhash,0);//hMset 向名称为key的hash中批量添加元素$redis->hmset(user:1,array(name1=>name1,name2=>Joe2));//hMGet 返回名称为h的hash中field1,field2对应的value$data = $redis->hmget(user:1, array(name, salary));echo;print_r($data);//Redis 相关操作//flushDB 清空当前数据库//flushAll 清空所有数据库//select 选择数据库//$redis->select(0);//move 把key1 移动到数据库2 $redis->move(key1,2);//rename, renameKey 给key从新命名//renameNx与remane类似,但是,如果重新命名的名字已经存在,不会替换成功//setTimeout, expire 设置key的生命时间$redis->settimeout(user:1,10);//expireat 指定一个key的生命时间为一个时间戳//expireAtkey存活到一个UNIX时间戳时间$redis->expireat(myhash,time()+ 10);//dbSize查看现在数据库有多少key $count = $redis->dbSize();//auth 密码认证$redis->auth(foobared);//bgrewriteaof使用aof来进行数据库持久化$redis->bgrewriteaof();//slaveof 通过执行 SLAVEOF host port 命令,可以将当前服务器转变为指定服务器的从属服务器(slave server)。$redis->slaveof(10.0.1.7, 6379);//save将数据同步保存到磁盘//bgsave 将数据异步保存到磁盘//lastSave返回上次成功将数据保存到磁盘的Unix时戳//info 返回redis的版本信息等详情echo;print_r($redis->info());// type 返回key的类型值 1-5 //string: Redis::REDIS_STRING 1//set: Redis::REDIS_SET 2//list: Redis::REDIS_LIST 3//zset: Redis::REDIS_ZSET 4//hash: Redis::REDIS_HASH 5//other: Redis::REDIS_NOT_FOUND 6echo $redis->type(myset); //2如何使用Spring-data-redis
spring-Data-Redis项目(简称SDR)是对Redis的Key-Value数据存储操作提供了更高层次的抽象,提供了一个对几种主要的redis的Java客户端(例如:jedis,jredis,jdbc-redis等)的抽象,使开发中可以几乎完全屏蔽具体使用客户端的影响,使业务代码保持较强的稳定性。
Redis和Memcache的区别分析
1、 Redis和Memcache都是将数据存放在内存中,都是内存数据库。 不过memcache还可用于缓存其他东西,例如图片、视频等等。 2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。 3、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘4、过期策略--memcache在set时就指定,例如set key1 0 0 8,即永不过期。 Redis可以通过例如expire 设定,例如expire name 105、分布式--设定memcache集群,利用magent做一主多从;redis可以做一主多从。 都可以一主一从6、存储数据安全--memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化)7、灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复8、Redis支持数据的备份,即master-slave模式的数据备份。
发表评论