天天看点

Redis学习笔记 Day3 特殊数据类型(geospatial、Hyperloglog、Bitmaps)geospatial 地址位置HyperloglogBitmaps事务jedis

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

继续阅读