首页 > 编程知识 正文

redis集群三种方式,redis应用场景及实例

时间:2023-05-05 17:23:39 阅读:26015 作者:4864

女士们是什么? Redis是一个非常快速的开源无关(称为数据结构服务) Key-Value数据库,包含五种类型的值的键映射。 用作数据库、缓存和消息代理。

Redis与其他键值数据库的一个主要区别是Redis存储和操作高级数据类型的能力。 这些数据类型是许多开发人员熟悉的基本数据结构(列表、映射、集合和排序集)。 Redis的卓越性能、简单性和数据结构原子操作有助于解决使用传统关系数据库实现时难以实现或难以执行的问题。

Redis的特性一个产品的使用场景一定要根据产品的特性,首先列举Redis的特征:

具有丰富读写持久化数据类型的单线程数据自动过期,订阅分散。 这里通过几个场景,用不同的维度说明Redis的应用。

典型的APP应用程序场景1、缓存缓存是Redis最常见的APP应用程序场景,主要是因为Redis具有良好的读写性能。 并且,代替memcached,逐渐有将服务端缓存优先化的组件。 此外,Redis内部还支持事务,可在使用时有效保证数据的一致性。

但是也有需要注意的地方:

保证不同对象的key不能重复,且key尽量短,通常必须使用类名加上主键拼接而成的。 为了提高序列化效率和减少内存使用量,选择序列化方式也很重要。 缓存中数据的一致性。 通常,仅在数据库查询后将对象放入缓存的方法,以及在发生对象删除或修改操作时直接清除(或设置为过期)相应缓存的数据库添加和查询后将对象放入缓存2、限时运营redis中,可以使用expire命令设置一个密钥的生存时间,经过一段时间后redis会将其删除。 利用该特性,可以有效利用于限时活动信息、手机验证码等业务场景。

3、计数器计数功能应该最适合redis的使用场景之一,高频读写特性可以充分发挥redis作为存储数据库的效率。 在Redis的数据结构中,string、hash和sorted set都为原子自增量操作提供了incr方法。 以各自的应用场景为例进行说明。

如果APP应用程序需要查看每天的注册用户数,请使用String作为计数器,设置名为REGISTERED_COUNT_TODAY的key,并在初始化时设置截止到午夜。 每次成功注册用户时,都可以使用incr命令将密钥递增1,并在每天午夜后因密钥过期而递增值。每个微博都有四个属性:评估数、评论数、重发数和浏览数。 这个用hash计数会更好。 此计数器的密钥设置为weibo:weibo_id,hash的字段为like_number、comment_number和Forwaard。如果有帖子排名功能,请选择sorted set 用户发布后,使用zincrby将该用户id的score增加1。 sorted set将进行排序,用户所在排名的位置也将实时更新。 4、排名使用sortedset即可轻松完成热排名,zrevrangebyscore可获得分数顺序,zrank可获得分数顺序

5、分布式锁定从redis2.6. 12版开始,在string的set命令中添加了三个参数。

Ex :设定密钥的有效期限(s ) )。

Px:设置密钥过期(毫秒) ) )。

NX|xx :如果设置为NX,则仅在key存在时执行操作;如果设置为xx,则仅在key不存在时执行操作。 此操作是原子性的,可以轻松实现以下分布式锁定:

如果set key 'lock' Ex 1 xx操作返回false,则添加key未成功。 也就是说,现在有人占用了这个锁。 如果返回true,则表示已获得锁定,可以继续操作。 操作后,用戴尔解除锁定。 此外,即使程序出于某些原因未解除锁定,并且设置了过期日期,该锁定也会在一秒钟后自动解除。

伪代码:

//摇滚while lock即将诞生!=1 //有效期避免死锁now=int(time.time ) ) lock _ time out=now lock _ time out1lock=redis _ client.set NX ) lock_key

6、延迟操作如订单生产后,我们占用库存,10分钟后去检查用户真的可以购买,如果没有购买,将其发票设置为无效,同时恢复库存。 由于redis提供了keyspace notifications2.8. 0或更高版本的功能,因此客户可以订阅Pub/Sub通道以某种方式接收影响redis数据集的事件。 因此,我们可以针对上述需求使用以下解决方案。

我们在订单生产时,设置一个key,同时设置10分钟后过期, 我们在后台实现一个监听器,监听key的实效,监听到key失效时将后续逻辑加上。 当然我们也可以利用rabbitmq、activemq等消息中间件的延迟队列服务实现该需求。

7、分页、模糊搜索

redis的set集合中提供了一个zrangebylex方法,语法如下:

ZRANGEBYLEX key min max [LIMIT offset count]

通过ZRANGEBYLEX zset - + LIMIT 0 10 可以进行分页数据查询,其中- +表示获取全部数据

zrangebylex key min max 这个就可以返回字典区间的数据,利用这个特性可以进行模糊查询功能,这个也是目前我在redis中发现的唯一一个支持对存储内容进行模糊查询的特性。

8、点赞、好友等相互关系

一篇介绍微博Redis应用的PPT中,其中提到微博的Redis主要用在计数和好友关系两方面,

《Redis设计与实现》中作者最开始使用Redis中的set是因为传统数据库无法计算集合的交集。

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

A:follow:存放A所有关注的用户id

A:follower:存放A所有粉丝的用户id

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

9、队列

Redis中的list的数据结构实现的是双向链表,所以可以非常便捷的应用于消息队列(生产者/消费者模型)。消息的生产者只需要通过lpush将消息放入list,消费者可以通过rpop取出该消息,并且保证消息的有序性。

如果需要实现带有优先级的消息队列也可以选择**sorted list。而pub/sub**也可以作为发布者/订阅者模型的消息。由于Redis带有持久化功能,无需担心由于服务器故障导致消息丢失的情况发生。

10、时间轴

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

11、倒排索引

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

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

 

示例:秒杀和Redis的结合

秒杀是现在互联网系统中常见的营销模式,作为开发者,其实最不愿意这样的活动,因为非技术人员无法理解到其中的技术难度,导致在资源协调上总是有些偏差。秒杀其实经常会出现的问题包括:

并发太高导致程序阻塞。库存无法有效控制,出现超卖的情况。

其实解决这些问题基本就两个方案:

数据尽量缓存,阻断用户和数据库的直接交互。通过锁来控制避免超卖现象。

现在说明一下,如果现在做一个秒杀,那么,Redis应该如何结合进行使用?

提前预热数据,放入Redis商品列表放入Redis List商品的详情数据 Redis hash保存,设置过期时间商品的库存数据Redis sorted set保存用户的地址信息Redis set保存订单产生扣库存通过Redis制造分布式锁,库存同步扣除订单产生后发货的数据,产生Redis list,通过消息队列处理秒杀结束后,再把Redis数据和数据库进行同步

以上是一个简略的秒杀系统和Redis结合的方案,当然实际可能还会引入http缓存,或者将消息对接用MQ代替等方案,也会出现业务遗漏的情况,这个只是希望能抛砖引玉。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。