Redis的应用场景

缓存

  作为Key-Value形态的内存数据库,Redis 最先会被想到的应用场景便是作为数据缓存。而使用 Redis 缓存数据非常简单,只需要通过string类型将序列化后的对象存起来即可,不过也有一些需要注意的地方:

  • 必须保证不同对象的 key 不会重复,并且使 key 尽量短,一般使用类名(表名)加主键拼接而成。
  • 选择一个优秀的序列化方式也很重要,目的是提高序列化的效率和减少内存占用。
  • 缓存内容与数据库的一致性,这里一般有两种做法:
    1. 只在数据库查询后将对象放入缓存,如果对象发生了修改或删除操作,直接清除对应缓存(或设为过期)。
    2. 在数据库新增和查询后将对象放入缓存,修改后更新缓存,删除后清除对应缓存(或设为过期)。

消息队列

  Redis 中list的数据结构实现是双向链表,所以可以非常便捷的应用于消息队列(生产者 / 消费者模型)。消息的生产者只需要通过lpush将消息放入 list,消费者便可以通过rpop取出该消息,并且可以保证消息的有序性。如果需要实现带有优先级的消息队列也可以选择sorted set。而pub/sub功能也可以用作发布者 / 订阅者模型的消息。无论使用何种方式,由于 Redis 拥有持久化功能,也不需要担心由于服务器故障导致消息丢失的情况。

时间轴(Timeline)

  list作为双向链表,不光可以作为队列使用。如果将它用作栈便可以成为一个公用的时间轴。当用户发完微博后,都通过lpush将它存放在一个 key 为LATEST_WEIBOlist中,之后便可以通过lrange取出当前最新的微博。

排行榜

  使用sorted set和一个计算热度的算法便可以轻松打造一个热度排行榜,zrevrangebyscore可以得到以分数倒序排列的序列,zrank可以得到一个成员在该排行榜的位置(是分数正序排列时的位置,如果要获取倒序排列时的位置需要用zcard-zrank)。

计数器

  计数功能应该是最适合 Redis 的使用场景之一了,因为它高频率读写的特征可以完全发挥 Redis 作为内存数据库的高效。在 Redis 的数据结构中,stringhashsorted set都提供了incr方法用于原子性的自增操作,下面举例说明一下它们各自的使用场景:

  • 如果应用需要显示每天的注册用户数,便可以使用string作为计数器,设定一个名为REGISTERED_COUNT_TODAY的 key,并在初始化时给它设置一个到凌晨 0 点的过期时间,每当用户注册成功后便使用incr命令使该 key 增长 1,同时当每天凌晨 0 点后,这个计数器都会因为 key 过期使值清零。
  • 每条微博都有点赞数、评论数、转发数和浏览数四条属性,这时用hash进行计数会更好,将该计数器的 key 设为weibo:weibo_idhash的 field 为like_numbercomment_numberforward_numberview_number,在对应操作后通过hincrby使hash 中的 field 自增。
  • 如果应用有一个发帖排行榜的功能,便选择sorted set吧,将集合的 key 设为POST_RANK。当用户发帖后,使用zincrby将该用户 id 的 score 增长 1。sorted set会重新进行排序,用户所在排行榜的位置也就会得到实时的更新。

好友关系

  这个场景最开始是是一篇介绍微博 Redis 应用的 PPT 中看到的,其中提到微博的 Redis 主要是用在在计数和好友关系两方面上,当时对好友关系方面的用法不太了解,后来看到《Redis 设计与实现》中介绍到作者最开始去使用 Redis 便是希望能通过set解决传统数据库无法快速计算集合中交集这个功能。后来联想到微博当前的业务场景,确实能够以这种方式实现,所以姑且猜测一下:

对于一个用户 A,将它的关注和粉丝的用户 id 都存放在两个 set 中:

  • A:follow:存放 A 所有关注的用户 id
  • A:follower:存放 A 所有粉丝的用户 id

    那么通过sinter命令便可以根据A:followA:follower的交集得到与 A 互相关注的用户。当 A 进入另一个用户 B 的主页后,A:followB:follow的交集便是 A 和 B 的共同专注,A:followB:follower的交集便是 A 关注的人也关注了 B。

分布式锁

  在 Redis 2.6.12 版本开始,stringset命令增加了三个参数:

  • EX:设置键的过期时间(单位为秒)
  • PX:设置键的过期时间(单位为毫秒)
  • NX | XX:当设置为NX时,仅当 key 存在时才进行操作,设置为XX时,仅当 key 不存在才会进行操作

    由于这个操作是原子性的,可以简单地以此实现一个分布式的锁,例如:

set key "lock" EX 1 XX

如果这个操作返回false,说明 key 的添加不成功,也就是当前有人在占用这把锁。而如果返回true,则说明得了锁,便可以继续进行操作,并且在操作后通过del命令释放掉锁。并且即使程序因为某些原因并没有释放锁,由于设置了过期时间,该锁也会在 1 秒后自动释放,不会影响到其他程序的运行。

倒排索引

  倒排索引是构造搜索功能的最常见方式,在 Redis 中也可以通过set进行建立倒排索引,这里以简单的拼音 + 前缀搜索城市功能举例:

假设一个城市北京,通过拼音词库将北京转为beijing,再通过前缀分词将这两个词分为若干个前缀索引,有:北京bbebeijinbeijing。将这些索引分别作为set的 key(例如:index:北)并存储北京的 id,倒排索引便建立好了。接下来只需要在搜索时通过关键词取出对应的set并得到其中的 id 即可。

参考:https://www.scienjus.com/redis-use-case/

原文地址:https://www.cnblogs.com/mengchunchen/p/9691021.html

时间: 2024-10-10 15:55:06

Redis的应用场景的相关文章

Redis 数据结构使用场景

Redis 数据结构使用场景 redis共有5种数据结构,每种的使用场景都是什么? 一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 redis 中一共有5种数据结构,那每种数据结构的使用场景都是什么呢? String——字符串 Hash——字典 List——列表 Set——集合 Sorted Set——有序集合 下面我们就来简单说明一下它们各自

redis的适应场景

redis应用场景: 1.对数据高并发读写 2.对海量数据的高效存储和访问 3.对数据的高可扩展性和高可用性 做分布式扩展很简单,因为没有固定的表结构 redis介绍: redis是一个key-value存储系统, key的数据类型包含:Strings,hashes,lists,set(集合),zset(有序集合) 为了保证效率,数据都是缓存在内存中,它可以周期性的保存在磁盘上. redis的适用场景: 1.应用程序直接读写redis服务器集群. 2.应用程序读写redis,redis和mysq

redis的应用场景分析

Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,并且它没有原生的可扩展机制,不具有scale(可扩展)能力,要依赖客户端来实现分布式读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上 redis的应用场景分析

Redis的使用场景 by 杨卫华

转载自新浪微博架构师杨卫华的博客 http://timyang.net/tag/redis/,省略了部分内容 按:杨卫华在2010年就已经测试了Redis的性能,并给出了初步的结论:“Redis性能惊人,国内前十大网站的子产品估计用1台Redis就可以满足存储及Cache的需求.” 而我在今天才开始看Redis,已经落后了6年. Redis是什么?这个问题的结果影响了我们怎么用Redis.如果你认为Redis是一个key value store, 那可能会用它来代替MySQL:如果认为它是一个可

016 redis的使用场景

一 .概述 redis并不是在任何情况下都可以使用的,必须在合适的情况下使用. 二 . 缓存 redis最为常用的就是场景就是帮助实现缓存,以前的缓存都可以使用redis来完成. 三 .获取最新的N个数据 可以使用list来完成,很方便的获取前面的数据. 四 . 排行榜的使用 我们可以使用zset来完成,使用权值的方式进行set的排序. 五 .计数器 这个我们使用string类型来完成. 六 . 存储关系 比如查询A和B共同的人群. 我们可以使用set来完成. 七 . 构建系统的队列和栈结构 我

redis的应用场景 为什么用redis

一.不是万能的菲关系系数据库redis 在面试的时候,常被问比较下Redis与Memcache的优缺点,个人觉得这二者并不适合一起比较,redis:是非关系型数据库不仅可以做缓存还能干其它事情,Memcache:是仅用做缓存.常常让我们对这二者进行比较,主要也是由于Redis最广泛的应用场景就是Cache. 1.2 redis 都能干嘛 缓存,毫无疑问这是Redis当今最为人熟知的使用场景.再提升服务器性能方面非常有效: 排行榜,在使用传统的关系型数据库(mysql oracle 等)来做这个事

redis常见应用场景

目录 String应用场景 分布式锁 计数器 分布式全局唯一id(string) list应用场景 消息队列(list) 新浪/Twitter用户消息列表(list) Set应用场景 抽奖活动(set) 实现点赞,签到,like等功能(set) 实现关注模型,可能认识的人(set) 电商商品筛选(set) zset应用场景 String应用场景 分布式锁 setnx key value,当key不存在时,将 key 的值设为 value ,返回1.若给定的 key 已经存在,则setnx不做任何

redis的应用场景简述

一个产品的使用场景肯定是需要根据产品的特性,先列举一下Redis的特点: 读写性能优异 持久化 数据类型丰富 单线程 数据自动过期 发布订阅 分布式 这里通过几个场景,不同维度说下Redis的应用. 高性能适合当做缓存 缓存是Redis最常见的应用场景,之所有这么使用,主要是因为Redis读写性能优异.而且逐渐有取代memcached,成为首选服务端缓存的组件.而且,Redis内部是支持事务的,在使用时候能有效保证数据的一致性. 作为缓存使用时,一般有两种方式保存数据: 1.读取前,先去读Red

redis 购物网站应用场景

1.cookies 登录信息记录: cookies记录登录信息有两种方式: 客户端记录登录的信息,过期时间,用户ID等,然后对信息进行签名: 优点:实现简单,分担了服务器的压力: 缺点:签名的过程,容易导致安全漏洞,(忘记签名),服务器分析用户行为不方便: token方式,cookies记录一串随机码,服务器将用户的相关信息关联该随机码: 优点:安全,请求的数据量小: 缺点:增加了服务器的压力. token实现方式可以用借助redis实现,相比关系数据库,redis有更好的读写性能,吞吐量更大.