Redis常见的数据类型

Redis--5种数据类型的基本操作

学习地址推荐

String(字符串类型)

  • String 是 Redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
  • String 类型是二进制安全的。Redis 的 String 可以包含任何数据。比如jpg图片或者序列化的对象
  • String 类型是 Redis 最基本的数据类型,String 类型的值最大能存储 512MB。

基本操作

  • 添加 / 修改数据:set key value
  • 获取数据:get key
  • 删除数据:del key
  • 添加 / 修改多个数据:mset key value key1 value1
  • 获取多个数据:mget key key1
  • 追加信息到原始数据后边(不存在时则添加):append key value

image-20220213191005407

增减操作

  • 设置数值增加指定范围的值
    • 默认每次加1:incr key
    • 每次新增value:incrby key value
  • 设置数据减少指定范围的值
    • 默认每次减1:decr key
    • 每次减少value:decrby key value

image-20220213191138289

image-20220213191219133

时效操作

  • 设置过期时间:setex key seconds value

image-20220213191420276

Hash

  • Redis hash 是一个键值(key=>value)对集合。
  • Redis hash 是一个 String 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

基本操作

  • 添加 / 修改数据:hset key field value
  • 获取数据
    • 获取一个:hget key field
    • 获取多个:hgetall key
  • 删除数据:hdel key field field1
  • 添加 / 修改多个数据:hmset key field value field1 value1
  • 获取多个数据:hmget key field field1
  • 获取表中字段数量:hlen key
  • 获取表中是否存在某个字段:hexists key field

image-20220213192243550

扩展操作

  • 获取hash表中所有的字段key:hkeys key
  • 获取hash表中所有的字段值:hvals key
  • 设置指定字段的数值增加指定范围的值:
    • hincrby key field increment
    • hincrbyfloat key field increment

image-20220213192855034

List(列表)

  • 数据存储需求:存储多个数据,并对数据进行存储空间的顺序进行区分

  • 需要的数据结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序

  • list类型:保存多个数据,底层使用双向链表存储结构实现

  • 列表(list)用于存储多个有序的字符串。列表是一种比较灵活的数据结构,可以充当栈和队列的角色,在实际开发上有很多应用场景

    列表的特点:

    1. 列表中的元素是有序的,可以通过索引下标来获取某个元素或者某个范围内的元素列表
    2. 列表中的元素是可以重复的

基本操作

  • 添加 / 修改数据
    • 左边添加: lpush key value value1
    • 右边添加:rpush key value value1
  • 获取数据
    • lrange key start end
    • lindex key index
    • llen key
  • 删除数据
    • rpop key
    • lpop key

扩展操作

  • 在规定时间内获取并移除数据
    • blpop key1 key2 timeout
    • brpop key1 key2 timeout

image-20220213194526524

Set(集合)

  • 新的存储需求:存储大量的数据,在查询方便提供更高的效率
  • 需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
  • Set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的

基本操作

  • 添加 / 修改数据:sadd key member member1
  • 获取数据:smembers key
  • 删除数据:srem key member1
  • 获取集合数据总量:scard key
  • 判断集合中是否包含指定数据:sismember key member

image-20220213194901017

扩展操作(随机取数,交、并、差集)

  • 随机获取集合中指定数量的数据:srandmember key count
  • 随机获取集合中某个数据并将改数据集移除集合:spop key

image-20220213195210613

两个集合的交、并、差集

  • sinter key key1
  • sunion key key1
  • sdiff key key1

两个集合的交、并、差集并存储到指定集合中

  • sinterstore destination key1 key2
  • sunionstore destination key1 key2
  • sdiffstore destination key1 key2

ZSet(Sorted Set 有序集合)

在之前的四个类型中都不支持排序的,下来咱们看的sorted_set类型是既支持存储大数据,也支持排序功能。

基本操作

  • 添加数据:zadd key score member
  • 获取数据
    • zrange key start stop
    • zrevrange key start stop
  • 删除数据:zrem key member
> zadd zset1 10 setVal1
(integer) 1
> zadd zset1 9 setVal2
(integer) 1
> zadd zset1 10 setVal3
(integer) 1

> zrange zset1 0 -1
1) "setVal2"
2) "setVal1"
3) "setVal3"
> zrange zset1 0 -1 withscores
1) "setVal2"
2) 9.0
3) "setVal1"
4) 10.0
5) "setVal3"
6) 10.0
> zrevrange zset1 0 -1 withscores
1) "setVal3"
2) 10.0
3) "setVal1"
4) 10.0
5) "setVal2"
6) 9.0

> zrem zset1 setVal1
1

扩展操作

  • 按条件获取数据:
    • zrangebyscore key min max
    • zrevrangescore key max min
  • 条件删除数据:
    • zremrangebyrank key start stop
    • zremrangebyscore key min max
  • 获取集合数据总量:
    • zcard key
    • zcount key min max
> zrangebyscore test 2 3
1) "val2"
2) "val3"
> zrevrangebyscore test 3 2
1) "val3"
2) "val2"

> zremrangebyrank test 0 1
(integer) 2
> zremrangebyscore test 0 1
0

> zcard test
3
> zcount test 1 3
3
  • 集合交、并操作:

    • zinterstore destination numkeys key

    • zunionstore destination numkeys key

      (这个指令就不做演示了,可以自己查看文档。跟set有点类似,只不过会把所有交集的和给加起来。然后这里边有个numkeys这个参数是一共几个key进行计算 后边的key就需要几个)

  • 获取数据对应的索引:

    • zrank key member
    • zrevrank key member
  • socre值获取与修改:

    • zscore key member
    • zincrby key increment member

Redis其他的数据类型

bitmap 位图

Redis 中的 bitmap 位图是一串连续的二进制数字,底层实际是基于 string 进行封装存储的,按 bit 位进行指令操作的。bitmap 中每一 bit 位所在的位置就是 offset 偏移,可以用 setbit、bitfield 对 bitmap 中每个 bit 进行置 0 或置 1 操作,也可以用 bitcount 来统计 bitmap 中的被置 1 的 bit 数,还可以用 bitop 来对多个 bitmap 进行求与、或、异或等操作。

bitmap 位图的特点是按位设置、求与、求或等操作很高效,而且存储成本非常低,用来存对象标签属性的话,一个 bit 即可存一个标签。可以用 bitmap,存用户最近 N 天的登录情况,每天用 1 bit,登录则置 1。个性推荐在社交应用中非常重要,可以对新闻、feed 设置一系列标签,如军事、娱乐、视频、图片、文字等,用 bitmap 来存储这些标签,在对应标签 bit 位上置 1。对用户,也可以采用类似方式,记录用户的多种属性,并可以很方便的根据标签来进行多维度统计。bitmap 位图的重要指令包括:setbit、 getbit、bitcount、bitfield、 bitop、bitpos 等。

在移动社交时代,LBS 应用越来越多,比如微信、陌陌中附近的人,美团、大众点评中附近的美食、电影院,滴滴、优步中附近的专车等。要实现这些功能,就得使用地理位置信息进行搜索。地球的地理位置是使用二维的经纬度进行表示的,我们只要确定一个点的经纬度,就可以确认它在地球的位置。

Redis 在 3.2 版本之后增加了对 GEO 地理位置的处理功能。Redis 的 GEO 地理位置本质上是基于 sorted set 封装实现的。在存储分类 key 下的地理位置信息时,需要对该分类 key 构建一个 sorted set 作为内部存储结构,用于存储一系列位置点。

在存储某个位置点时,首先利用 Geohash 算法,将该位置二维的经纬度,映射编码成一维的 52 位整数值,将位置名称、经纬度编码 score 作为键值对,存储到分类 key 对应的 sorted set 中。

需要计算某个位置点 A 附近的人时,首先以指定位置 A 为中心点,以距离作为半径,算出 GEO 哈希 8 个方位的范围, 然后依次轮询方位范围内的所有位置点,只要这些位置点到中心位置 A 的距离在要求距离范围内,就是目标位置点。轮询完所有范围内的位置点后,重新排序即得到位置点 A 附近的所有目标。

  • 使用 geoadd,将位置名称(如人、车辆、店名)与对应的地理位置信息添加到指定的位置分类 key 中;
  • 使用 geopos 方便地查询某个名称所在的位置信息;
  • 使用 georadius 获取指定位置附近,不超过指定距离的所有元素;
  • 使用 geodist 来获取指定的两个位置之间的距离。

这样,是不是就可以实现,找到附近的餐厅,算出当前位置到对应餐厅的距离,这样的功能了?

Redis GEO 地理位置,利用 Geohash 将大量的二维经纬度转一维的整数值,这样可以方便的对地理位置进行查询、距离测量、范围搜索。但由于地理位置点非常多,一个地理分类 key 下可能会有大量元素,在 GEO 设计时,需要提前进行规划,避免单 key 过度膨胀。

Redis 的 GEO 地理位置数据结构,应用场景很多,比如查询某个地方的具体位置,查当前位置到目的地的距离,查附近的人、餐厅、电影院等。GEO 地理位置数据结构中,重要指令包括 geoadd、geopos、geodist、georadius、georadiusbymember 等。

hyperLogLog 基数统计

Redis 的 hyperLogLog 是用来做基数统计的数据类型,当输入巨大数量的元素做统计时,只需要很小的内存即可完成。HyperLogLog 不保存元数据,只记录待统计元素的估算数量,这个估算数量是一个带有 0.81% 标准差的近似值,在大多数业务场景,对海量数据,不足 1% 的误差是可以接受的。

Redis 的 HyperLogLog 在统计时,如果计数数量不大,采用稀疏矩阵存储,随着计数的增加,稀疏矩阵占用的空间也会逐渐增加,当超过阀值后,则改为稠密矩阵,稠密矩阵占用的空间是固定的,约为12KB字节。

通过 hyperLoglog 数据类型,你可以利用 pfadd 向基数统计中增加新的元素,可以用 pfcount 获得 hyperLogLog 结构中存储的近似基数数量,还可以用 hypermerge 将多个 hyperLogLog 合并为一个 hyperLogLog 结构,从而可以方便的获取合并后的基数数量。

hyperLogLog 的特点是统计过程不记录独立元素,占用内存非常少,非常适合统计海量数据。在大中型系统中,统计每日、每月的 UV 即独立访客数,或者统计海量用户搜索的独立词条数,都可以用 hyperLogLog 数据类型来进行处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值