redis相关

项目与redis的结合

  1. 【 数据缓存优先】:在读写数据的时候,为了保持多人在线同时读取一个数据的异步问题,确保玩家读取到的数据都是同一份数据,采用的是缓存优先的原则,读取数据的时候,先去判断一下缓存中是否存在对应的数据,数据存在的情况下,不去进行redis的读取,不存在的时候,采取进行一次redis读取操作
  2. 【排行榜数据】:
    1. 添加排行榜数据:redis.call(‘ZADD’, rankKey, value, filed)
    2. 更新排行榜数据:redis.call(“ZINCBY”, redisKey, value, filed)
    3. 获得排行榜的数据: redis.call(‘ZREVRANGE’, redisKey, range1, range2)

redis体现的设计模式

  1. 观察者模式是一种机制,用于在数据变更时通知其他相关对象。

Redis观察者模式的基本原理如下:

Redis中的服务器(server)维护了一个观察者列表,用于存储所有已注册的观察者。
数据发生变化时,会遍历观察者列表,依次通知每个观察者进行相应的处理。
观察者可以是Redis的数据库(database)、键空间(keyspace)通知、命令(command)等等。
观察者在注册时会指定自己感兴趣的事件类型,只有当发生指定类型的事件时才会收到通知。
当观察者收到通知后,可以执行相应的操作,如更新缓存、发送通知等。
Redis中具体的观察者模式包括以下两种:

数据库观察者:可以通过配置文件中的"notify-keyspace-events"选项来开启。当数据库中的某个键被修改、删除或过期时,会触发数据库观察者的通知。
键空间事件通知:可以通过CONFIG命令来设置。它允许客户端订阅或退订某些键空间事件(如键的修改、删除、过期等),当这些事件发生时,会触发键空间观察者的通知。
通过使用观察者模式,Redis可以实现一些实时通知机制,使得相关对象能够在数据变更时得到通知,并进行相应的操作。这在一些场景下非常有用,例如缓存更新、实时数据订阅等。

redis 设计的优点

Redis设计的伟大之处在于以下几个方面:

高性能:Redis的设计目标之一就是提供高性能的数据访问。它采用了基于内存的数据存储,以及使用单线程的事件驱动模型和非阻塞I/O,从而在处理大量请求时能够实现低延迟和高并发性能。

数据结构丰富:Redis支持丰富的数据结构,包括字符串、哈希表、列表、集合和有序集合等。这使得Redis可以满足不同的应用场景,如缓存、消息队列、排行榜等,而不仅仅局限于键值存储。

持久化机制:Redis提供了多种持久化机制,包括快照(snapshotting)和AOF(Append-Only File)日志。这使得Redis可以在重启后快速恢复数据,并提供数据的持久性保证。

复制和集群:Redis支持主从复制和分布式集群,可以实现数据的复制和扩展。主从复制可以提高读性能和可用性,而集群可以水平扩展数据存储和处理能力。

简单易用:Redis提供了简单和易用的命令行接口,以及丰富的客户端库支持,使得开发者能够方便地与Redis进行交互和集成。

社区活跃:Redis拥有一个庞大和活跃的社区,持续地贡献新特性、解决问题,并提供了丰富的文档和教程。这使得开发者能够得到及时的帮助和支持。

总体而言,Redis通过优化性能、支持多种数据结构、提供持久化和复制机制等特性,使得它得以在广泛的应用场景中被广泛使用,并成为非常受欢迎的高性能缓存和数据存储解决方案。

redis 的 append only file 的重写机制

Redis的AOF(Append-Only File)重写是一种优化机制,用于减小AOF文件的体积,提高性能。
AOF重写的基本原理如下:

Redis服务器创建一个无磁盘冲洗(no-Fsync)的子进程,该子进程将通过扫描数据库来重写AOF文件。

子进程使用一种紧凑的格式将数据库中的所有操作重写到临时文件。

当重写过程进行到一定程度时,主进程将前一段时间内的命令写入AOF文件,并更新主进程的复制缓冲区,短暂地阻塞新的写命令。

子进程完成对数据库的扫描和AOF文件的重写后,将新的AOF文件重命名为旧的AOF文件,并让主进程继续正常地处理命令请求。

AOF重写的关键在于将数据库中的操作重写为一系列更简单、更紧凑的命令,从而减小AOF文件的体积。重写过程使用了一些优化技术,例如合并多个操作为一个操作,删除冗余的操作等。
AOF重写的优点有:

可以减小AOF文件的体积,降低存储空间的占用。
AOF重写生成的新AOF文件可以使得文件中的命令顺序更加连续和紧凑,提高了命令的执行效率。
AOF重写可以清除AOF文件中的多余操作,提高了系统的可靠性和稳定性。

需要注意的是,AOF重写是一个耗时增量式的方式进行,可以将重写均摊到多次操作中,避免长时间阻塞主进程的命令请求。此外,重写的频率可以通过配置项进行设置,以控制重写的频率和影响。

redis 是否为单线程的:默认为单线程

  1. 主服务作为唯一的处理线程处理事务
    1. (主线程) 单线程:启用的是(单个)i/o系统对(多个)文件描述符进行监听(一对多)
    2. (主线程)多线程:启用(多个)i/o系统对(多个)文件描述符进行监听(多对多)
    3. (非主线程)多线程:主线程通过fork一个子线程,子线程将执行一些列redis持久化的操作:缓存淘汰机制,AOF重写机制等,此类的线程都被系统称之为后台线程
  2. 从服务器作为哨兵机制,判断集群中主线程的状态,启用的是哨兵机制
  3. 主线程:(事件驱动)
    1. 事件循环(event loop)的机制
    2. i/o 多路复用的机制,监听到多个sockets的状态,状态为可写可读的情况下,将其注册到对应的事件表中
    3. 等待注册的事件发生,执行对应的事务,通过回调函数完成事务
    4. 完成事务同步客户端事务的执行结果
    5. 持续等待监听下一个事件的状态的(i/o)多路复用机制
  4. 优点:有效地避免了线程的多次上下文的切换造成的资源开销问题
  5. 非阻塞i/o和阻塞i/o(阻塞socket和非阻塞的socket)
    1. 阻塞的i/o,持续等待处理返回的结果,线程在等待的时间内处于【阻塞状态】,不能进行其他的任务
    2. 非阻塞i/o,高并发、对数据的实时性较强的场景下,异步操作,线程在结果返回之前,可以【继续进行】其他的任务,同时等待对应的结果返回

redis 写指令

Redis提供了多个用于增加值的命令,具体取决于所操作的数据类型。以下是几个常用的增加命令:

INCR:对存储在键中的数字值进行增加操作,将其增加1。如果键不存在,则默认值为0,并将其增加1。
INCR key

INCRBY:对存储在键中的数字值进行给定的增量操作。如果键不存在,则默认值为0。
INCRBY key increment

INCRBYFLOAT:对存储在键中的浮点数进行给定的增量操作。如果键不存在,则默认值为0。
INCRBYFLOAT key increment

这些命令适用于存储在字符串类型的键中的数字值的增加操作。通过使用这些命令,可以方便地对计数器、计量器等进行增加操作。需要注意的是,增加命令只能作用于数字类型的值,如果键包含其他类型的值,将会返回错误。
另外,需要注意的是,在Redis的单线程模型下,并发的增加命令可能会遇到竞争条件。如果需要保证多个操作的原子性增加,可以使用事务或加锁机制来控制并发访问。

redis 写数据怎么保持原子性

为了保持Redis写操作的原子性,Redis提供了一些机制和命令:

事务(Transaction):Redis支持事务操作,通过MULTI、EXEC、WATCH和DISCARD等命令来实现。在事务中,一组命令可以作为一个原子操作进行执行,要么全部成功,要么全部失败。

MULTI:标记一个事务块的开始。
EXEC:执行事务中的所有命令。
WATCH:监视给定的键,如果在事务执行期间被其他客户端修改,则事务会被取消。
DISCARD:取消事务,放弃所有已经加入到事务队列中的命令。

注意:事务是按照顺序执行的,但不保证事务的隔离性,因为在执行过程中其他客户端可能会修改被监视的键。

原子性命令:Redis提供了一些原子性的命令,这些命令可以完成特定操作而不需要事务来保证原子性。例如:

SETNX:设置一个键的值,仅当键不存在时才进行设置。
INCR/DECR:将键的值增加/减少1,并返回增加/减少后的值。
LPUSH/RPUSH:将一个元素推入列表的左边/右边。

这些命令本身具有原子性,可以在单个命令中完成操作,而不需要事务。

锁机制:在需要保证一系列命令的原子性操作时,可以使用锁来控制对关键资源的访问。Redis提供了分布式锁的实现,可以利用SETNX和EXPIRE等命令来实现简单的互斥锁。
为了保证锁的正确释放,需要考虑异常情况和锁过期的情况。

通过使用事务、原子性命令和锁机制,Redis可以提供一定程度的原子性保证,确保多个写操作在一次执行中要么全部成功,要么全部失败。但需要注意的是,Redis是单线程的,对于频繁的写操作和高并发的场景,应该选择合适的方案来保证数据的一致性和并发性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值