redis(10):redis五种数据结构应用场景

本是古典 何须时尚 2022-10-29 03:23 276阅读 0赞

看完了redis的数据结构 ,在学习下各个数据结构的试用场景;


一、string

字符串有以下几个典型应用场景:

  1. 缓存功能 最常用的功能,将热数据的查询结果缓存到redis;
  2. 计数 也是减少数据库压力的方法之一,比如文章的点击量,统计网站访问次;
  3. 共享session 这个在分布式或者负载均衡的web服务中非常常用,用户被负载均衡到不同服务器上的时候并不希望session丢失而重新登录;
  4. 可以用redis做一个session管理的服务;
    同时还可以规定用户需要重新登录的时间间隔;
  5. 限速 比如短信接口,我们不希望用户能无限访问,可以用string可以设置过期时间的特性;类似其他ip访问限制也同理
  6. 自增ID的分配 其他关系型数据库分库分表时候,主键ID可以从redis分配
  7. 其他 String类型是二进制安全的,可以用来缓存一些静态文件,如图片、视频、css文件等;

二、hash

Hash的典型使用场景:

  1. 缓存用户数据,可以将数据库中的用户数据的每一列在哈希结构里表示出来,更新较为灵活;

三、list

lpush + rpop可以形成了一个队列,lpush+brpop可以作为消息队列;

  1. 消息队列
  2. 新消息排行榜
  3. 关注列表
  4. 粉丝列表
  5. 论坛中所有回帖的ID

四、set

集合的特性也比较丰富:

  • 集合中不会存在重复元素;
  • 集合元素是无序的;
  • 集合内可以增删改查;
  • 可以取多个集合的交并差集;
    主要应用场景:
  1. 集合的能实现的最贴合的功能可能就是标签了,比如每个用户有不用的兴趣标签,每个标签有不用的用户;
  2. 使用sinter就可以计算出两个用户兴趣的交集,这在社交软件中非常常用;
  3. spop可以从集合中随机弹出元素,srandmember可以随机取出一个元素,但是不删除这个元素,这两个命令都可以实现不用需求的抽奖系统
    部分应用中有靓号系统,也可以通过集合实现,可以srandmember多个靓号以供选择,spop删除那个被选中的靓号,sismember确定系统随机生成的数是不是靓号,以免被下发;
  4. 可以快速查找元素是否存在,用于记录一些不能重复的数据。例如: 在网站注册账号时,用户名不能重复,使用Set记录注册用户,如果注册的用户名已经存在于Set中,就拒绝该用户注册。或者用于记录做过某些事情。例如: 在某些投票系统中,每个用户一天只能投票一次,就可以用Set来记录某个用户的投票情况;

五、zset

Zset区别于Set最大的特点是可以给每个元素设置分数,作为排序的依据;

这里就有必要整理一下列表、集合、和有序集合的异同点了:


































数据结构 是否可重复 是否有序 有序实现方式 应用场景
list 索引下标 时间轴,消息队列等
set 标签 社交等
zset 分值 排行榜 社交
  1. zset: 可以通过其score 做排行榜或者带权重的消息队列
  2. 各种排行榜系统
  3. zrank\zrevrank等可以查看排名前几位或者后几位的条目

六、总结

在使用基本数据结构时,有两个点需要注意:

  1. 命令的时间复杂度:因为Redis是单线程,时间过长的查询会阻塞其他任务
  2. 数据结构的编码:虽然Redis会自动根据情况切换数据编码,但是要优化Redis还是要了解数据编码的形式和设置合理的参数;

下面一个表,表示基本数据结构能实现的功能:





























































数据结构 命令 功能
String 几乎所有命令 大部分的缓存任务 热数据访问缓存 高频写入缓存
Hash - -
List lpush + lpop
List lpush + rpop 队列
List lpush + brpop 消息队列
List lpush + ltrim 有序集合
Set sadd 标签
Set spop/srandmember 抽奖系统
Set sadd + sinter 社交需求
Zset 许多常用命令 排行榜系统

发表评论

表情:
评论列表 (有 0 条评论,276人围观)

还没有评论,来说两句吧...

相关阅读