您的位置:金沙游乐场85155 > 大数据库 > redis基本类型以及优点特性

redis基本类型以及优点特性

发布时间:2020-03-22 16:06编辑:大数据库浏览(134)

    1.Redis

    1.什么是redis?

    丰富的数据结构

    redis是一个基于内存的高性能key-value数据库

    字符串

    2.redis基本数据类型及应用场景 

    Redis字符串能包含任意类型的数据;;

    支持多种数据类型:

    一个字符串类型的值最多能存储512M字节的内容;

    string(字符串)  

    利用INCR命令簇来把字符串当作原子计数器使用;

    String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。 
    常规key-value缓存应用;

    使用APPEND命令在字符串后添加内容。

    list(列表)  

    列表

    list就是链表,略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消息排行等功能。List的另一个应用就是消息队列,可以利用List的PUSH操作,将任务存在List中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删除List中某一段的元素。 
    Redis的list是每个子元素都是String类型的双向链表,可以通过push和pop操作从列表的头部或者尾部添加或者删除元素,这样List即可以作为栈,也可以作为队列。

    Redis列表是简单的字符串列表,按照插入顺序排序;

    消息队列系统 
    使用list可以构建队列系统,使用sorted set甚至可以构建有优先级的队列系统。 
    比如:将Redis用作日志收集器 
    实际上还是一个队列,多个端点将日志信息写入Redis,然后一个worker统一将所有日志写到磁盘。

    你可以添加一个元素到列表的头部或者尾部;

    hash(散列)   

    一个列表最多可以包含232-1个元素;

    Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 
    存储部分变更的数据,如用户信息等。

    在社交网络中建立一个时间线模型,使用LPUSH去添加新的元素到用户时间线中,使用LRANGE去检索一些最近插入的条目;

    sets (集合)  

    你可以同时使用LPUSH和LTRIM去创建一个永远不会超过指定元素数目的列表并同时记住最后的N个元素;

    set就是一个集合,集合的概念就是一堆不重复值的组合。利用Redis提供的set数据结构,可以存储一些集合性的数据。set中的元素是没有顺序的。

    列表可以用来当作消息传递的基元,例如,众所周知的用来创建后台任务的Resque Ruby库。

    sorted set(有序集合)

    集合

    和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,比如一个存储全班同学成绩的sorted set,其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。可以用sorted set来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。

    Redis集合是一个无序的,不允许相同成员存在的字符串合集;

    3.分布式

    支持一些服务端的命令从现有的集合出发去进行集合运算,如合并,求交(交集:intersection),差集, 找出不同元素的操作;

    redis支持主从的模式。

    用集合跟踪一个独特的事。想要知道所有访问某个博客文章的独立IP?只要每次都用SADD来处理一个页面访问。那么你可以肯定重复的IP是不会插入的;

      原则:

    Redis集合能很好的表示关系。你可以创建一个tagging系统,然后用集合来代表单个tag。接下来你可以用SADD命令把所有拥有tag的对象的所有ID添加进集合,这样来表示这个特定的tag。如果你想要同时有3个不同tag的所有对象的所有ID,那么你需要使用SINTER。

    Master会将数据同步到slave,而slave不会将数据同步到master。Slave启动时会连接master来同步数据。

    使用SPOP或者SRANDMEMBER命令随机地获取元素。

    典型的读写分离模型。利用master来插入数据,slave提供检索服务。有效减少单个机器的并发访问数量。

    哈希

      读写分离模型:

    Redis Hashes是字符串字段和字符串值之间的映射;

    通过增加Slave DB的数量,读的性能可以线性增长,为了避免Master DB的单点故障,集群一般都会采用两台Master DB 做双机热备,所以整个集群的读和写的可用性都非常高。

    尽管Hashes主要用来表示对象,但它们也能够存储许多元素。

      缺陷:

    有序集合

    不管是Master还是Slave,每个节点都必须保存完整的数据,如果在数据量很大的情况下,集群的扩展能力是受限于单个节点的存储能力,而且对于Write-intensive类型的应用,读写分离架构并不适合。

    Redis有序集合和Redis集合类似,是不包含相同字符串的合集;

    为了解决读写分离模型的缺陷,可以将数分片模型应用进来。可以将每个节点看成都是master,然后通过业务实现数据分片。结合两种模型,可以将每个master设计成由一个master和多个slave组成的模型。

    每个有序集合的成员都关联着一个评分,这个评分用于把有序集合中的成员按最低分到最高分排列;

    4.redis优点

    使用有序集合,你可以非常快地完成添加,删除和更新元素的操作;

      a.单线程,利用redis队列技术并将访问变为串行访问,消除了传统数据库串行控制的开销

    元素是在插入时就排好序的,所以很快地通过评分(score)或者位次(position)获得一个范围的元素;

      b.redis具有快速和持久化的特征,速度快,因为数据存在内存中。

    轻易地访问任何你需要的东西: 有序的元素,快速的存在性测试,快速访问集合中间元素;

      c.分布式 读写分离模式

    在一个巨型在线游戏中建立一个排行榜,每当有新的记录产生时,使用ZADD 来更新它。你可以用ZRANGE轻松地获取排名靠前的用户, 你也可以提供一个用户名,然后用ZRANK获取他在排行榜中的名次。 同时使用ZRANK和ZRANGE你可以获得与指定用户有相同分数的用户名单。 所有这些操作都非常迅速;

      d.支持丰富数据类型

    有序集合通常用来索引存储在Redis中的数据。 例如:如果你有很多的hash来表示用户,那么你可以使用一个有序集合,这个集合的年龄字段用来当作评分,用户ID当作值。用ZRANGEBYSCORE可以简单快速地检索到给定年龄段的所有用户。

      e.支持事务,操作都是原子性,所谓原子性就是对数据的更改要么全部执行,要不全部不执行。

    复制 一个Master可以有多个Slaves能通过接口其他slave的链接,除了可以接受同一个master下面slaves的链接以外,还可以接受同一个结构图中的其他slaves的链接redis复制是在master段是非阻塞的,这就意味着master在同一个或多个slave端执行同步的时候还可以接受查询复制在slave端也是非阻塞的,假设你在redis.conf中配置redis这个功能,当slave在执行的新的同步时,它仍可以用旧的数据信息来提供查询,否则,你可以配置当redis slaves去master失去联系是,slave会给发送一个客户端错误为了有多个slaves可以做只读查询,复制可以重复2次,甚至多次,具有可扩展性他可以利用复制去避免在master端保存数据,只要对master端redis.conf进行配置,就可以避免保存,然后通过slave的链接,来实时的保存在slave端LRU过期处理 EVAL 和 EVALSHA 命令是从 Redis 2.6.0 版本开始的,使用内置的 Lua 解释器,可以对 Lua 脚本进行求值Redis 使用单个 Lua 解释器去运行所有脚本,并且, Redis 也保证脚本会以原子性(atomic)的方式执行: 当某个脚本正在运行的时候,不会有其他脚本或 Redis 命令被执行。 这和使用 MULTI / EXEC 包围的事务很类似。 在其他别的客户端看来,脚本的效果(effect)要么是不可见的(not visible),要么就是已完成的(already completed)LRU过期处理。

      f.可用于缓存,消息,按key设置过期时间,过期后自动删除

    Redis允许为每一个key设置不同的过期时间,当它们到期时将自动从服务器上删除。

    5.回收策略

    事务MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事务的基础事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断事务中的命令要么全部被执行,要么全部都不执行,EXEC 命令负责触发并执行事务中的所有命令 Redis 的 Transactions 提供的并不是严格的 ACID 的事务Transactions 还是提供了基本的命令打包执行的功能: 可以保证一连串的命令是顺序在一起执行的,中间有会有其它客户端命令插进来执行Redis 还提供了一个 Watch 功能,你可以对一个 key 进行 Watch,然后再执行 Transactions,在这过程中,如果这个 Watched 的值进行了修改,那么这个 Transactions 会发现并拒绝执行数据持久化 RDB。

      从最近最少使用的数据淘汰,挑选将要过期的数据淘汰。

    特点:

      volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

    RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。

      volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

    优点:

      volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

    RDB是一个非常紧凑的文件,它保存了某个时间点得数据集,非常适用于数据集的备份;

      allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

    RDB是一个紧凑的单一文件, 非常适用于灾难恢复;

      allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

    RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能;

      no-enviction(驱逐):禁止驱逐数据

    与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些。

    6.redis和memcache相比,有哪些优势?

    缺点:

      a.memcache所有的值均是简单的字符串,redis支持更为丰富的数据类型

    如果你希望在redis意外停止工作的情况下丢失的数据最少的话,那么RDB不适合,Redis要完整的保存整个数据集是一个比较繁重的工作。

      b.redis速度比memcached快很多

    RDB 需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致Redis在一些毫秒级内不能响应客户端的请求.如果数据集巨大并且CPU性能不是很好的情况下,这种情况会持续1秒,AOF也需要fork,但是你可以调节重写日志文件的频率来提高数据集的耐久度。

      c.redis支持持久化

    AOF

    7.redis与memcache区别

    特点

      a.存储方式 memcache存在内存中,redis存在硬盘中,保证数据持久化

    AOF持久化方式记录每次对服务器写的操作;

      b.数据类型 memcache对数据类型支持相对简单,redis有复杂的数据类型

    redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。

      c.使用底层模型不同:底层实现方式以及客户端之间通信的应用协议不一样

    优点

      d.redis最大可以达到1G而memcache只有1MB

    使用AOF 会让你的Redis更加耐久: 你可以使用不同的fsync策略:无fsync,每秒fsync,每次写的时候fsync;

    8.redis 持久化

    本文由金沙游乐场85155发布于大数据库,转载请注明出处:redis基本类型以及优点特性

    关键词: