精华内容
下载资源
问答
  • Redis几种数据结构应用场景

    千次阅读 2015-08-28 14:14:16
     Redis list的应用场景非常多,也是Redis最重要的数据结构之一。   我们可以轻松地实现最新消息排行等功能。   Lists的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作...

    String

    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. 1、String  
    2. 常用命令:  
    3. 除了get、set、incr、decr mget等操作外,Redis还提供了下面一些操作:  
    4. 获取字符串长度  
    5. 往字符串append内容  
    6. 设置和获取字符串的某一段内容  
    7. 设置及获取字符串的某一位(bit)  
    8. 批量设置一系列字符串的内容  
    9.   
    10. 应用场景:  
    11. String是最常用的一种数据类型,普通的key/value存储都可以归为此类,value其实不仅是String,  
    12. 也可以是数字:比如想知道什么时候封锁一个IP地址(访问超过几次)。INCRBY命令让这些变得很容易,通过原子递增保持计数。  
    13.   
    14. 实现方式:  
    15. m,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。  

    Hash

    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. 常用命令:  
    2. hget,hset,hgetall 等。  
    3. 应用场景:  
    4. 我们简单举个实例来描述下Hash的应用场景,比如我们要存储一个用户信息对象数据,包含以下信息:  
    5.            用户ID,为查找的key,  
    6.            存储的value用户对象包含姓名name,年龄age,生日birthday 等信息,  
    7.    如果用普通的key/value结构来存储,主要有以下2种存储方式:  
    8.        第一种方式将用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储,  
    9.            如:set u001 "李三,18,20010101"  
    10.            这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题。  
    11.        第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿,用用户ID+对应属性的名称作为唯一标识来取得对应属性的值,  
    12.            如:mset user:001:name "李三 "user:001:age18 user:001:birthday "20010101"  
    13.            虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。  
    14.     那么Redis提供的Hash很好的解决了这个问题,Redis的Hash实际是内部存储的Value为一个HashMap,  
    15.     并提供了直接存取这个Map成员的接口,  
    16.         如:hmset user:001 name "李三" age 18 birthday "20010101"     
    17.             也就是说,Key仍然是用户ID,value是一个Map,这个Map的key是成员的属性名,value是属性值,  
    18.             这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过   
    19.             key(用户ID) + field(属性标签) 操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。很好的解决了问题。  
    20.   
    21.           这里同时需要注意,Redis提供了接口(hgetall)可以直接取到全部的属性数据,但是如果内部Map的成员很多,那么涉及到遍历整个内部Map的操作,由于Redis单线程模型的缘故,这个遍历操作可能会比较耗时,而另其它客户端的请求完全不响应,这点需要格外注意。  
    22.   实现方式:  
    23.     上面已经说到Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。  

    List

    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. 常用命令:  
    2.     lpush,rpush,lpop,rpop,lrange,BLPOP(阻塞版)等。  
    3.   
    4. 应用场景:  
    5.     Redis list的应用场景非常多,也是Redis最重要的数据结构之一。  
    6.     我们可以轻松地实现最新消息排行等功能。  
    7.     Lists的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。  
    8.   
    9. 实现方式:  
    10.     Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。  
    11.   
    12. RPOPLPUSH source destination  
    13.   
    14.     命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:  
    15.     将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。  
    16.     将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。  
    17.     如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。  
    18.     一个典型的例子就是服务器的监控程序:它们需要在尽可能短的时间内,并行地检查一组网站,确保它们的可访问性。  
    19.     redis.lpush "downstream_ips", "192.168.0.10"  
    20.     redis.lpush "downstream_ips", "192.168.0.11"  
    21.     redis.lpush "downstream_ips", "192.168.0.12"  
    22.     redis.lpush "downstream_ips", "192.168.0.13"  
    23.     Then:  
    24.     next_ip = redis.rpoplpush "downstream_ips", "downstream_ips"  
    25.   
    26. BLPOP  
    27.   
    28.   假设现在有 job 、 command 和 request 三个列表,其中 job 不存在, command 和 request 都持有非空列表。考虑以下命令:  
    29.   BLPOP job command request 30  #阻塞30秒,0的话就是无限期阻塞,job列表为空,被跳过,紧接着command 列表的第一个元素被弹出。  
    30.   1) "command"                             # 弹出元素所属的列表  
    31.   2) "update system..."                    # 弹出元素所属的值   
    32.   为什么要阻塞版本的pop呢,主要是为了避免轮询。举个简单的例子如果我们用list来实现一个工作队列。执行任务的thread可以调用阻塞版本的pop去获取任务这样就可以避免轮询去检查是否有任务存在。当任务来时候工作线程可以立即返回,也可以避免轮询带来的延迟。  

    Set

    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. 4、Set  
    2.   
    3. 常用命令:  
    4.     sadd,srem,spop,sdiff ,smembers,sunion 等。  
    5.   
    6. 应用场景:  
    7.     Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。  
    8.     比如在微博应用中,每个人的好友存在一个集合(set)中,这样求两个人的共同好友的操作,可能就只需要用求交集命令即可。  
    9.     Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实  
    10.   
    11. 实现方式:  
    12.     set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。  


    Sort Set

    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. 5、Sorted set  
    2.   
    3.   常用命令:  
    4.     zadd,zrange,zrem,zcard等  
    5.   
    6.   使用场景:  
    7.     以某个条件为权重,比如按顶的次数排序.  
    8.     ZREVRANGE命令可以用来按照得分来获取前100名的用户,ZRANK可以用来获取用户排名,非常直接而且操作容易。  
    9.     Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。  
    10.     比如:twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。  
    11.     比如:全班同学成绩的SortedSets,value可以是同学的学号,而score就可以是其考试得分,这样数据插入集合的,就已经进行了天然的排序。  
    12.     另外还可以用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。  
    13.   
    14.     需要精准设定过期时间的应用  
    15.     比如你可以把上面说到的sorted set的score值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了,不仅是清除Redis中的过期数据,你完全可以把Redis里这个过期时间当成是对数据库中数据的索引,用Redis来找出哪些数据需要过期删除,然后再精准地从数据库中删除相应的记录。  
    16.   
    17.   
    18.   实现方式:  
    19.     Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。  


    消息订阅

    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1.    6、 Pub/Sub  
    2.   
    3.     Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,  
    4.     当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。  
    5.   
    6. 客户端1:subscribe  rain  
    7. 客户端2:PUBLISH  rain "my love!!!"  
    8.     (integer) 2 代表有几个客户端订阅了这个消息  

    transaction

    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1.   7、Transactions  
    2.   
    3.     谁说NoSQL都不支持事务,虽然Redis的Transactions提供的并不是严格的ACID的事务(比如一串用EXEC提交执行的命令,在执行中服务器宕机,那么会有一部分命令执行了,剩下的没执行),但是这个Transactions还是提供了基本的命令打包执行的功能(在服务器不出问题的情况下,可以保证一连串的命令是顺序在一起执行的,中间有会有其它客户端命令插进来执行)。  
    4.     Redis还提供了一个Watch功能,你可以对一个key进行Watch,然后再执行Transactions,在这过程中,如果这个Watched的值进行了修改,那么这个Transactions会发现并拒绝执行。  
    5. Session 1  
    6.     (1)第1步  
    7.     redis 127.0.0.1:6379> get age  
    8.     "10"  
    9.     redis 127.0.0.1:6379> watch age  
    10.     OK  
    11.     redis 127.0.0.1:6379> multi  
    12.     OK  
    13.     redis 127.0.0.1:6379>  
    14.    
    15. Session 2  
    16.     (2)第2步  
    17.     redis 127.0.0.1:6379> set age 30  
    18.     OK  
    19.     redis 127.0.0.1:6379> get age  
    20.     "30"  
    21.     redis 127.0.0.1:6379>  
    22.   
    23. Session 1     
    24.     (3)第3步  
    25.     redis 127.0.0.1:6379> set age 20  
    26.     QUEUED  
    27.     redis 127.0.0.1:6379> exec  
    28.     (nil)  
    29.     redis 127.0.0.1:6379> get age  
    30.     "30"  
    31.     redis 127.0.0.1:6379>  
    32.   
    33.     第一步,Session 1 还没有来得及对age的值进行修改  
    34.   第二步,Session 2 已经将age的值设为30  
    35.   第三步,Session 1 希望将age的值设为20,但结果一执行返回是nil,说明执行失败,之后我们再取一下age的值是30,这是由于Session   1中对age加了乐观锁导致的。  
    36.    


    展开全文
  • redis5种数据结构讲解及使用场景

    万次阅读 多人点赞 2017-12-12 10:36:22
    redis提供了5中数据结构,理解每种数据结构的特点对于redis开发运维非常重要。 一、字符串 字符串类型是redis最基础的数据结构,首先键是字符串类型,而且其他几种结构都是在字符串类型基础上构建的, 所以字符串...
    redis提供了5中数据结构,理解每种数据结构的特点对于redis开发运维非常重要。
    

    一、字符串

    字符串类型是redis最基础的数据结构,首先键是字符串类型,而且其他几种结构都是在字符串类型基础上构建的,
    所以字符串类型能为其他四种数据结构的学习尊定基础。
    字符串类型实际上可以是字符串
    (简单的字符串、复杂的字符串(xml、json)、数字(整数、浮点数)、二进制(图片、音频、视频)),
    但最大不能超过512M。
    

    使用场景:

    缓存功能:字符串最经典的使用场景,redis最为缓存层,Mysql作为储存层,绝大部分请求数据都是
             redis中获取,由于redis具有支撑高并发特性,所以缓存通常能起到加速读写和降低 后端压力的作用。
            (redis为何具备支撑高并发的特性,下次文章讲解)。
    计数器:许多运用都会使用redis作为计数的基础工具,他可以实现快速计数、查询缓存的功能,
            同时数据可以一步落地到其他的数据源。
            如:视频播放数系统就是使用redis作为视频播放数计数的基础组件。
    共享session:出于负载均衡的考虑,分布式服务会将用户信息的访问均衡到不同服务器上,
            用户刷新一次访问可能会需要重新登录,为避免这个问题可以用redis将用户session集中管理,
            在这种模式下只要保证redis的高可用和扩展性的,每次获取用户更新或查询登录信息
            都直接从redis中集中获取。
    限速:处于安全考虑,每次进行登录时让用户输入手机验证码,为了短信接口不被频繁访问,
            会限制用户每分钟获取验证码的频率。
    

    二、哈希

    在redis中哈希类型是指键本身又是一种键值对结构,如 value={{field1,value1},......{fieldN,valueN}}  
    

    使用场景:

          哈希结构相对于字符串序列化缓存信息更加直观,并且在更新操作上更加便捷。
          所以常常用于**用户信息**等管理,但是哈希类型和关系型数据库有所不同,哈希类型是稀疏的,
          而关系型数据库是完全结构化的,关系型数据库可以做复杂的关系查询,而redis去模拟关系型复杂查询
          开发困难,维护成本高。
    

    三、列表

    列表类型是用来储存多个有序的字符串,列表中的每个字符串成为元素(element),一个列表最多可以储存
    2的32次方-1个元素,在redis中,可以队列表两端插入(pubsh)和弹出(pop),还可以获取指定范围的元素
    列表、获取指定索引下表的元素等,列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,
    在实际开发中有很多应用场景。
    优点:
        1.列表的元素是有序的,这就意味着可以通过索引下标获取某个或某个范围内的元素列表。
        2.列表内的元素是可以重复的。
    

    使用场景:

    消息队列: redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端是用lupsh从列表左侧插入元素,
             多个消费者客户端使用brpop命令阻塞时的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡
             和高可用性
    

    clipboard.png
    消息队列模型↑

    文章列表:每个用户都有属于自己的文章列表,现在需要分页展示文章列表,此时可以考虑使用列表,列表不但有序
             同时支持按照索引范围获取元素。
    

    使用列表技巧:
    lpush+lpop=Stack(栈)
    lpush+rpop=Queue(队列)
    lpush+ltrim=Capped Collection(有限集合)
    lpush+brpop=Message Queue(消息队列)


    四、集合

    集合类型也是用来保存多个字符串的元素,但和列表不同的是集合中不允许有重复的元素,并且集合中的元素是
    无序的,不能通过索引下标获取元素,redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、
    差集,并合理的使用好集合类型,能在实际开发中解决很多实际问题。
    

    使用场景:

     标签(tag):集合类型比较典型的使用场景,如一个用户对娱乐、体育比较感兴趣,另一个可能对新闻感兴
                 趣,这些兴趣就是标签,有了这些数据就可以得到同一标签的人,以及用户的共同爱好的标签,
                 这些数据对于用户体验以及曾强用户粘度比较重要。
                 (用户和标签的关系维护应该放在一个事物内执行,防止部分命令失败造成数据不一致)
    
    sadd=tagging(标签)
    spop/srandmember=random item(生成随机数,比如抽奖)
    sadd+sinter=social Graph(社交需求)
    

    五、有序集合

    有序集合和集合有着必然的联系,他保留了集合不能有重复成员的特性,但不同得是,有序集合中的元素是可以
    排序的,但是它和列表的使用索引下标作为排序依据不同的是,它给每个元素设置一个分数,作为排序的依据。
    (有序集合中的元素不可以重复,但是csore可以重复,就和一个班里的同学学号不能重复,但考试成绩可以相
    同)。
    
    列表、集合、有序集合三者的异同点
    

    clipboard.png

    使用场景:

        排行榜:有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:
               按照时间、按照播放量、按照获得的赞数等。
    

    本文就先介绍到此,初次发稿高手勿喷。谢谢支持。

    展开全文
  • redis的5种数据结构应用场景介绍

    千次阅读 2018-07-05 12:14:07
    redis和memcached都可以作为缓存系统使用,redis与memcached一样,为了保证效率,数据都是缓存在内存中,读写的性能差距不大。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在...


           在服务端为了减轻高并发下数据库的访问压力,经常要应用缓存。redis和memcached都可以作为缓存系统使用,redis与memcached一样,为了保证效率,数据都是缓存在内存中,读写的性能差距不大。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。而且相比memcache,redis还支持事务操作和多种储存结构,在分布式集群的架构下,redis的扩展性更强。

           认识redis,最基本就是了解它支持存储的数据结构和特性,这样才能更好的理解它的操作命令和应用场景。基于redis的广泛应用,今天的小课堂就和大家一起认识一下redis中基本的5种数据结构。

          redis的简单认识

          作为缓存工具时的使用,我们经常将一些结构化的信息打包成集合,序列化后存储为一个字符串的值,比如用户的昵称、年龄、性别、积分等。这时候在读取,需要将字符串取出来,然后进行反序列化。如果修改某一项的值,需要再序列化成字符串存储回去。简单修改一个属性就干这么多事情,消耗必定是很大的,也不适用于一些可能并发操作的场合。因此我们可以例如redis支持数据类型的特性,根据业务用Redis直接存储数据,实现功能。

          redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)、Hash(字典)。

          这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。

         如果你是Redis中高级用户,还需要加上下面几种数据结构:

         HyperLogLog(基数): 比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。

        GEO 特性在 Redis 3.2 版本推出, 这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作(空间数据的储存格式,点线面关系)。

        Pub/Sub (发布订阅)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。


    Redis常见数据结构使用场景

    1. String

    常用命令:  set,get,decr,incr,mget 等。

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

    我们在nginx做负载均衡的时候,如果是基于权重的分配方式,切换web服务器时,会导致用户的session信息丢失我们可以将它保存在redis种。



    2.Hash

    常用命令: hget,hset,hgetall 等。

            redis中的哈希结构就如同java中的map一样,Hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 Redis 的 Hash 结构可以使你像在数据库中 Update 一个属性一样只修改某一项属性值。它的使用方法就像它的别名字典,通过对应的字典名(key)和词条名(field)查询内容(value)

          比如我们可以Hash数据结构来存储用户信息,商品信息等等。例如修真院的首页的职业信息,只是简单的信息集合,我们可以直接将它储存到redis中,在读取的过程中就不用序列化对象,直接操作。


    3.List

    常用命令: lpush,rpush,lpop,rpop,lrange等

    list就是链表,Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如微博的关注列表,粉丝列表,最新消息排行等功能都可以用Redis的list结构来实现。

    Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。


    4.Set

    常用命令:sadd,spop,smembers,sunion 等

    set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的。 当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

    1.共同好友、二度好友
    2.利用唯一性,可以统计访问网站的所有独立 IP
    3.好友推荐的时候,根据 tag 求交集,大于某个 threshold 就可以推荐


    5.Sorted Set

    常用命令: zadd,zrange,zrem,zcard等

    和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。

    举例: 在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息,适合使用Redis中的SortedSet结构进行存储。


    代码实现:



    常见问题:

    1.缓存穿透和缓存雪崩是什么概念?

    什么是缓存穿透?
    一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透

    如何避免?
    1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。
    2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。【感觉应该用的不多吧】


    缓存雪崩
    什么是缓存雪崩?
    当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
    如何避免?
    1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
    2:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
    3:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期(此点为补充)


    2.MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据(redis有哪些数据淘汰策略???)

    redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略)。redis 提供 6种数据淘汰策略:

    1. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
    1. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
    1. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
    1. allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
    1. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
    1. no-enviction(驱逐):禁止驱逐数据
    使用策略规则:
     1、如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru
     2、如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random


    3.redis的数据持久化的方式

    1.RDB方式持久化

    RDB方式是通过快照方式完成的,当符合一定条件时Redis会自动将内存中的所有数据进行快照并且存储到硬盘上。进行快照的条件在配置文件中指定,有2个参数构成:时间和改动键的个数,当在指定时间内被更改的键的个数大于指定数值时就会进行快照。RDB是Redis默认的持久化方式

    在配置文件中已经预置了三个条件

    #save 900 1 # 15分钟内至少有一个键被更改

    #save 300 10 # 5分钟内至少有10个键被更改

    #save 60 10000 # 1分钟内至少有10000个键被更改

    2. AOF方式持久化

    Redis的AOF持久化策略是将发送到Redis服务端的每一条命令都记录下来,并且保存在硬盘的AOF文件中。可以通过参数appendonly来设置是否启用AOF。AOF文件的位置和RDB的位置相同,都是通过dir参数设置,默认的文件名是appendonly.aof,可以通过appendfilename参数修改。

    展开全文
  • Android几种数据存储方式的应用场景

    千次阅读 2016-08-04 21:42:28
    作为一个完整的应用程序,数据...对这几种方式的不同和应用场景整理如下。 第一种: 使用SharedPreferences存储数据  适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用程序
            作为一个完整的应用程序,数据存储操作是必不可少的。因此,Android系统一共提供了四种数据存储方式。分别是:SharePreference、文件存储、SQLite、 Content Provider。对这几种方式的不同和应用场景整理如下。

    第一种: 使用SharedPreferences存储数据

      适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口 令密码等
      核心原理:保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。通过DDMS的File Explorer面板,展开文件浏览树,很明显SharedPreferences数据总是存储在/data/data//shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。 SharedPreferences本身是一 个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例,该方法中name表示要操作的xml文件名,第二个参数具体如下:
      Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写。
      Context.MODE_WORLD_READABLE: 指定该SharedPreferences数据能被其他应用程序读,但不能写。
      Context.MODE_WORLD_WRITEABLE: 指定该SharedPreferences数据能被其他应用程序读,写
      SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。

    第二种: 文件存储数据

      可以在设备本身的存储设备或者外接的存储设备中创建用于保存数据的文件。同样在默认的状态下,文件是不能在不同的程序间共享。
      写文件:调用Context.openFileOutput()方法根据指定的路径和文件名来创建文件,这个方法会返回一个FileOutputStream对象。
      读取文件:调用Context.openFileInput()方法通过制定的路径和文件名来返回一个标准的Java FileInputStream对象。

    第三种:SQLite存储数据

      SQLite Database数据库。Android对数据库的支持很好,它本身集成了SQLite数据库,每个应用都可以方便的使用它,或者更确切的说,Android完全依赖于SQLite数据库,它所有的系统数据和用到的结构化数据都存储在数据库中。 它具有以下优点: a. 效率出众,这是无可否认的 b. 十分适合存储结构化数据 c. 方便在不同的Activity,甚至不同的应用之间传递数据。  

    第四种:ContentProvider

      Android系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。每个ContentProvider都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用ContentProvider为这些数据定义一个URI,然后其他的应用程序就通过Content Provider传入这个URI来对数据进行操作。
      总结一下,文件适用于存储一些简单的文本数据或者二进制数据,SharedPreferences适用于存储一些键值对,而数据库则适用于那些复杂的关系型数据。
    展开全文
  • 数据结构:八大数据结构分类

    万次阅读 多人点赞 2018-09-05 18:23:28
    每一种数据结构都有着独特的数据存储方式,下面为大家介绍它们的结构和优缺点。 1、数组 数组是可以再内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从0...
  • Redis有哪几种数据结构? ● String——字符串 String数据结构是简单的key-value类型,value不仅可以是String,也可以是数字(当数字类型用Long可以表示的时候encoding就是整型,其他都存储在sdshdr当做字符串)。 ...
  • Redis 数据结构有5,分别为:字符串(String)列表(List)哈希(Hash) 集合(Set)有序集合(ZSet) 字符串(String) Redis没有直接使用C语言传统的字符串表示,而是自己构建了一名为简单动态字符串(simple ...
  • 数据挖掘涉及到公司运营的方方面面,这包括对企业部门经营情况的评估、内部员工的管理、生产流程的监管、产品结构优化与新产品开发、财务成本优化、市场结构的分析和客户关系的管理。其中,关于客户与市场的数据分析...
  • mysql几种引擎和使用场景

    千次阅读 2018-03-16 18:35:21
    数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的...
  • redis 五种数据类型和应用场景

    万次阅读 2018-09-04 21:39:21
    redis提供了5中数据结构,理解每种数据结构的特点对于redis开发运维非常重要。   一、字符串 字符串类型是redis最基础的数据结构,首先键是字符串类型,而且其他几种结构都是在字符串类型基础上构建的, 所以...
  • 开发中sqlite几种常见的使用场景

    千次阅读 2017-06-26 11:19:23
    场景一:需要备份整个数据库结构以及数据; 步骤: 1、使用sqlite3命令进入sqlite终端:sqlite3 test.db 2、.output test.sql 3、.dump 4、退出sqlite终端,ls,即可发现目录下多出了一个test.sql文件,这个文件即为...
  • Redis之常用的十几种使用场景

    千次阅读 多人点赞 2020-04-17 12:01:00
    文章目录四、使用场景1、缓存2、数据共享分布式3、分布式锁4、全局ID5、计数器6、限流7、位统计8、购物车9、用户消息时间线timeline10、消息队列11、抽奖12、点赞、签到、打卡13、商品标签14、商品筛选15、用户关注...
  • redis的五种数据结构原理分析

    万次阅读 多人点赞 2018-11-13 15:51:08
    redis中的五种数据结构分析 应用场景分析 总结   关于Redis redis是一个开源的使用C语言编写的一个kv存储系统,是一个速度非常快的非关系远程内存数据库。它支持包括String、List、Set、Zset、hash五种数据...
  • 几种树的优缺点和应用场景

    千次阅读 2019-03-27 15:01:50
    单纯的二叉树只是一个概念,并没有实际应用场景。 二叉查找树:又名二叉排序树,二叉搜索树。如果存在左子树,那么左子树上所有节点均小于根节点,如果存在右子树,那么右子树上所有节点均大于根节点。并且,...
  • 应用相对其他数据结构比较少。windows对进程地址空间的管理用到了AVL树 红黑树:平衡二叉树,广泛用在C++的STL中。map和set都是用红黑树实现的。我们熟悉的STL的map容器底层是RBtree,当然指的不是unordered_map,后者...
  • 专业术语 sds:simple dynamic string 简单动态字符串 embstr:embedded sds string embstr编码的...使用场景: 底层数据结构: string 相关命令 命令行 含义 set key value 赋值key的值为value get key 获取
  • 重温数据结构:理解 B 树、B+ 树特点及使用场景

    万次阅读 多人点赞 2018-05-29 00:46:13
    大家好,前面那篇文章《3 分钟理解完全二叉树、平衡二叉树、二叉查找树》中我们了解了几种特殊的二叉树的功能及特点,知道了它们在进行查找数据时可以提高效率,但需要注意的是,这是指在内存中进行查找。...
  • 单机版的redis最多只能支持大概万的QPS,缓存一般来说都是用来支撑读高并发的,写的请求是比较少的,要想支持更高的并发量,可将redis做成读写分离的主从架构。 如下图所示:架构做成主从架构,一主多从,主负责...
  • 数据结构算法常见面试考题

    万次阅读 多人点赞 2018-11-08 09:29:44
    数据结构几种树集中的讨论一下: 1.AVLtree 定义:最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)...
  • Activity 的几种启动模式及应用场景

    千次阅读 2018-02-27 16:05:23
    在一个项目中会包括着多个Activity,系统中使用任务栈来存储创建的Activity实例,任务栈是一“后进先出”的栈结构。举个栗子,若我们多次启动同一个Activity。系统会创建多个实例依次放入任务栈中。当按back键返回...
  • Redis五种数据类型及应用场景

    千次阅读 2020-03-05 22:36:08
    1、什么是 Redis? Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库。 ...(1)Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进...
  • 队列有两实现方式,一是数组,一是链表。如果需要一个循环数组队列,就可以使用ArrayDeQueue类。如果需要链表对列,就直接使用LinkedList类,这个类实现了Queue接口。循环数组是一个有界集合,即容量有限。...
  • 【Redis】五种数据类型及其使用场景

    万次阅读 多人点赞 2020-05-25 22:58:57
    类型与类比java的模型 string --> String hash --> Hashmap list --> LinkList set --> HashSet sorted_set --> TreeSet String类型 redis 数据存储格式 redis自身是一个Map类型的存储方式,...
  • redis 五种数据类型的使用场景

    万次阅读 多人点赞 2014-11-12 12:26:38
    String 1、String 常用命令: 除了get、set、incr、decr mget等操作外,Redis还提供了下面一些操作: ...String是最常用的一种数据类型,普通的key/value存储都可以归为此类,value其实不仅是String
  • 开发中的几种加密算法的使用场景

    千次阅读 2018-07-24 00:25:21
    数据传输过程中的加密是程序开发中避不开的一个问题。如何更科学更合理的使用加密算法也就成了一...加密算法有很多,这里只列出开发中常用的几种。 单向散列哈希算法 代表: MD5、SHA(128、256)系列 简介: ...
  • 数据结构与算法学习笔记

    万次阅读 多人点赞 2018-09-25 13:55:49
    本文是王争老师的《算法与数据结构之美》的学习笔记,详细内容请看王争的专栏。有不懂的地方指出来,我做修改。 数据结构与算法思维导图 数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组...
  • Redis 的 ZSet 结构,可以应用在实现延时队列、限流、获取排行榜等场景。本文通过demo代码简单实现了三功能,供大家参考。delay queue ,rate limit
  • Redis redis五种数据类型和使用场景

    千次阅读 2019-05-03 16:00:29
    让缓存集中处理(大家使用同一个缓存服务),我们需要一个类似于MYSQL这样可以通过服务来提供第三方的缓存工具(缓存服务器);流行的第三方缓存服务器:memcache/redis 2、REmote DIctionary Server(Redis) 是一个由...
  • 为什么要学数据结构

    万次阅读 多人点赞 2019-11-19 09:45:23
    很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 368,872
精华内容 147,548
关键字:

几种数据结构的应用场景

数据结构 订阅