【Redis】数据类型及应用场景

文章目录

  • 常用数据类型
  • 1.字符串String
    • 1.1特点
    • 1.2使用场景
      • 1.2.1分布式锁
      • 1.2.2点赞功能
  • 2.列表List
    • 2.1特点
    • 2.2使用场景
      • 2.2.1订阅消息
  • 3.哈希Hash
    • 3.1特点
    • 3.2使用场景
      • 3.2.1购物车
  • 4. 集合Set
    • 4.1特点
    • 4.2使用场景
      • 4.2.1共同朋友、可能认识的人、猜你喜欢
  • 5.有序集合ZSet (Sorted Set)
    • 5.1特点
    • 5.2使用场景
      • 5.2.1排行榜
      • 5.2.2热销商品
  • 6.地理空间GEO(经纬度)
    • 6.1特点
    • 6.2使用场景
      • 6.2.1附近的地点
  • 7.位域bitfield(一线较少使用,简单了解即可)
    • 7.1特点
    • 7.2使用场景
  • 8.位图bitmap(二进制位的bit数组)
    • 8.1特点
    • 8.2使用场景
      • 8.2.1签到统计
  • 9.基数统计HyperLogLog
    • 9.1特点
    • 9.2使用场景
      • 9.2.1统计网站UV
  • 10.流Stream (Redis版本的MQ消息中间件)
    • 10.1特点
    • 10.2使用场景

Redis:基于KV键值对的内存数据库。redis指令不区分大小写,但key区分大小写。

常用数据类型

  1. 字符串String
  2. 列表List
  3. 哈希表Hash
  4. 集合Set
  5. 有序集合ZSet
  6. 地理空间GEO(经纬度)
  7. 位域bitfield
  8. 位图bitmap(二进制位的bit数组)
  9. 基数统计HyperLogLog
  10. 流Stream

1.字符串String

1.1特点

  • 二进制安全,支持序列化,可以包含任何对象。
  • 当设定过期时间哦,再次set值,会覆盖ttl过期时间。可以使用参数keepttl,续接、继承之前key的ttl过期时间。
  • 批处理操作:mset、mget
  • setex(set with expire)/ setnx(set if not exist)(原子操作,设置时间)

1.2使用场景

  • 缓存
  • 分布式锁
  • 点赞功能

1.2.1分布式锁

  • sync/lock/unlock 操作仅为本地锁,针对本地虚拟机。
  • 每当一个服务需要获取资源,便在redis执行setnx lock uuid(尝试获取锁,如果不存在,则执行成功)操作和del lock(释放锁)

1.2.2点赞功能

   INCR KEY/DECR KEY 数字递增递减 ,可以控制增量减量。


2.列表List

2.1特点

  • 单key对应多value
  • 底层为双向链表,对两端操作性能高,通过索引下标操作中间节点性能较差
  • push/pop(入栈/出栈),LRange遍历操作

2.2使用场景

  • 订阅消息

2.2.1订阅消息

  用户订阅的文章消息,将对应的文章id放入用户的likeList,有新的文章就进行push操作,用户可以LRange分页查询订阅的消息。


3.哈希Hash

3.1特点

  • 类似于Java中的哈希表
  • 指令H开头

3.2使用场景

  • 小体量的购物车

3.2.1购物车

  实现简单购物车功能,key对应用户id,field-value对应商品id和数量,可以通过HINCRBY数量自增,HGETALL 获取所有信息,HMGET/HMSET批处理操作数据。


4. 集合Set

4.1特点

  • 类似于Java中HashSet
  • 集合之间的运算效果好(交集、并集、差集)
  • 指令S开头

4.2使用场景

  • 社交属性的需求

4.2.1共同朋友、可能认识的人、猜你喜欢

  用于带有社交属性的应用场景,如共同朋友、可能认识的人。例如发现两个用户的好友集合的共同好友,使用SINTER操作取得两人好友id集合的交集,可以认为三个用户可能互相认识,即可能认识的人。


5.有序集合ZSet (Sorted Set)

5.1特点

  • 拥有score字段,可以用于排序
  • key唯一,但带有的score可以重复
  • 排名默认为升序,可以使用Z后添加REV获得降序,例如ZREVRANK
  • 指令Z开头

5.2使用场景

  • 排行榜、销量排序的实现

5.2.1排行榜

  通过对score的操作,可以轻松实现排行榜的需求。使用ZRANGE 获取指定排名之间的元素。使用ZRANK获取单个value的排名,

5.2.2热销商品

  销量、销售金额等等指标可以作为score,例如将score定义为商品销售数量,key为goods:sellsort。

  1. 商品编号为1001的商品销量为9,商品编号1002销量为15,指令为zadd goods:sellsort 9 1001 15 1002
  2. 客户购买2件商品1001,1001销量增加2,zincrby goods:sellsort 2 1001
  3. 展示销量前十商品,zrange goods:sellsort 0 9 withscores

6.地理空间GEO(经纬度)

6.1特点

  • type类型:Zset的子类(由score变为经纬度)
  • 如果遇到乱码,可能是客户端的问题,使用命令redis- cli --raw
  • geohash算法生成的base32编码值,相当于三维变二维(经纬度)再变一维(geoHash指令后得到hash编码),相当于映射作用
  • GeoDist获取两个坐标的距离,例如GeoDist 天安门 故宫 km(km、m、英里 可以选择距离单位)
  • GeoPadius以半径为中心,查找附近的xx

6.2使用场景

  • 查找附近的地点

6.2.1附近的地点

  使用GeoRadius city 123.123 456.567(经纬度) 10km withdist withcoord withhash count 10 desc
返回10条附近10km的地点和地点的hash编码(内部编码计算)和经纬度
【Redis】数据类型及应用场景_第1张图片


7.位域bitfield(一线较少使用,简单了解即可)

7.1特点

  • 可以看做有二进制位组成的数组,并对这个数组任意位偏移访问
  • hello等价于每个字母的ascll码,再转换为二进制,即hello等价于0110100001100101011011000110110001101111

7.2使用场景

  • 位域修改
  • 溢出控制

8.位图bitmap(二进制位的bit数组)

8.1特点

  • 由0和1状态表现的二进制位的bit数组(只允许 0和1)
  • bitmap的偏移量是从0开始算的
  • 底层String类型的子类
  • 超过八位后,按照八位一组一字节再扩容

8.2使用场景

  • 用户是否登录Y或N ,比如京东每日签到送京豆
  • 电影、广告是否被点击播放
  • 钉钉打卡上下班,签到统计

8.2.1签到统计

  每一位表示天数,如果签到成功则该位为1,否则为零,使用setbit和getbit操作,可以使用strlen查询字节长度(byte),bitcount统计全部键包含1的数量(几个1,签到成功次数统计) ,这样处理好处是占用存储小,365位仅需要46字节。(1024=1kb)

9.基数统计HyperLogLog

9.1特点

  • 去重复统计功能的基数估计算法,就是HyperLogLog
  • 基数:是一种数据集,去重复后的真实个数。
  • 优点是在输入元素的数量和体积非常非常大时,计算基数所需的空间是固定的,并且很小。
  • 每个HyerLogLog键只需要花费12KB内存,可以计算接近264个不同数据的基数
  • 只是根据输入的元素计算基数,而不会存储输入元素本身,所有HyperLogLog不能像集合,返回输入的各个元素,而是返回基数统计值
  • 属于String类型

命令:

  • PFADD,添加元素到HyperLogLog
  • PFCOUNT,返回基数估算值(0.81%的误差)
  • PFMERGE,将多个HyperLogLog合并为一个

9.2使用场景

  • 统计某个网站的UV、某个文章的UV(Unique Visitor)独立访客,一般理解为客户端Ip,需要去重考虑
  • 统计用户搜索情况

9.2.1统计网站UV

  


10.流Stream (Redis版本的MQ消息中间件)

10.1特点

  • 为解决redis5.0之前实现消息队列(LPush、RPop),List实现方式点对点模式或pub、sub实现广播,一对多,但缺点是消息无法持久化,也没有ack机制保证数据可靠性。
  • 故5.0之后新增数据结构stream(但是大部分厂商仍使用专门mq产品,kafka、rabbitmq、rocketmq)
  • 实现消息队列,支持消息持久化,支持生成全局唯一id、支持ack确认消息的模式、支持消费组模式等

10.2使用场景

  • 生产案例少,慎用

你可能感兴趣的:(Java,Redis,redis,java,缓存)