zoukankan      html  css  js  c++  java
  • redis 有用 Sorted-Set 应用场景

    1.1.1Set数据类型的 使用场景

    1可以使用RedisSet数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。

    2充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Setintersections交集命令就可以充分发挥它的方便和效率的优势了。

    1.1 存储sortedset

    1.1.1 概述

    Sorted-SetSet类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Set中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Set中的成员必须是唯一的,但是分数(score)却是可以重复的。

    Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于Sorted-Set中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis所具有的这一特征在很多其它类型的数据库中是很难实现的,换句话说,在该点上要想达到和Redis同样的高效,在其它数据库中进行建模是非常困难的。

    例如游戏排名微博热点话题等使用场景。

    1.1.1 扩展命令(了解)

    l zrangebyscore key min max [withscores] [limit offset count]:返回分数[min,max]的成员并按照分数从低到高排序。[withscores]:显示分数;[limit offset count]:offset,表明从脚offset的元素开并返回count个成员。   分页排名

     

     

     

     

    l zincrby key increment member:设置指定成员的增加的分数。返回值是更改后的分数。

     

     

    l zcount key min max:获取分数在[min,max]之间的成员

     

     

     

    l zrank key member:返回成员集合中的排名(从小到大)

     

     

    l zrevrank key member:返回成员集合中的排名(从大到小)

     

     

    1.1.1 使用场景

    1、可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOPTEN的用户信息。当然我们也可以利用ZRANK命令通过username来获取玩家的排行信息。最后我们将组合使用ZRANGEZRANK命令快速的获取和某个玩家积分相近的其他用户的信息。

    2Sorted-Set类型还可用于构建索引数据。

    1.1 消息订阅与发布

    l subscribe channel:订阅频道,例:subscribe mychat,订阅mychat这个频道

    l psubscribe channel*:批量订阅频道例:psubscribe s*订阅以”s”开头的频道

    l publish channel content:在指定的频道中发布消息,如 publish mychat ‘today is a newday’

    步骤1:在第一个连接中,订阅mychat频道。此时如果没有人“发布”消息,当前窗口处于等待状态。

     

    步骤2:在另一个窗口中,在mychat频道中,发布消息。

     

     

    步骤3:再第三个窗口,批量订阅以my开头所有频道。

     

    步骤4:在第二个窗口,分别在“mychat”和“mychat2”发布消息

     

    1.1.1 redis事务特征

    1、 在事务中的所有命令都将会被串行化的顺序执行事务执行期间,Redis不会再为其它客户端的请求提供任何服务,从而保证了事物中的所有命令被原子的执行

    2、 和关系型数据库中的事务相比,Redis事务中如果有某一条命令执行失败,其后的命令仍然会被继续执行

    3、 我们可以通过MULTI命令开启一个事务,有关系型数据库开发经验的人可以将其理解为"BEGIN TRANSACTION"语句。在该语句之后执行的命令都将被视为事务之内的操作,最后我们可以通过执行EXEC/DISCARD命令来提交/回滚该事务内的所有操作。这两个Redis命令可被视为等同于关系型数据库中的COMMIT/ROLLBACK语句。

    4、 在事务开启之前,如果客户端与服务器之间出现通讯故障并导致网络断开,其后所有待执行的语句都将不会被服务器执行。然而如果网络中断事件是发生在客户端执行EXEC命令之后,那么该事务中的所有命令都会被服务器执行。

     

     

     

     

    1.1.1 优势

     

    1、 该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。至于无同步,无需多言,我想大家都能正确的理解它。

     

    2、 由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题。

     

    3、 如果日志过大,Redis可以自动启用rewrite机制。即Redisappend模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。

     

    4、 AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。

     

    1.1.2 劣势

     

    1、 对于相同数量的数据集而言,AOF文件通常要大于RDB文件

     

    2、 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。

     

     

     

     

    第1章 redis使用场景(了解)

     

    1、 取最新N个数据的操作

     

    比如典型的取你网站的最新文章,通过下面方式,我们可以将最新的5000条评论的ID放在RedisList集合中,并将超出集合部分从数据库获取

     

     (1)使用LPUSH latest.comments <ID>命令,向list集合中插入数据

     

     (2)插入完成后再用LTRIM latest.comments 0 5000命令使其永远只保存最近5000ID

     

     (3)然后我们在客户端获取某一页评论时可以用下面的逻辑(伪代码)

     

    # 伪代码

     

     

    FUNCTION get_latest_comments(start, num_items):

     

        id_list = redis.lrange("latest.comments", start, start+num_items-1)

     

        IF id_list.length < num_items

     

            id_list = SQL_DB("SELECT ... ORDER BY time LIMIT ...")

     

        END

     

        RETURN id_list

     

    END

     

    如果你还有不同的筛选维度,比如某个分类的最新N条,那么你可以再建一个按此分类的List,只存ID的话,Redis是非常高效的。

     

     

    2、 排行榜应用,取TOP N操作

     

    这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted setscore,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。

     

     

    3、 需要精准设定过期时间的应用

     

    比如你可以把上面说到的sorted setscore值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了,不仅是清除Redis中的过期数据,你完全可以把 Redis里这个过期时间当成是对数据库中数据的索引,用Redis来找出哪些数据需要过期删除,然后再精准地从数据库中删除相应的记录。

     

     

    4、 计数器应用

     

    Redis的命令都是原子性的,你可以轻松地利用INCRDECR命令来构建计数器系统。

     

     

    5、 Uniq操作,获取某段时间所有数据排重值

     

    这个使用Redisset数据结构最合适了,只需要不断地将数据往set中扔就行了,set意为集合,所以会自动排重。

     

     

    6、 实时系统,反垃圾系统

     

    通过上面说到的set功能,你可以知道一个终端用户是否进行了某个操作,可以找到其操作的集合并进行分析统计对比等。没有做不到,只有想不到。

     

     

    7、 Pub/Sub构建实时消息系统

     

    RedisPub/Sub系统可以构建实时的消息系统,比如很多用Pub/Sub构建的实时聊天系统的例子。

     

     

    8、 构建队列系统

     

    使用list可以构建队列系统,使用sorted set甚至可以构建有优先级的队列系统。

     

     

     

     

     

    第1章 redis持久化(了解)

     

    1.1 概述

     

    Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。

     

    Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者结合使用。

     

    1、 RDB持久化默认支持,无需配置

     

    该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘

     

    2、 AOF持久化

     

    该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的

     

    3、 无持久化

     

    我们可以通过配置的方式禁用Redis服务器的持久化功能,这样我们就可以将Redis视为一个功能加强版的memcached了。

     

    4、 redis可以同时使用RDBAOF

     

    1.2 RDB

     

    1.2.1 优势

     

    1、 一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。

     

    2、 对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上

     

    3、 性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork(分叉)出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。

     

    4、 相比于AOF机制,如果数据集很大,RDB的启动效率会更高。

     

    1.2.2 劣势

     

    1、 如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。

     

    2、 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟

     

    5、 当使用Append-Only模式时,Redis会通过调用系统函数write将该事务内的所有写操作在本次调用中全部写入磁盘。然而如果在写入的过程中出现系统崩溃,如电源故障导致的宕机,那么此时也许只有部分数据被写入到磁盘,而另外一部分数据却已经丢失。Redis服务器会在重新启动时执行一系列必要的一致性检测,一旦发现类似问题,就会立即退出并给出相应的错误提示。此时,我们就要充分利用Redis工具包中提供的redis-check-aof工具,该工具可以帮助我们定位到数据不一致的错误,并将已经写入的部分数据进行回滚。修复之后我们就可以再次重新启动Redis服务器了。

  • 相关阅读:
    栏目调用 sql语句
    一场豪赌 微软的未来取决于Windows 8
    mark
    [导入].net中的如何私有部署强命名组件
    q160问题,www.q160.com,ie被篡改
    解决jdgui保存源码自动添加注释的情况
    汉诺塔问题
    软件测试 方法总结
    javascript 基础篇4 window对象,DOM
    javascript 进阶篇1 正则表达式,cookie管理,userData
  • 原文地址:https://www.cnblogs.com/shan1393/p/9174053.html
Copyright © 2011-2022 走看看