《“Java技术员”成长手册》,包含框架、存储、搜索、优化、分布式等必备知识,都收集在GitHub JavaEgg ,N线互联网开发必备技能兵器谱,欢迎指导html
Redis:REmote DIctionary Server(远程字典服务器)。java
Redis 是一个全开源免费(BSD许可)的,内存中的数据结构存储系统,它能够用做数据库、缓存和消息中间件。通常做为一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器python
redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。c++
redis是一个key-value存储系统。和Memcached相似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操做,并且这些操做都是原子性的。在此基础上,redis支持各类不一样方式的排序。与memcached同样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,而且在此基础上实现了master-slave(主从)同步,因此Redis也能够被当作是一个数据结构服务器。git
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合能够对关系数据库起到很好的补充做用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。github
Redis支持主从同步。数据能够从主服务器向任意数量的从服务器上同步,从服务器能够是关联其余从服务器的主服务器。这使得Redis可执行单层树复制。存盘能够有意无心的对数据进行写操做。因为彻底实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操做的可扩展性和数据冗余颇有帮助。golang
redis的官网地址,很是好记,是redis.io。(域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地)目前,Vmware在资助着redis项目的开发和维护redis
Redis的全部数据都是保存在内存中,而后不按期的经过异步方式保存到磁盘上(这称为“半持久化模式”);也能够把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。这就是redis提供的两种持久化的方式,RDB(Redis DataBase)和AOF(Append Only File)。算法
Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案。shell
Redis从它的许多竞争继承来的三个主要特色:
Redis数据库彻底在内存中,使用磁盘仅用于持久性。
相比许多键值数据存储,Redis拥有一套较为丰富的数据类型。
Redis能够将数据复制到任意数量的从服务器。
安装
$ wget http://download.redis.io/releases/redis-5.0.6.tar.gz $ tar xzf redis-5.0.6.tar.gz $ cd redis-5.0.6 $ make
新版本的编译文件在src中(以前在bin目录),启动server
$ src/redis-server
启动客户端
$ src/redis-cli redis> set foo bar OK redis> get foo "bar"
string是redis最基本的类型,你能够理解成与Memcached如出一辙的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string能够包含任何数据。好比jpg图片或者序列化的对象 。
Redis 的字符串是动态字符串,是能够修改的字符串,内部结构实现上相似于 Java 的 ArrayList,采用预分配冗余空间的方式来减小内存的频繁分配,如图中所示,内部为当前字符串实际分配的空间 capacity 通常要高于实际字符串长度 len。当字符串长度小于 1M 时,扩容都是加倍现有的空间,若是超过 1M,扩容时一次只会多扩 1M 的空间。须要注意的是字符串最大长度为 512M。
Redis hash 是一个键值对集合。KV模式不变,但V是一个键值对。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 的字典至关于 Java 语言里面的 HashMap,它是无序字典, 内部实现结构上同 Java 的 HashMap 也是一致的,一样的数组 + 链表二维结构。第一维 hash 的数组位置碰撞时,就会将碰撞的元素使用链表串接起来。
Redis 列表是简单的字符串列表,按照插入顺序排序。你能够添加一个元素导列表的头部(左边)或者尾部(右边)。
它的底层实际是个链表,
Redis 的列表至关于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操做很是快,时间复杂度为 O(1),可是索引定位很慢,时间复杂度为 O(n)
Redis 的列表结构经常使用来作异步队列使用。将须要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另外一个线程从这个列表中轮询数据进行处理
> rpush books python java golang (integer) 3 \> llen books (integer) 3 \> lpop books "python" \> lpop books "java" \> lpop books "golang" \> lpop books (nil)
> rpush books python java golang (integer) 3 \> rpop books "golang" \> rpop books "java" \> rpop books "python" \> rpop books (nil)
Redis的Set是string类型的无序集合。它是经过HashTable实现的, 至关于 Java 语言里面的 HashSet,它内部的键值对是无序的惟一的。它的内部实现至关于一个特殊的字典,字典中全部的 value 都是一个值NULL
。
Redis zset 和 set 同样也是string类型元素的集合,且不容许重复的成员。不一样的是每一个元素都会关联一个double类型的分数。
redis正是经过分数来为集合中的成员进行从小到大的排序。zset的成员是惟一的,但分数(score)却能够重复。
它相似于 Java 的 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的惟一性,另外一方面它能够给每一个 value 赋予一个 score,表明这个 value 的排序权重。它的内部实现用的是一种叫作「跳跃列表」的数据结构。
redis常见数据类型查阅:
命令 | 用法 | 描述 | 示例 |
---|---|---|---|
DEL | DEL key [key ...] | 删除给定的一个或多个 key。 不存在的 key 会被忽略 | |
DUMP | DUMP key | 序列化给定 key ,并返回被序列化的值,使用 RESTORE 命令能够将这个值反序列化为 Redis 键 | |
EXISTS | EXISTS key | 检查给定 key 是否存在 | |
EXPIRE | EXPIRE key seconds | 为给定 key 设置生存时间,当 key 过时时(生存时间为 0 ),它会被自动删除 | |
PERSIST | PERSIST key | 移除 key 的过时时间,key 将持久保持。 | |
EXPIREAT | EXPIREAT key timestamp | EXPIREAT 的做用和 EXPIRE 相似,都用于为 key 设置生存时间。 不一样在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp) | EXPIREAT cache 1355292000 # 这个 key 将在 2012.12.12 过时 |
KEYS | KEYS pattern | 查找全部符合给定模式 pattern 的 key | KEYS * # 匹配数据库内全部 key |
MOVE | MOVE key db | 将当前数据库的 key 移动到给定的数据库 db 当中若是当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。 所以,也能够利用这一特性,将 MOVE 看成锁(locking)原语(primitive) | MOVE song 1 # 将 song 移动到数据库 1 |
TTL | TTL key | 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)当 key 不存在时,返回 -2 。当 key 存在但没有设置剩余生存时间时,返回 -1 。不然,以秒为单位,返回 key 的剩余生存时间 | |
PTTL | PTTL key | 以毫秒为单位返回 key 的剩余的过时时间。 | |
TYPE | TYPE key | 返回 key 所储存的值的类型 | |
RENAME | RENAME key newkey | 将 key 更名为 newkey 。当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。当 newkey 已经存在时, RENAME 命令将覆盖旧值 |
命令 | 用法 | 描述 | 示例 |
---|---|---|---|
SET | SET key value [EX seconds] [PX milliseconds] [NX|XX] | 将字符串值 value 关联到 key 。若是 key 已经持有其余值, SET 就覆写旧值,无视类型 | SET key "value" |
MSET | MSET key value [key value ...] | 同时设置一个或多个 key-value 对。若是某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,若是这不是你所但愿的效果,请考虑使用 MSETNX 命令:它只会在全部给定 key 都不存在的状况下进行设置操做 | MSET date "2012.3.30" time "11:00 a.m." weather "sunny" |
SETNX | SETNX key value | 将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不作任何动做 SETNX 是『SET if Not eXists』(若是不存在,则 SET)的简写 | |
MSETNX | MSETNX key value [key value ...] | 同时设置一个或多个 key-value 对,当且仅当全部给定 key 都不存在。即便只有一个给定 key 已存在, MSETNX 也会拒绝执行全部给定 key 的设置操做 | |
SETRANGE | SETRANGE key offset value | 用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始。不存在的 key 看成空白字符串处理 | |
SETBIT | SETBIT key offset value | 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit) | GETBIT bit 100 # bit 默认被初始化为 0 |
SETEX | SETEX key seconds value | 将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。若是 key 已经存在, SETEX 命令将覆写旧值。 | |
PSETEX | PSETEX key milliseconds value | 这个命令和 SETEX 命令类似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位 | |
STRLEN | STRLEN key | 返回 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错误 | |
GET | GET key | 返回 key 所关联的字符串值。若是 key 不存在那么返回特殊值 nil | |
MGET | MGET key [key ...] | 返回全部(一个或多个)给定 key 的值。若是给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。所以,该命令永不失败 | |
GETRANGE | GETRANGE key start end | 返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。负数偏移量表示从字符串最后开始计数, -1 表示最后一个字符, -2 表示倒数第二个,以此类推。 | GETRANGE greeting 0 4 |
GETSET | GETSET key value | 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。当 key 存在但不是字符串类型时,返回一个错误。 | |
GETBIT | GETBIT key offset | 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。当 offset 比字符串值的长度大,或者 key 不存在时,返回 0 | |
APPEND | APPEND key value | 若是 key 已经存在而且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。若是 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 同样 | |
DECR | DECR key | 将 key 中储存的数字值减一。若是 key 不存在,那么 key 的值会先被初始化为 0 ,而后再执行 DECR 操做 | redis> SET failure_times 10OK redis> DECR failure_times(integer) 9 |
DECRBY | DECRBY key decrement | 将 key 所储存的值减去减量 decrement | |
INCR | INCR key | 将 key 中储存的数字值增一。若是 key 不存在,那么 key 的值会先被初始化为 0 ,而后再执行 INCR 操做 | |
INCRBY | INCRBY key increment | 将 key 所储存的值加上增量 increment | |
INCRBYFLOAT | INCRBYFLOAT key increment | 为 key 中所储存的值加上浮点数增量 increment | INCRBYFLOAT mykey 0.1 |
BITCOUNT | BITCOUNT key [start] [end] | 计算给定字符串中,被设置为 1 的比特位的数量 | |
BITOP | BITOP operation destkey key [key ...] | 对一个或多个保存二进制位的字符串 key 进行位元操做,并将结果保存到 destkey 上。 |
String命令中包含了一种特殊的操做,直接操做bit,某些特殊场景下,会节省存储空间。能够在存取bool型数据的场景使用,好比存取用户男女比例,用户某一段日期签到记录,
在咱们平时开发过程当中,会有一些 bool 型数据须要存取,好比用户一年的签到记录,签了是 1,没签是 0,要记录 365 天。若是使用普通的 key/value,每一个用户要记录 365 个,当用户上亿的时候,须要的存储空间是惊人的。
为了解决这个问题,Redis 提供了位图数据结构,这样天天的签到记录只占据一个位,365 天就是 365 个位,46 个字节 (一个稍长一点的字符串) 就能够彻底容纳下,这就大大节约了存储空间。
位图不是特殊的数据结构,它的内容其实就是普通的字符串,也就是 byte 数组。咱们可使用普通的 get/set 直接获取和设置整个位图的内容,也可使用位图操做 getbit/setbit 等将 byte 数组当作「位数组」来处理
Redis 的位数组是自动扩展,若是设置了某个偏移位置超出了现有的内容范围,就会自动将位数组进行零扩充。
接下来咱们使用 redis-cli 设置第一个字符,也就是位数组的前 8 位,咱们只须要设置值为 1 的位,如上图所示,h 字符只有 1/2/4 位须要设置,e 字符只有 9/10/13/15 位须要设置。值得注意的是位数组的顺序和字符的位顺序是相反的。
127.0.0.1:6379> setbit s 1 1 (integer) 0 127.0.0.1:6379> setbit s 2 1 (integer) 0 127.0.0.1:6379> setbit s 4 1 (integer) 0 127.0.0.1:6379> setbit s 9 1 (integer) 0 127.0.0.1:6379> setbit s 10 1 (integer) 0 127.0.0.1:6379> setbit s 13 1 (integer) 0 127.0.0.1:6379> setbit s 15 1 (integer) 0 127.0.0.1:6379> get s "he"
上面这个例子能够理解为「零存整取」,一样咱们还也能够「零存零取」,「整存零取」。「零存」就是使用 setbit 对位值进行逐个设置,「整存」就是使用字符串一次性填充全部位数组,覆盖掉旧值。
bitcount和bitop, bitpos,bitfield 都是操做位图的指令。
命令 | 用法 | 描述 | 示例 |
---|---|---|---|
LPUSH | LPUSH key value [value ...] | 将一个或多个值 value 插入到列表 key 的表头若是有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头 | 正着进反着出 |
LPUSHX | LPUSHX key value | 将值 value 插入到列表 key 的表头,当且仅当 key 存在而且是一个列表。和 LPUSH 命令相反,当 key 不存在时, LPUSHX 命令什么也不作 | |
RPUSH | RPUSH key value [value ...] | 将一个或多个值 value 插入到列表 key 的表尾(最右边) | 怎么进怎么出 |
RPUSHX | RPUSHX key value | 将值 value 插入到列表 key 的表尾,当且仅当 key 存在而且是一个列表。和 RPUSH 命令相反,当 key 不存在时, RPUSHX 命令什么也不作。 | |
LPOP | LPOP key | 移除并返回列表 key 的头元素。 | |
BLPOP | BLPOP key [key ...] timeout | 移出并获取列表的第一个元素, 若是列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 | |
RPOP | RPOP key | 移除并返回列表 key 的尾元素。 | |
BRPOP | BRPOP key [key ...] timeout | 移出并获取列表的最后一个元素, 若是列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 | |
BRPOPLPUSH | BRPOPLPUSH source destination timeout | 从列表中弹出一个值,将弹出的元素插入到另一个列表中并返回它; 若是列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 | |
RPOPLPUSH | RPOPLPUSH source destinationb | 命令 RPOPLPUSH 在一个原子时间内,执行如下两个动做:将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。将 source 弹出的元素插入到列表 destination ,做为 destination 列表的的头元素 | RPOPLPUSH list01 list02 |
LSET | LSET key index value | 将列表 key 下标为 index 的元素的值设置为 value | |
LLEN | LLEN key | 返回列表 key 的长度。若是 key 不存在,则 key 被解释为一个空列表,返回 0 .若是 key 不是列表类型,返回一个错误 | |
LINDEX | LINDEX key index | 返回列表 key 中,下标为 index 的元素。下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。至关于 Java 链表的get(int index) 方法,它须要对链表进行遍历,性能随着参数index 增大而变差。 |
|
LRANGE | LRANGE key start stop | 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定 | |
LREM | LREM key count value | 根据参数 count 的值,移除列表中与参数 value 相等的元素 | |
LTRIM | LTRIM key start stop | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间以内的元素都将被删除 | |
LINSERT | LINSERT key BEFORE|AFTER pivot value | 将值 value 插入到列表 key 当中,位于值 pivot 以前或以后。当 pivot 不存在于列表 key 时,不执行任何操做。当 key 不存在时, key 被视为空列表,不执行任何操做。若是 key 不是列表类型,返回一个错误。 | LINSERT list01 before c++ c#(在c++以前加上C#) |
命令 | 用法 | 描述 | 示例 |
---|---|---|---|
HSET | HSET key field value | 将哈希表 key 中的域 field 的值设为 value 。若是 key 不存在,一个新的哈希表被建立并进行 HSET 操做。若是域 field 已经存在于哈希表中,旧值将被覆盖。 | |
HMSET | HMSET key field value [field value ...] | 同时将多个 field-value (域-值)对设置到哈希表 key 中。此命令会覆盖哈希表中已存在的域。 | |
HSETNX | HSETNX key field value | 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。若域 field 已经存在,该操做无效 | |
HGET | HGET key field | 返回哈希表 key 中给定域 field 的值 | |
HMGET | HMGET key field [field ...] | 返回哈希表 key 中,一个或多个给定域的值。 | |
HGETALL | HGETALL key | 返回哈希表 key 中,全部的域和值。在返回值里,紧跟每一个域名(field name)以后是域的值(value),因此返回值的长度是哈希表大小的两倍 | |
HDEL | HDEL key field [field ...] | 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略 | |
HEXISTS | HEXISTS key field | 查看哈希表 key 中,给定域 field 是否存在 | |
HLEN | HLEN key | 返回哈希表 key 中域的数量 | |
HKEYS | HKEYS key | 返回哈希表 key 中的全部域 | |
HVALS | HVALS key | 返回哈希表 key 中全部域的值 | |
HSTRLEN | HSTRLEN key field | 返回哈希表 key 中,与给定域 field 相关联的值的字符串长度(string length)。若是给定的键或者域不存在,那么命令返回 0 | |
HINCRBY | HINCRBY key field increment | 为哈希表 key 中的域 field 的值加上增量 increment | |
HINCRBYFLOAT | HINCRBYFLOAT key field increment | 为哈希表 key 中的域 field 加上浮点数增量 increment | |
HSCAN | HSCAN key cursor [MATCH pattern] [COUNT count] | 迭代哈希表中的键值对。 |
命令 | 用法 | 描述 | 示例 |
---|---|---|---|
SADD | SADD key member [member ...] | 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。假如 key 不存在,则建立一个只包含 member 元素做成员的集合。当 key 不是集合类型时,返回一个错误 | |
SCARD | SCARD key | 返回集合 key 的基数(集合中元素的数量)。 | |
SDIFF | SDIFF key [key ...] | 返回一个集合的所有成员,该集合是全部给定集合之间的差集。不存在的 key 被视为空集。 | 差集 |
SDIFFSTORE | SDIFFSTORE destination key [key ...] | 这个命令的做用和 SDIFF 相似,但它将结果保存到 destination 集合,而不是简单地返回结果集。若是 destination 集合已经存在,则将其覆盖。destination 能够是 key 自己。 | |
SINTER | SINTER key [key ...] | 返回一个集合的所有成员,该集合是全部给定集合的交集。不存在的 key 被视为空集。当给定集合当中有一个空集时,结果也为空集(根据集合运算定律) | 交集 |
SINTERSTORE | SINTERSTORE destination key [key ...] | 这个命令相似于 SINTER 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。若是 destination 集合已经存在,则将其覆盖。destination 能够是 key 自己 | |
SUNION | SUNION key [key ...] | 返回一个集合的所有成员,该集合是全部给定集合的并集。不存在的 key 被视为空集 | 并集 |
SUNIONSTORE | SUNIONSTORE destination key [key ...] | 这个命令相似于 SUNION 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。若是 destination 已经存在,则将其覆盖。destination 能够是 key 自己 | |
SMEMBERS | SMEMBERS key | 返回集合 key 中的全部成员。不存在的 key 被视为空集合 | |
SRANDMEMBER | SRANDMEMBER key [count] | 若是命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素 | |
SISMEMBER | SISMEMBER key member | 判断 member 元素是否集合 key 的成员 | |
SMOVE | SMOVE source destination member | 将 member 元素从 source 集合移动到 destination 集合。 | |
SPOP | SPOP key | 移除并返回集合中的一个随机元素。若是只想获取一个随机元素,但不想该元素从集合中被移除的话,可使用 SRANDMEMBER 命令。 | |
SREM | SREM key member [member ...] | 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。当 key 不是集合类型,返回一个错误 | |
SSCAN | SSCAN key cursor [MATCH pattern] [COUNT count] | 迭代集合中的元素 |
命令 | 用法 | 描述 | 示例 |
---|---|---|---|
ZADD | ZADD key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 | |
ZCARD | ZCARD key | 返回有序集 key 的基数。 | |
ZCOUNT | ZCOUNT key min max | 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。关于参数 min 和 max 的详细使用方法,请参考 ZRANGEBYSCORE 命令。 | |
ZRANGE | ZRANGE key start stop [WITHSCORES] | 返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递增(从小到大)来排序 | |
ZREVRANGE | ZREVRANGE key start stop [WITHSCORES] | 返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递减(从大到小)来排列。具备相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。除了成员按 score 值递减的次序排列这一点外, ZREVRANGE 命令的其余方面和 ZRANGE 命令同样。 | |
ZREVRANGEBYSCORE | ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] | 返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的全部的成员。有序集成员按 score 值递减(从大到小)的次序排列。 | |
ZREVRANK | ZREVRANK key member | 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。排名以 0 为底,也就是说, score 值最大的成员排名为 0 。使用 ZRANK 命令能够得到成员按 score 值递增(从小到大)排列的排名。 | |
ZSCORE | ZSCORE key member | 返回有序集 key 中,成员 member 的 score 值。若是 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。 | |
ZRANGEBYSCORE | ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] | 返回有序集 key 中,全部 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。 | |
ZRANK | ZRANK key member | 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。 | |
ZINCRBY | ZINCRBY key increment member | 为有序集 key 的成员 member 的 score 值加上增量 increment | |
ZREM | ZREM key member [member ...] | 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。当 key 存在但不是有序集类型时,返回一个错误。 | |
ZREMRANGEBYRANK | ZREMRANGEBYRANK key start stop | 移除有序集 key 中,指定排名(rank)区间内的全部成员 | |
ZREMRANGEBYSCORE | ZREMRANGEBYSCORE key min max | 移除有序集 key 中,全部 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。 | |
ZUNIONSTORE | ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] | 计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。默认状况下,结果集中某个成员的 score 值是全部给定集下该成员 score 值之 和 。 | |
ZINTERSTORE | ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] | 计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。默认状况下,结果集中某个成员的 score 值是全部给定集下该成员 score 值之和. | |
ZSCAN | ZSCAN key cursor [MATCH pattern] [COUNT count] | 迭代有序集合中的元素(包括元素成员和元素分值) | |
ZRANGEBYLEX | ZRANGEBYLEX key min max [LIMIT offset count] | 当有序集合的全部成员都具备相同的分值时,有序集合的元素会根据成员的字典序(lexicographical ordering)来进行排序,而这个命令则能够返回给定的有序集合键 key 中,值介于 min 和 max 之间的成员。 | |
ZLEXCOUNT | ZLEXCOUNT key min max | 对于一个全部成员的分值都相同的有序集合键 key 来讲,这个命令会返回该集合中,成员介于 min 和 max 范围内的元素数量。这个命令的 min 参数和 max 参数的意义和 ZRANGEBYLEX 命令的 min 参数和 max 参数的意义同样 | |
ZREMRANGEBYLEX | ZREMRANGEBYLEX key min max | 对于一个全部成员的分值都相同的有序集合键 key 来讲,这个命令会移除该集合中,成员介于 min 和 max 范围内的全部元素。这个命令的 min 参数和 max 参数的意义和 ZRANGEBYLEX 命令的 min 参数和 max 参数的意义同样 |
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
场景:能够用来统计站点的UV...
Redis HyperLogLog 是用来作基数统计的算法,HyperLogLog 的优势是,在输入元素的数量或者体积很是很是大时,计算基数所需的空间老是固定 的、而且是很小的。可是会有偏差。
命令 | 用法 | 描述 |
---|---|---|
pfadd | [PFADD key element [element ...] | 添加指定元素到 HyperLogLog 中 |
pfcount | [PFCOUNT key [key ...] | 返回给定 HyperLogLog 的基数估算值。 |
pfmerge | [PFMERGE destkey sourcekey [sourcekey ...] | 将多个 HyperLogLog 合并为一个 HyperLogLog |
public class JedisTest { public static void main(String[] args) { Jedis jedis = new Jedis(); for (int i = 0; i < 100000; i++) { jedis.pfadd("codehole", "user" + i); } long total = jedis.pfcount("codehole"); System.out.printf("%d %d\n", 100000, total); jedis.close(); } }