Redis支持的数据类型
String
List
Set
Sorted Set
Hashes
Bit array
HyperLogLog
Binary-safe strings :
Redis的键是二进制安全的,可使用任何的二进制序列做为键.
好比"foo"这样的字符串,甚至是JPEG文件的二进制内容.
空串""也是合法的键.
不推荐使用特别长的键.
影响性能,作键的比较,查找键是很耗费性能的.
同时对带宽以及内存要求很大.若是当前的任务是匹配大值的存在.
建议使用hash,好比SHA1 , MD5等.
不推荐使用特别短的键.
例如使用"user:1000:followers"而不是"u1000flw".
前者明显可读性高,并且增长的空间较小.
坚持用统一的命名结构
好比 "object-type:id"
使用"."或"-"来表示由多个词语组成的字段.
好比"comment:1234:reply.to"或者"comment:1234:reply-to"
键的最大长度是512MB
这里的最大长度指的是单个key的长度.
对于value一样限制的是512MB.
List
List有两种底层实现机制 : 一种是基于array,而另外一种是基于linked list.
而Redis中的list就是基于后者(linked list).
这样作的好处就是
在list头部/尾部 添加数据的时候,均可以以很快的速度去处理,无论你是添加1条数据,仍是插入1亿条数据效率上都是差很少的.
坏处就是
当你访问list的时候,随着index的变大,消耗的时间也将成比例增长.
若是访问一个比较大的list 中间的元素的需求比较重要的话,建议使用sorted set.
经常使用命令 :
LPUSH , RPUSH , LPOP , RPOP , LRANGE , LTRIM ..
LRANGE
接受3个参数 : 一个list实例参数,两个index参数(起始位置,结束位置)
两个index参数都可觉得负数, 表示list.size() - index 处的元素的索引数;
LRANGE mylist 0 -3
LPUSH/RPUSH
它们的参数是可变长的参数.
具体来讲第一个参数接收一个list实例,后面n个参数均是要添加到list最开始/最末端 的元素.多个参数之间用空格分割
LPUSH mylist 12 4 www "ss"
LTRIM
相似于LRANGE , 所不一样的是 LRANGE只是为了展示,而LTRIM会将在它抽取的范围外的元素都给移除.
和LPUSH合做,能够实现保留最新多少条数据.
LPUSH mylist 100 3 4
LTRIM mylist 0 999
LPOP/RPOP 将list最前端/最尾端的元素返回回来,而且将它从源list中删除掉.
能够和PUSH操做一块儿使用实现生产者消费者模式.
list最广泛的两个表明性用法
1).记载用户发布到社交网络的最新更新.
2).使用消费者-生产者模式进行进程之间的通讯:
生产者向一个list中添加元素;
消费者消耗这些元素,并执行操做.
Redis提供了一些list命令来保证这种作法的高效性以及可靠性.
list拥有一个特性使得它适合实现 队列 , 而且一般做为进程间通讯系统的构建块.这个特性就是BLPOP 和 BRPOP .是个阻塞操做.
Note :
正常来说 生产者消费者模式, 当消费者向list索取元素的时候,发现该队列为空, 那么,消费者一般会进行等待一下子,而后再重试索取(这个过程叫轮询),
这样,会致使redis以及客户端都作了不少无用的命令行操做.
所以Redis提供了两个阻塞型的 pop 操做.
当list为空时,只有当新的元素被添加到list中后或者达到了用户指定的超时时间,BRPOP/BLPOP指令才会返回给调用者(一个结果).
demo :
BRPOP tasks 5 --等待tasks中的元素,若是超过5秒钟没有能够用的元素,就返回.
若是timeout参数 设置为 0 , 那么会永远等待新元素(不会超时,一直阻塞).
其中list参数能够接受 多个列表,好比task1 task2 .. , 当有一个列表任务有新增元素,就返回pop的结果.
关于BRPOP/BLPOP的一些须要注意的事情:
1).客户端是按照顺序来享受服务的
第一个客户端阻塞的来等待一个list,那么当有新的元素被其它的客户端push进来,那么它(即第一个客户端)将会首先享受这个服务.
2).和RPOP/LPOP的返回值不一样
它是个包含键名的双元素的数组,由于BRPOP/BLPOP能够同时阻塞式地从多个list列表中等待元素.
3).若是过时时间的阀值到了,将返回NULL
关于list以及阻塞操做的更多内容:
1).可使用RPOPLPUSH指令 来构建更安全的队列 或者 旋转队列.
2).redis提供了一个阻塞的变种指令 : BRPOPLPUSH
主键的自动建立与删除
三条规则来总结:
1). 当咱们添加一个元素到聚合数据类型,若是目标关键字不存在,在添加这个元素以前会(自动)建立一个空的聚合数据类型.
2). 当咱们从聚合数据类型中移除元素的时候, 若是该值是空的,那么键也将自动被销毁.
3).调用 只读命令/移除元素的写命令 在一个空的关键字上,永远会返回一样的结果,好像该关键字正持有命令行但愿找到空的数据类型.
Hashes (散列)
键值对 , 能够理解为java中的对象或map.
demo :
hmset user:1000 uname antirez birthyear 1977 verified 1
hget user:1000 uname
hget user:1000 birthyear
hgetall user:1000
hmget user:1000 uname birthyear no-such-field
hincrby user:1000 uname birthyear 10
Set
redis中的set是字符串类型的无序集合.
可使用SADD指令添加元素.
若是给定的元素已经存在,还能够作不少其它的操做,好比作交集,并集处理,或者比较多个set的不一样之处.
sadd myset 1 2 3
smembers myset
sismember myset 3 --检查元素3是否在set中存在
sinter tag:1:news tag:2:news tag:10:news tag:27:news --对这些set取交集
sunionstore game:1:deck deck -- 合并多个set
spop game:1:deck -- 从set中随机取出一个元素,并在该set中删除该元素
scard game:1:deck --返回该set集合中元素的个数
sandmember game:1:deck --返回set中的一个随机元素,对源set没有影响
Sorted Set
Sorted Set像是Set以及Hash的混合体.
排序规则:
1).按照score(一个设置的浮点值)从小到大顺序排列的.
2).若是score一致,那么按照value的字段顺序排列
实践注意:
Sorted Set实现自两个接口(dual-ported) : skip list 以及 hash table
所以每次添加元素的时候,以O(log(N))复杂度进行操做. 这个复杂度是ok的.
但取数的时候,redis几乎不用作什么额外操做,由于顺序是已经排列好的.
经常使用命令
ZADD some_set any_score the_element
ZRANGE some_set start_index end_index [withscores]
ZREVRANGE some_set start_index end_index [withsores]
ZRANGEBYSCORE some_set -inf any_score
ZREMRANGEBYSCORE some_set any_start_score any_end_score
ZREVRANK some_set
#如下命令是基于字典而非score来取得结果的
ZRANGEBYLEX , ZREVRANGEBYLEX , ZREMRANGEBYLEX , ZLEXCOUNT
demo : zrangebylex hackers [B [P -- 表示闭区间
注意,全部*range*的操做,都会把这些元素从set中删除哦~
Bitmap
Bitmap 并不是是一种数据类型.而是String类型上的一组"面向-位"的操做.
因为String是二进制安全的大文本(能够有512M大小),所以就有了 2^32种不一样的位组合.
bit操做分为两组 : 常量时间-单个位 的操做 ; bit组的操做(即多个bit的批量操做).
经常使用命令 SETBIT , GETBIT , BITOP , BITCOUNT , BITPOS
bitmap广泛使用场景 :
1).各类实时分析
2).存储和对象id关联的boolean信息, 高效而又节省空间
HyperLogLog (如下简称HLL)
redis提供的一种几率数据结构.用于计算惟一事物(技术上来说,是指估计一个集合的基数).
若是用其它方式,会消耗成比例的内存来实现.
而是用redis提供的hyperloglog,能够获得比较精确的统计结果,这个结果相比真实结果,偏差小于1%.
使用 PFADD 来添加计数 ; 使用 PFCOUNT 来查询集合中的基数.
HLL中不会真的存储这些元素,该数据结构只保存一个状态.
Redis的其它显著特性
1).支持 对大集合的中的键空间进行逐步迭代
2).能够云信Lua脚本服务器端 来提高延迟和带宽
3).Redis也是一个pub-sub服务器(即发布与订阅)