redis 两种数据类型的选用处境

String

[html] view
plain
 copy

 

 图片 1图片 2

  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

 

 图片 3图片 4

  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

 

 图片 5图片 6

  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

 

 图片 7图片 8

  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

 

 图片 9图片 10

  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

 

 图片 11图片 12

  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

 

 图片 13图片 14

  1.   7、Transactions  
  2.   
  3.     何人说NoSQL都不辅助工作,即使Redis的Transactions提供的并不是从严的ACID的业务(比如一串用EXEC提交实施的指令,在实践中服务器宕机,那么会有局地指令执行了,剩下的没执行),但是这么些Transactions依旧提供了主导的吩咐打包进行的职能(在服务器不出难题的处境下,可以有限援救连续串的命令是各样在同步实施的,中间有会有其余客户端命令插进来执行)。  
  4.     Redis还提供了一个Watch效用,你可以对一个key举办沃特ch,然后再实践Transactions,在这进度中,倘诺那么些沃特ched的值举办了修改,那么那几个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加了乐观锁导致的。
     
      1.     原文地址: http://blog.csdn.net/gaogaoshan/article/details/41039581
网站地图xml地图