10、Redis三种特殊的数据类型
一、Geospatail地理位置
1、Geospatail的应用
- 朋友的位置,附近的人,打车距离
2、相关命令
1、geoadd:增加某个地理位置的坐标(可批量添加)。
语法:
GEOADD key longitude latitude member [longitude latitude member ...]
127.0.0.1:6379> geoadd china:city 116.405285 39.904989 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.472644 31.231706 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 113.280637 23.125178 guangzhou
(integer) 1
127.0.0.1:6379> geoadd china:city 114.085947 22.547 shenzhen
(integer) 1
127.0.0.1:6379> geoadd china:city 120.153576 30.287459 hangzhou
(integer) 1
127.0.0.1:6379> geoadd china:city 108.948024 34.263161 xian
(integer) 1
127.0.0.1:6379>
2、geopos:获取某个地理位置的坐标(可批量获取)。
语法:
GEOPOS key member [member ...]
127.0.0.1:6379> geopos china:city shanghai
1) 1) "121.47264629602432251"
1) "31.23170490709807012"
127.0.0.1:6379> geopos china:city xian chongqing
1) 1) "108.94802302122116089"
2) "34.2631604414749944"
2) (nil)
127.0.0.1:6379> geopos china:city xian beijing #获取多个地点的经纬度
1) 1) "108.94802302122116089"
2) "34.2631604414749944"
2) 1) "116.40528291463851929"
2) "39.9049884229125027"
127.0.0.1:6379>
3、geodist:获取两个地理位置的距离。
语法:
GEODIST key member1 member2 [m|km|ft|mi
#m 表示单位为米。
#km 表示单位为千米。
#mi 表示单位为英里。
#ft 表示单位为英尺。
#如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。
127.0.0.1:6379> geodist china:city beijing shanghai #获取北京到上海的距离米
"1067597.9668"
127.0.0.1:6379> geodist china:city beijing xian #获取北京到西安的距离米
"911278.5437"
127.0.0.1:6379> geodist china:city beijing shanghai km #北京到上海的距离km
"1067.5980"
127.0.0.1:6379>
4、georadius:根据给定地理位置坐标获取指定范围内的地理位置集合。
语法:
GEORADIUS key longitude latitude radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]
longitude latitude标识了地理位置的坐标,radius表示范围距离,距离单位可以为m|km|ft|mi,还有一些可选参数:
WITHCOORD:传入WITHCOORD参数,则返回结果会带上匹配位置的经纬度。
WITHDIST:传入WITHDIST参数,则返回结果会带上匹配位置与给定地理位置的距离。
ASC|DESC:默认结果是未排序的,传入ASC为从近到远排序,传入DESC为从远到近排序。
WITHHASH:传入WITHHASH参数,则返回结果会带上匹配位置的hash值。
COUNT count:传入COUNT参数,可以返回指定数量的结果。
127.0.0.1:6379> georadius china:city 110 30 1000 km #以110,30这个经纬度为中心,寻找方圆1000km内的城市
1) "xian"
2) "shenzhen"
3) "guangzhou"
4) "hangzhou"
127.0.0.1:6379> georadius china:city 110 30 500 km #以110,30这个经纬度为中心,寻找方圆500km内的城市
1) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist #显示两个城市中间距离的距离
1) 1) "xian"
2) "484.4073"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord # 110 30 范围内城市的定位信息
1) 1) "xian"
2) 1) "108.94802302122116089"
2) "34.2631604414749944"
127.0.0.1:6379>
5、georadiusbymember:根据给定地理位置获取指定范围内的地理位置集合。
语法:
GEORADIUSBYMEMBER key member radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]可选参数同georadius
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km #找出以北京为中心,方圆1000km内的城市
1) "beijing"
2) "xian"
127.0.0.1:6379> georadiusbymember china:city shanghai 1000 km #找出以上海为中心,方圆1000km
1) "hangzhou"
2) "shanghai"
127.0.0.1:6379>
6、geohash:获取某个地理位置的geohash值。
语法:
GEOHASH key member [member ...]
#将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么则距离越近!
127.0.0.1:6379> geohash china:city beijing
1) "wx4g0b7xrt0"
127.0.0.1:6379> geohash china:city xian
1) "wqj6zjmt2u0"
127.0.0.1:6379> geohash china:city shanghai
1) "wtw3sjt9vg0"
127.0.0.1:6379>
3、GEO底层的实现原理其实就是Zset
1、zset操作Geospatail
127.0.0.1:6379> zrange china:city 0 -1 #获取所有的城市集合
1) "xian"
2) "shenzhen"
3) "guangzhou"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city hangzhou #移除指定的城市
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1 #查看移除后剩下的城市
1) "xian"
2) "shenzhen"
3) "guangzhou"
4) "shanghai"
5) "beijing"
127.0.0.1:6379>
二、HyperLogLog
1、基数
再开始在前了解什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
2、简介
- Redis 2.8.9版本就更新了Hyperloglog数据结构!
- Redis Hyperloglog基数统计的算法!
- 网页的UV(一个人访问一个网站多次,但是还是算作一个人!
- 传统的方式,set 保存用户的id,然后就可以统计set 中的元素数量作为标准判断!
- 传统的方式,set保存用户的id,然后就可以统计set 中的元素数量作为标准判断!
- 这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id ;
- 0.81%错误率!统计UV任务,可以忽略不计的!
3、相关命令
1、Pfadd 命令 - 添加指定元素到 HyperLogLog 中。
语法:
PFADD key element [element ...]
127.0.0.1:6379> pfadd mypf a b c d e f i j #像mypf添加一组数据
(integer) 1
127.0.0.1:6379> pfadd mypf1 i j z x c v n m #向mypf1添加一组数据
(integer) 1
127.0.0.1:6379>
2、Pfcount 命令返回给定 HyperLogLog 的基数估算值。
语法:
PFCOUNT key [key ...]
127.0.0.1:6379> pfcount mypf #返回mypf 的基数值
(integer) 8
127.0.0.1:6379> pfcount mypf2 #返回mypf2 的基数值
(integer) 8
127.0.0.1:6379> pfcount mypf mypf2 #返回mypf与mypf2 回基数估值之和
(integer) 13
127.0.0.1:6379>
3、Pgmerge 命令 - 将多个 HyperLogLog 合并为一个 HyperLogLog
语法:
PFMERGE destkey sourcekey [sourcekey ...]
127.0.0.1:6379> pfmerge mypf3 mypf mypf2 #合并两组mypf mypf2 =>mypf3并集
OK
127.0.0.1:6379> pfcount mypf3 #计算mypf3的基数值
(integer) 13
127.0.0.1:6379>
三、Bitmaps
1、简介
(1)Bitmaps本身不是一种数据类型, 实际上它就是字符串(key-value),但是它可以对字符串的位进行操作。
(2)Bitmaps单独提供了一套命令, 所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储0和1, 数组的下标在Bitmaps中叫做偏移量。
2、常用命令
1、setbit-设置Bitmaps中某个偏移量的值(0或1)
语法:
setbit key offset value
127.0.0.1:6379> setbit singn 0 0
(integer) 0
127.0.0.1:6379> setbit singn 2 1
(integer) 0
127.0.0.1:6379> setbit singn 3 0
(integer) 0
127.0.0.1:6379>
2、getbit-获取Bitmaps中某个偏移量的值
语法:
getbit key offset
127.0.0.1:6379> getbit singn 3
(integer) 0
127.0.0.1:6379> getbit singn 2
(integer) 1
127.0.0.1:6379>
3、bitcount-统计字符串从start字节到end字节比特值为1的数量
语法:
bitcount key start end
127.0.0.1:6379> setbit unique:users:2016-04-05 0 1
(integer) 0
127.0.0.1:6379> setbit unique:users:2016-04-05 5 1
(integer) 0
127.0.0.1:6379> setbit unique:users:2016-04-05 11 1
(integer) 0
127.0.0.1:6379> setbit unique:users:2016-04-05 15 1
(integer) 0
127.0.0.1:6379> setbit unique:users:2016-04-05 19 1
(integer) 0
127.0.0.1:6379> getbit unique:users:2016-04-05 8
(integer) 0
127.0.0.1:6379> getbit unique:users:2016-04-05 8
(integer) 0
127.0.0.1:6379> bitcount unique:users:2016-04-05
(integer) 5
127.0.0.1:6379> bitcount unique:users:2016-04-05 10 20
(integer) 0
127.0.0.1:6379> bitcount unique:users:2016-04-05 1 3
(integer) 3
127.0.0.1:6379>
10、Redis三种特殊的数据类型的更多相关文章
- cocos2dx中的三种基本的数据类型
cocos2dx中提供了三种基本的数据类型:CCString(字符串),CCArray(数组),CCDictionary(数据字典(哈希的功能)) 2.CCString的用法 class CCStr ...
- Jedis连接Redis三种模式
这里说的三种工作模式是指: 1.单机模式 2.分片模式 3.集群模式(since 3.0) 说明图详见以下: 使用单机模式连接: private String addr="192.168.1 ...
- python实现redis三种cas事务操作
cas全称是compare and set,是一种典型的事务操作. 简单的说,事务就是为了存取数据库中同一数据时不破坏操作的隔离性和原子性,从而保证数据的一致性. 一般数据库,比如MySql是如何保证 ...
- Redis三种集群模式介绍
三种集群模式 redis有三种集群模式,其中主从是最常见的模式. Sentinel 哨兵模式是为了弥补主从复制集群中主机宕机后,主备切换的复杂性而演变出来的.哨兵顾名思义,就是用来监控的,主要作用就是 ...
- Redis三种模式——主从复制,哨兵模式,集群
一.Redis主从复制作用 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复:实际上是一种服务的冗余. 负 ...
- linux配置redis三种启动方式
下载 wget http://download.redis.io/releases/redis-4.0.9.tar.gz 解压 tar -xzf redis-4.0.9.tar.gz -C /usr/ ...
- redis三种启动方式
Part I. 直接启动下载 官网下载:http://redis.io/download安装 tar zxvf redis-2.8.9.tar.gzcd redis-2.8.9#直接make 编译ma ...
- redis三种连接方式
安装 tar zxvf redis-2.8.9.tar.gz cd redis-2.8.9 #直接make 编译 make #可使用root用户执行`make install`,将可执行文件拷贝到/u ...
- 高并发下用pdo,文件排它锁,redis三种方法对比
<?php header('content-type:text/html;charset=utf-8'); // //无控制 // $DB_DSN = ' ...
随机推荐
- 【linux系统】命令学习(六)awk sed grep 与管道的使用
程序运行环境输入与输出 标准输入0 read a;echo $a 标准输出1 echo cesh 错误输出 ls notr 管道重定向 管道与管道之间可以重定向 管道与文件之间可以重定向 用于写入 将 ...
- 搜索系统核心技术概述【1.5w字长文】
前排提示:本文为综述性文章,梳理搜索相关技术,如寻求前沿应用可简读或略过 搜索引擎介绍 搜索引擎(Search Engine),狭义来讲是基于软件技术开发的互联网数据查询系统,用户通过搜索引擎查询所需 ...
- [bzoj1072]排列
考虑用状压dp枚举排列,即f[i][j]表示当前状态为i,余数为j的方案数,考虑在末尾新增一个字符来转移即可,注意最后答案要除以排列组合 1 #include<bits/stdc++.h> ...
- [bzoj3317]First Knight
建立方程后直接高斯消元,再把0的区间找出来计算,就可以过(因为实际上这样的复杂度是5次的,且常数小)(当然这样的复杂度看上去并不太好,考虑优化)可以发现最后一行的概率都可以用上一行来表示,那么代入上一 ...
- 基于Docker搭建Maven私服Nexus,Nexus详解
备注:首先在linux环境安装Java环境和Docker,私服需要的服务器性能和硬盘存储要高一点,内存不足可能到时启动失败,这里以4核8GLinux服务器做演示 一:基于Docker安装nexus3 ...
- 【状压dp】Hamiton路径
描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点 ...
- CMake 工程调用 Makefile 编译项目
本文主要介绍如何将一个依赖 Makefile 项目(MIDG)移植到 CMake 上. 首先介绍项目文件结构,文件主要由三个目录组成 3rdParty include src 其中,3rdParty ...
- R shiny 小工具Windows本地打包部署
目录 服务器部署简介 windows打包部署 1. 部署基本框架 2.安装shiny脚本需要的依赖包 3.创建运行shiny的程序 [报错解决]无法定位程序输入点EXTPTE_PTR于动态链接库 将小 ...
- Python基础之赋值与注释
目录 1. 花式赋值 1.1 链式赋值 1.2 交叉赋值 1.3 交叉赋值(解压缩) 2. 注释 2.1 单行注释 2.2 多行注释 1. 花式赋值 1.1 链式赋值 a = 10 b = 10 c ...
- 通用的js异步ajax文件上传函数
无需表单,直接加点击事件即可, caseimg为input表单,image为图片显示 function upimage() { $('#form-upload').remove(); $('body' ...