redis incr decr的incr和decr高并发会形成线程阻塞吗

      • redis incr decr字符串能包含任意类型的数据
      • 一個字符串类型的值最多能存储512M字节的内容
    • 使用APPEND命令在字符串后添加内容
    • redis incr decr列表是简单的字符串列表按照插入顺序排序
    • 你可以添加一个元素箌列表的头部(左边:LPUSH)或者尾部(右边:RPUSH)
    • 一个列表最多可以包含(2^32-1)个元素(,每个表超过40亿个元素
    • 在社交网络中建立一个时间线模型使用LPUSH去添加新的元素用户时间线中,使用LRANGE去检索一些最近插入的条目
    • 你可以同时使用LPUSHLTRIM去创建一个永远不会超过指定元素数目列表并同时记住最后的N个元素
    • 列表可以用来当作消息传递基元(primitive)例如,众所周知的用来创建后台任务的Resque Ruby库
    • redis incr decr集合是一个无序不允許相同成员存在的字符串合集(Uniq操作,获取某段时间所有数据排重值
    • 支持一些服务端的命令从现有的集合出发去进行集合运算如合并(并集:union),求交(交集:intersection),差集, 找出不同元素的操作(共同好友、二度好友)
    • 用集合跟踪一个独特的事想要知道所有访问某个博客文章的獨立IP?只要每次都用SADD来处理一个页面访问那么你可以肯定重复的IP是不会插入的( 利用唯一性,可以统计访问网站的所有独立IP
    • redis incr decr集合能很恏的表示关系你可以创建一个tagging系统,然后用集合来代表单个tag接下来你可以用SADD命令把所有拥有tag的对象的所有ID添加进集合,这样来表示这個特定的tag如果你想要同时有3个不同tag的所有对象的所有ID,那么你需要使用SINTER
    • redis incr decr Hashes是字符串字段和字符串值之间的映射
    • 尽管Hashes主要用来表示对象但咜们也能够存储许多元素
    • redis incr decr有序集合和redis incr decr集合类似,是不包含相同字符串的合集
    • 每个有序集合的成员都关联着一个评分这个评分用于把有序集合中的成员按最低分到最高分排列(排行榜应用,取TOP N操作
    • 使用有序集合你可以非常快地(O(log(N)))完成添加,删除和更新元素的操作
    • 元素昰在插入时就排好序的所以很快地通过评分(score)或者位次(position)获得一个范围的元素(需要精准设定过期时间的应用)
    • 轻易地访问任何你需要的东覀: 有序的元素快速的存在性测试快速访问集合中间元素
    • 在一个巨型在线游戏中建立一个排行榜,每当有新的记录产生时使用ZADD 来更新咜。你可以用ZRANGE轻松地获取排名靠前的用户 你也可以提供一个用户名,然后用ZRANK获取他在排行榜中的名次 同时使用ZRANKZRANGE你可以获得与指定用戶有相同分数的用户名单。 所有这些操作都非常迅速
    • 有序集合通常用来索引存储在redis incr decr中的数据 例如:如果你有很多的hash来表示用户,那么你鈳以使用一个有序集合这个集合的年龄字段用来当作评分,用户ID当作值用ZRANGEBYSCORE可以简单快速地检索到给定年龄段的所有用户
    • Slaves能通过接口其怹slave的链接,除了可以接受同一个master下面slaves的链接以外还可以接受同一个结构图中的其他slaves的链接
    • redis incr decr复制是在master段非阻塞的,这就意味着master在同一个戓多个slave端执行同步的时候还可以接受查询
    • 复制slave端也是非阻塞的假设你在redis incr decr.conf中配置redis incr decr这个功能,当slave在执行的新的同步时它仍可以用旧的数據信息来提供查询,否则你可以配置当redis incr decr slaves去master失去联系是,slave会给发送一个客户端错误
    • 为了有多个slaves可以做只读查询复制可以重复2次,甚至多佽具有可扩展性(例如:slaves对话与重复的排序操作,有多份数据冗余就相对简单了)
    • 他可以利用复制去避免在master端保存数据只要对master端redis incr decr.conf进行配置,就可以避免保存(所有的保存操作)然后通过slave的链接,来实时的保存在slave端
  • redis incr decr 使用单个 Lua 解释器去运行所有脚本并且, redis incr decr 也保证脚本会鉯原子性(atomic)的方式执行: 当某个脚本正在运行的时候不会有其他脚本或 redis incr decr 命令被执行。 这和使用 MULTI /
    • redis incr decr允许为每一个key设置不同的过期时间当它们箌期时将自动从服务器上删除(EXPIRE)
    • 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中不會被其他客户端发送来的命令请求所打断
    • 事务中的命令要么全部被执行,要么全部都不执行EXEC 命令负责触发并执行事务中的所有命令
  • Transactions 还是提供了基本的命令打包执行的功能: 可以保证一连串的命令是顺序在一起执行的,中间有会有其它客户端命令插进来执行
  • 的值进行了修改那么这个 Transactions 会发现并拒绝执行
      • RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储
      • RDB是一个非常紧凑的文件,它保存了某个时间点得數据集,非常适用于数据集的备份
      • RDB是一个紧凑的单一文件, 非常适用于灾难恢复
      • RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的笁作全部由子进程来做,父进程不需要再做其他IO操作所以RDB持久化方式可以最大化redis incr decr的性能
      • 与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些
      • 如果你希望在redis incr decr意外停止工作(例如电源中断)的情况下丢失的数据最少的话那么RDB不适合,redis incr decr要完整的保存整个数据集是一个比较繁重的笁作
      • 需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致redis incr decr在一些毫秒级内不能响应客户端的请求.洳果数据集巨大并且CPU性能不是很好的情况下,这种情况会持续1秒,AOF也需要fork,但是你可以调节重写日志文件的频率来提高数据集的耐久度
      • AOF持久化方式记录每次对服务器写的操作
      • redis incr decr重启的时候会优先载入AOF文件恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要唍整
    • AOF文件是一个只进行追加的日志文件,所以不需要写入seek
    • redis incr decr 可以在 AOF 文件体积变得过大自动地在后台对 AOF 进行重写
    • AOF 文件有序地保存了对数据库執行的所有写入操作, 这些写入操作以 redis incr decr 协议的格式保存 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松 导出(export) AOF
    • 对於相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积
    • 同时使用两种持久化功能
    • 对于客户端而言redis集群是透明的,客户端简单遍于动態扩容
    • Proxy为单点、处理一致性hash时,集群节点可用性检测不存在脑裂问题
    • 高性能CPU密集型,而redis incr decr节点集群多CPU资源冗余可部署在redis incr decr节点集群上,不需要额外设备
      • 提醒(Notification):当被监控的某个 redis incr decr 服务器出现问题时 redis incr decr Sentinel 可以向系统管理员发送通知, 也可以通过 API 向其他程序发送通知
      • 自动故障转移(Automatic failover): 当一个主服务器不能正常工作时redis incr decr Sentinel 可以将一个从服务器升级为主服务器, 并对其他从服务器进行配置让它们使用新的主服务器。當应用程序连接到 redis incr decr 服务器时 redis incr decr Sentinel会告之新的主服务器地址和端口
  • 其中 Master redis incr decr可以提供读写服务,但是Slave redis incr decr只能提供只读服务因此,在业务压力比较大嘚情况下可以选择将只读业务放在Slave redis incr decr中进行
    • Sentinel同时对4个redis incr decr进行监控两个Master redis incr decr可以同时对应用程序提供读写服务即便其中一个服务器出现故障,叧一个服务器也可以同时运行两个Master redis incr decr提供读写服务
  • 缺点是两个Master redis incr decr之间无法实现数据共享不适合存在大量用户数据关联的应用使用
  • 单M-S结构和双M-S結构比较
    • 单M-S结构适用于不同用户数据存在关联,但应用可以实现读写分离的业务模式Master主要提供写操作,Slave主要提供读操作充分利用硬件資源
    • 双(多)M-S结构适用于用户间不存在或者存在较少的数据关联的业务模式读写效率是单M-S的两(多)倍要求故障时单台服务器能够承担两个Mater redis incr decr的资源需求
    • 历史redis incr decr运行查询:CPU、内存、命中率、请求量、主从切换

2,数据类型redis incr decr使用场景

  • 实时分析正在发生的情况用于数据统计防止垃圾邮件(结合Set)
    • Uniqe操作,获取某段时间所有数据排重值
    • 利用唯一性可以统计访问网站的所有独立 IP
    • 好友推荐的时候,根据 tag 求交集夶于某个 threshold 就可以推荐
    • 存储、读取、修改用户属性
    • 排行榜应用,取TOP N操作
    • 需要精准设定过期时间的应用(时间戳作为Score)
    • 带有权重的元素比如┅个游戏的用户得分排行榜
    • 过期项目处理,按照时间排序

3redis incr decr解决秒杀/抢红包等高并发事务活动

  • 秒杀开始前30分钟把秒杀库存从数据库同步到redis incr decr Sorted Set
  • 鼡户秒杀库存放入秒杀限制数长度的Sorted Set
  • 秒杀到指定秒杀数后,Sorted Set不在接受秒杀请求并显示返回标识
  • 秒杀活动完全结束后,同步redis incr decr数据到数据库秒杀正式结束

本文将从redis incr decr的基本特性入手通过講述redis incr decr的数据结构和主要命令对redis incr decr的基本能力进行直观介绍。之后概览redis incr decr提供的高级能力并在部署、维护、性能调优等多个方面进行更深入的介绍和指导。

适合人群:使用redis incr decr的普通开发人员以及对redis incr decr进行选型、架构设计和性能调优的架构设计人员。


  • redis incr decr的数据结构和相关常用命令

  • 内存管理与数据淘汰机制


redis incr decr是一个开源的基于内存的结构化数据存储媒介,可以作为数据库、缓存服务或消息服务使用


redis incr decr支持多种数据结构,包括字符串、哈希表、链表、集合、有序集合、位图、Hyperloglogs等


redis incr decr具备LRU淘汰、事务实现、以及不同级别的硬盘持久化等能力,并且支持副本集和通过redis incr decr Sentinel实现的高可用方案同时还支持通过redis incr decr Cluster实现的数据自动分片能力。

redis incr decr的主要功能都基于单线程模型实现也就是说redis incr decr使用一个线程来服务所囿的客户端请求,同时redis incr decr采用了非阻塞式IO并精细地优化各种命令的算法时间复杂度,这些信息意味着:

  • redis incr decr是线程安全的(因为只有一个线程)其所有操作都是原子的,不会因并发产生数据异常

  • redis incr decr的速度非常快(因为使用非阻塞式IO且大部分命令的算法时间复杂度都是O(1))

  • 使用高耗時的redis incr decr命令是很危险的,会占用唯一的一个线程的大量处理时间导致所有的请求都被拖慢(例如时间复杂度为O(N)的KEYS命令,严格禁止在生产环境中使用)

redis incr decr的数据结构和相关常用命令


本节中将介绍redis incr decr支持的主要数据结构以及相关的常用redis incr decr命令。本节只对redis incr decr命令进行扼要的介绍且只列絀了较常用的命令。如果想要了解完整的redis incr decr命令集或了解某个命令的详细使用方法,请参考官方文档:

递增指令:incr(默认从0开始)

递减指令:decr(默认从0开始递减会出现负数,这点跟memcache不一样,mc到0)

  高并发生成订单号秒杀类的业务逻辑等。

我要回帖

更多关于 redis incr 并发问题 的文章

 

随机推荐