geospatial 地址位置
应用场景:朋友定位、附近的人、打车距离计算
3,2版本就推出了,这个功能可以推算地理位置的距离,方圆几里的人
基础命令
- geoadd 名字 经度 纬度 添加地理信息
经度范围时180~-180 纬度为90~-90度,超出报错
#geoadd 名字 经度 纬度
#添加地理信息
#经度范围时180~-180 纬度为90~-90度,超出报错
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
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
(integer) 1
127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzhen
(integer) 1
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou
(integer) 1
- geoPos 地段名 字段城市 获得当前定位
127.0.0.1:6379> geoPos china:city beijing
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
- geoDist 字段名 [城市1] [城市2] [单位] 获取两个城市的直线距离 (默认m)
- 四个单位:m代表米 、km千米、mi英里 ft 英尺
127.0.0.1:6379> geoDist china:city beijing shanghai
"1067378.7564"
127.0.0.1:6379> geoDist china:city beijing shanghai km
"1067.3788"
127.0.0.1:6379> geoDist china:city beijing shanghai m
"1067378.7564"
- geoRadius 字段名 经度 纬度 半径 查询指定点半径内的所有元素
- 可以withDist 到中心距离 withCoord 经纬度 / 加count 指定结果条数
127.0.0.1:6379> geoRadius china:city 110 30 1000 km
1) "chongqing"
2) "shenzhen"
3) "hangzhou"
127.0.0.1:6379> geoRadius china:city 110 30 1000 km withDist
1) 1) "chongqing"
2) "341.9374"
2) 1) "shenzhen"
2) "924.6408"
3) 1) "hangzhou"
2) "977.5143"
127.0.0.1:6379> geoRadius china:city 110 30 1000 km withCoord
1) 1) "chongqing"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "shenzhen"
2) 1) "114.04999762773513794"
2) "22.5200000879503861"
3) 1) "hangzhou"
2) 1) "120.1600000262260437"
2) "30.2400003229490224"
- geoRadiusByMember 字段 城市 半径 单位 查询指定城市内的所有元素
- geoHash 字段 城市 去城市的hashCodert
- 另外,geo能个适用zset的所有命令,因为底层是zset
Hyperloglog
基数:不重复的数据
优点简介:占用的内存是固定,只要12KB内存,就可以保存2^64不同的元素的技术
应用场景:网页的UV,用户访问量,一个用户的多次方位算为一次访问
注意:会存在系统上的误差,如果允许误差,就使用这个;如果不允许,就使用set或者其他数据结构
基础命令
- pfAdd [字段] [元素] 添加
- pfCount [字段] 查看当前字段的元素个数
- pfMerge [载体字段] [目标字段1] [目标字段2] 将目标1、2字段合并到载体字段中
Bitmaps
位存储
可以用来统计 是或否 0 / 1、 用于减少存储空间的消耗
基础命令
- setBit [字段名] [脚标] [0/1] 添加Bit
- getBit [字段名] [脚标] 获取Bit 0/1
- bitCount [字段名] 查询有几个脚标为 1
127.0.0.1:6379> setbit sign 0 0
(integer) 0
127.0.0.1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> getBit sign 1
(integer) 1
127.0.0.1:6379> getBit sign 0
(integer) 0
事务
Redis单条命令是保证原子性的,但是事务不保证原子性
Redis事务本质:一组命令的集合!一个事物的所有命令都会被序列化,在事务执行过程中,会按照顺序执行!
一次性、 顺序性、 排他性 执行一系列的命令
Redis事务没有隔离界别的概念-没有隔离性
所有的命令在事务中,并没有被直接执行!只有发起执行命令的时候才会被执行!
Redis事务:
- 开启事务(multi)
- 命令入队(……)
- 执行事务(Exec)/取消事务(Discard)
正常执行事务
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379>
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
3) "v2"
4) OK
编译型异常
打错命令
Exec时,所有命令都不会生效/运行
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379>
运行时异常
Exec时,运行异常的那条命令失败,其他都正常生效
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 "v1"
QUEUED
127.0.0.1:6379> incr k1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
4) "v1"
监控-Watch(面试重点)
- 悲观锁:
- 很悲观,无论什么识货都加锁
- 乐观锁:
- 很乐观,认为什么时候都不会出问题,所以不会上锁!会在更新数据的时候去判断一下,在此期间是否有人修改过数据,
- (在JAVA中获取version)
- 更新的时候比较version
127.0.0.1:6379> watch money OK 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> DECRBY money 20 QUEUED 127.0.0.1:6379> incrBy money 20 QUEUED 127.0.0.1:6379> EXEC 1) (integer) 80 2) (integer) 100
在做修改的时候,watch会去比较是否有被修改过,如果被修改过,则修改失败。
- unWatch可以取消监控(取消锁)
- discard 和 exec 自动取消锁
jedis
我们要使用java来操作Redis
使用Jedis来操作Redis的中间件,如果java操作redis一定要熟悉这个Jedis