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

看完了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--
Listlpush + lpop
Listlpush + rpop队列
Listlpush + brpop消息队列
Listlpush + ltrim有序集合
Setsadd标签
Setspop/srandmember抽奖系统
Setsadd + sinter社交需求
Zset许多常用命令排行榜系统
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页