Redis三大特殊类型介绍:GEO,hyperloglog,bitmap,Redis事务

GEO(geospatial):该类型一般用于作为地理位置的存储,来实现附近的人,两地间的距离等。

下面介绍geo常用的六个命令,和geo底层其实是通过zset进行的一个实现进行一个简单的体现:

  • geoadd : 用于添加一个城市经纬度,这里添加要满足经纬度的要求,开发种一般通过下载所有的城市数据通过java程序进行批量导入,这里测试我就直接从一些在线查看的网站进行一个查询,手动添加了。注:两极不可以进行添加,所以纬度范围 -179.99~ +179.99,经度范围:-89.99~ +89.99
    在这里插入图片描述
127.0.0.1:6379> flushdb   # 为方便先将本地库清空
OK
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing  #通过geoadd命令添加beijing的纬度和经度,(第一个参数为纬度,第二个为经度)
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai 120.15 30.28 hangzhou 112.98 28.19 changsha  # 也可以一次添加多个
(integer) 3
  • geopos : 用于获取指定城市的纬度和经度
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918"
   2) "39.900000091670925"
  • geoDist:用来计算两个地方的直线长度,单位默认为m,可以设置
127.0.0.1:6379> geodist china:city beijing hangzhou  #数据都采用第一个通过geoadd增加进去的
"1122799.8036"
127.0.0.1:6379> geodist china:city beijing hangzhou km
"1122.7998"
  • georadius : 以某个纬度,经度为中心查询某半径内的所有满足条件的地方,前提是必须在同一个key中
127.0.0.1:6379> georadius china:city 116.40 35.00 1000 km  # 以116.40,35.00为中心,方圆1000km的城市都进行一个查询
1) "beijing"
2) "changsha"
3) "hangzhou"
4) "shanghai"
127.0.0.1:6379> georadius china:city 116.40 35.00 1000 km withcoord count 2 # 加上count代表只展示较近的两个,然后加上withcoord表示展示经纬度
1) 1) "beijing"
   2) 1) "116.39999896287918"
      2) "39.900000091670925"
2) 1) "shanghai"
   2) 1) "121.47000163793564"
      2) "31.229999039757836"
  • georadiusbymember:以geo中的某个城市为中心进行范围查找,功能和georadius类似,不过中心点换了。
127.0.0.1:6379> georadiusbymember china:city shanghai 1000 km #还可以加排序等很多,大家可以自己测试下
1) "changsha"
2) "hangzhou"
3) "shanghai"
  • geohash : 返回一个或多个位置的hash值(了解就好,一般不会使用)
127.0.0.1:6379> geohash china:city shanghai beijing
1) "wtw3sj5zbj0"
2) "wx4fbxxfke0"
  • geo底层由zset的一个简单体现(上面介绍的geo命令中是没有删除地理位置的表现)
127.0.0.1:6379> zrange china:city 0 -1  # 对所有城市进行一个查看
1) "changsha"
2) "hangzhou"
3) "shanghai"
4) "beijing"
127.0.0.1:6379> zrem china:city hangzhou  # 删除值为hangzhou的城市
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1  
1) "changsha"
2) "shanghai"
3) "beijing"

hyperloglog:一般用于基数统计,例如uv(一个网页被用户访问次数)

优点:占用内存少,2^64次方只需要12K
缺点:有一定的错误率,使用时需要允许有一定的容错性
常用命令:

  • pfadd:增加一个hyperloglog类型的key-value(集合)
  • pfcount:统计一个集合中不重复元素的个数
  • pfmerge:合并两个或多个集合
127.0.0.1:6379> flushdb  # 演示需要,清空当前库
OK
127.0.0.1:6379> pfadd hyper1 a s d f g h j k l a  # 创建一个hyperloglog类型,存入元素,
(integer) 1
127.0.0.1:6379> pfcount hyper1  # 统计不重复的元素有多少
(integer) 9
127.0.0.1:6379> pfadd hyper2 a s d f z x v
(integer) 1
127.0.0.1:6379> pfmerge hyper3 hyper1 hyper2 # 合并hyper1,hyper2 命名为hyper3
OK
127.0.0.1:6379> pfcount hyper3
(integer) 12

bitmaps :采用的是位存储,取值为0,1,一般用来记录两种状态,和用来统计。

  • 常用命令只有三个:
127.0.0.1:6379> flushdb   #演示先清空当前库
OK
127.0.0.1:6379> setbit bitmap 0 0  # 设置一个bitmaps类型,然后将0标时为0
(integer) 0
127.0.0.1:6379> setbit bitmap 1 1
(integer) 0
127.0.0.1:6379> setbit bitmap 2 1
(integer) 0
127.0.0.1:6379> setbit bitmap 3 0
(integer) 0
127.0.0.1:6379> getbit bitmap 3  #用来get某一个标志位的值
(integer) 0
127.0.0.1:6379> getbit bitmap  2
(integer) 1
127.0.0.1:6379> bitcount bitmap  #统计有多少个为1的
(integer) 2

Redis事务

  • Redis事务本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行,特性:一次性,顺序性,排他性
  • Redis单条命令是保证原子性的,但是事务不保证原子性
  • 常用的命令:
开启事务:multi
开启后可以输入命令入列
执行事务:exec
取消事务:discard
127.0.0.1:6379> flushdb  #演示清空当前库
OK
127.0.0.1:6379> multi  # 开启事务
OK
127.0.0.1:6379> set name xiec #输入命令入列
QUEUED
127.0.0.1:6379> set age 23
QUEUED
127.0.0.1:6379> set sex nan
QUEUED
127.0.0.1:6379> get name
QUEUED
127.0.0.1:6379> exec  # 执行事务,如果想放弃可以输discard
1) OK
2) OK
3) OK
4) "xiec"
127.0.0.1:6379> get name  # 简单测试
"xiec"

Redis事务异常

主要分为两种(可以联系java中的异常进行记忆):

  • 编译型异常:也就是开启事务后,在命令入列的时候就报错了,那样的化在事务中的所有命令都不会被执行
  • 运行时异常:也就是命令都正常入列了,但是通过exec命令执行的时候报错了,那种情况,其他命令正常执行,只有那个错误的命令会把错误抛出来。

watch

通过watch命令可以对一个key进行一个监控,如果在一个事务中,发现这个key的值和开始监控的不一样了,就不进行操作,也可以通过unwatch进行放弃监控操作。


后期接着更新,用心写好每一篇

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值