Redis 八大数据类型

Redis 八大数据类型

  • Redis 的五大基本数据类型
    • String(字符串)
      • 应用场景
    • 常用命令
    • List(列表)
      • 应用场景
      • 常用命令
    • Hash(字典)
      • 应用场景
      • 常用命令
    • Set(集合)
      • 应用场景
      • 常用命令
    • ZSet(有序集合)
      • 应用场景
      • 常用命令
      • 跳跃表
  • Redis 三种特殊数据类型
    • Geospatial 地理位置(GEO)
      • getadd
      • getpos
      • GEODIST
      • GEORADIUS
      • GEORADIUSBYMEMBER
      • GEOHASH
      • 其他
    • Hyperloglog 统计
      • 应用场景
    • Bitmap 位图
      • 应用场景

Redis 的五大基本数据类型

String(字符串)

应用场景

  1. incr key 自增命令实现 计数器(文章阅读量)
  2. JSON对象缓存等

常用命令

Redis 八大数据类型_第1张图片

List(列表)

相当于linkedList,链表不是数组

应用场景

  1. 消息排队,消息队列 (使用Lpush 和 Rpop 命令, 左边存,右边取)
  2. 栈( Lpush Lpop , 左边存, 左边取)

常用命令

Redis 八大数据类型_第2张图片

Hash(字典)

相当于HashMap,数组+链表

应用场景

适合存放经常变动的对象, 可以直接修改某个属性,而不需要跟string类型一样JSON先转化成实体类在修改

常用命令

Redis 八大数据类型_第3张图片

Set(集合)

相当于HashSet, 键值对是无序,唯一的

应用场景

  1. 共同好友,共同关注(两个set集合使用 sinter key1 key2取交集)
  2. 可能认识的人(使用sdiff key1 key2 取差集, key1 存在 key2 不存在的值)
  3. 点赞功能(新增 sadd key value, 取消 srem key value, 统计 scard key 等)
  4. 随机抽奖功能(spop key 随机删除元素或使用 srandmembet key 随机抽取元素)

常用命令

Redis 八大数据类型_第4张图片

ZSet(有序集合)

键值对唯一,还可以为每个value赋值一个值,用来代表排序权重.内部是跳跃表数据结构实现

应用场景

热点新闻(点击阅读自增ZINCRBY key 步长 value,排序获取前10条热点新闻ZREVRANGE key 0 9 withscores )

常用命令

Redis 八大数据类型_第5张图片

跳跃表

跳跃表是基于多指针有序链表实现,可以看成多个有序链表,在查找时从上层指针开始查找,找到对应的取经后再到下一层查找

Redis 八大数据类型_第6张图片

跳跃表优点

  1. 插入速度非常快,不需要进行旋转灯查找来维护平衡性
  2. 更容易实现
  3. 支持无锁操作

Redis 三种特殊数据类型

  1. Geospatial 地理位置(GEO)
  2. Hyperloglog 统计
  3. Bitmap 位图

Geospatial 地理位置(GEO)

官方文档: https://www.redis.net.cn/order/3685.html

getadd

添加地理位置

# 规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
# 有效的经度从-180度到180度。
# 有效的纬度从-85.05112878度到85.05112878度。
# 当坐标位置超出上述指定范围时,该命令将会返回一个错误。
# 127.0.0.1:6379> geoadd china:city 39.90 116.40 beijin
(error) ERR invalid longitude,latitude pair 39.900000,116.400000
# 参数 key 值()
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 chongqin 114.05 22.52 shengzhen
(integer) 2
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2

getpos

获得当前定位:一定是一个坐标值

127.0.0.1:6379> GEOPOS china:city beijing # 获取指定的城市的经度和纬度!
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
127.0.0.1:6379> GEOPOS china:city beijing chongqin
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"

GEODIST

两人之间的直线距离

单位:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。
127.0.0.1:6379> GEODIST china:city beijing shanghai km # 查看上海到北京的直线距离
"1067.3788"
127.0.0.1:6379> GEODIST china:city beijing chongqin km # 查看重庆到北京的直线距离
"1464.0708"

GEORADIUS

以给定的经纬度为中心,返回键包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素。
应用场景: 我附近的人,获取附近人地址定位, 通过半径查询

127.0.0.1:6379> GEORADIUS china:city 110 30 500 km # 以110,30 这个经纬度为中心,寻
找方圆500km内的城市
1) "chongqi"
2) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist # 显示到中间距离的位置
1) 1) "chongqi"
2) "341.9374"
2) 1) "xian"
2) "483.8340"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord # 显示他人的定位信息
1) 1) "chongqi"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) 1) "108.96000176668167114"
2) "34.25999964418929977"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 1 #
筛选出指定的结果!
1) 1) "chongqi"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"

GEORADIUSBYMEMBER

和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点
应用场景: 根据溺水人员地理位置获取附近的救援人员

# 找出位于指定元素周围的其他元素!
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"

GEOHASH

返回一个或多个位置元素的 Geohash 表示

127.0.0.1:6379> geohash china:city beijing chongqin
1) "wx4fbxxfke0"
2) "wm5xzrybty0"

其他

GEO 底层的实现原理其实就是 Zset!我们可以使用Zset命令来操作geo!

127.0.0.1:6379> ZRANGE china:city 0 -1 # 查看地图中全部的元素
1) "chongqi"
2) "xian"
3) "shengzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city beijing # 移除指定元素!
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chongqi"
2) "xian"
3) "shengzhen"
4) "hangzhou"
5) "shanghai"

Hyperloglog 统计

优点: 占用内存是固定的, 只需要 12KB 内存,从内存角度首页该类型
缺点: 0.81% 的错误率.
允许容错,使用Hyperloglog , 否则使用set

应用场景

网页的 UV (一个人访问一个网站多次,但是还是算作一个人!)

  • 传统的方式, set 保存用户的id,然后就可以统计 set 中的元素数量作为标准判断 !
  • 这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id;
127.0.0.1:6379> PFadd mykey a b c d e f g h i j # 创建第一组元素 mykey
(integer) 1
127.0.0.1:6379> PFCOUNT mykey # 统计 mykey 元素的基数数量
(integer) 10
127.0.0.1:6379> PFadd mykey2 i j z x c v b n m # 创建第二组元素 mykey2
(integer) 1
127.0.0.1:6379> PFCOUNT mykey2
(integer) 9
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2 # 合并两组 mykey mykey2 => mykey3 并集
OK
127.0.0.1:6379> PFCOUNT mykey3 # 看并集的数量!
(integer) 15

Bitmap 位图

数据结构 都是二进制位进行记录,只有0 和 1 两个状态

应用场景

统计用户信息活跃与不活跃, 登录与未登录,打卡, 365天打卡情况, 两个状态的都可以使用该类型

统计一周打卡情况
Redis 八大数据类型_第7张图片

127.0.0.1:6379> getbit sign 3 # 查看周四是否打卡
(integer) 1
127.0.0.1:6379> getbit sign 6 # 查看周天是否打卡
(integer) 0
127.0.0.1:6379> bitcount sign # 统计这周的打卡记录,就可以看到是否有全勤!
(integer) 3

你可能感兴趣的:(Redis,redis,数据结构)