Redis整合综述_第1页
Redis整合综述_第2页
Redis整合综述_第3页
Redis整合综述_第4页
Redis整合综述_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Part 1Redis基础快速安装指南在 Debian Linux 或者 Ubuntu Linux 上面安装 Redis 的方法在 OS X 上面安装 Redis 的方法Redis,你好!Redis官网下载Linux 上面安装 Redis 的方法使用apt-get install redis-server命令安装Redis使用apt-get install redis-server命令安装Redis这种安装方法可能会安装到旧版的Redis;举个例子,在Ubuntu10.4上面执行上述命令,只会将2010年3月发布的Redis1.2.6安装到系统上面,不推荐。使用源码编译并安装Redis使用源码

2、编译并安装Redis获取并安装make等构件工具apt-get updateapt-get install make gcc从Redis官网下载最新版本的Redis源码wget http:/download.redis.io/releases/redis-3.2.5.tar.gz解压源码,编译,安装并启动Redistar -xzf redis-3.2.5.tar.gzcd redis-3.2.5makemake installsrc/redis-server在 OS X 上面安装 Redis 的方法使用Rudix工具直接以预编译二进制的形式安装软件下载用户安装Rudix的引导脚本curl O

3、http:/ rudix.py install rudix命令Rudix安装Redisrudix install redis启动Redis服务器redis-serverRedis,你好!redis-cliset hello worldOKget hello“world”del hello(integer) 1get hello(nil)Redis简介Redis是一个速度非常快的远程内存非关系型数据库Redis提供了存储键与5种不同类型的数据结构(key-value之间的映射)Redis通过复制,持久化和客户端分片等特性,用户可以很方便的将Redis扩展成一个能够包含数百GB数据、每秒处理上百万

4、次请求的系统Redis与其他数据库和软件的对比Redis使用内存存储的非关系数据库字符串、列表、集合、散列表、有序集合每种数据类型都有自己的专属命令,另外还有批量操作和不完全的事务支持发布与订阅,主从复制,持久化,脚本存储过程memcached使用内存存储的键值缓存键值之间的映射创建命令、读取命令、更新命令、删除命令以及其他几个命令为提升性能而设的多线程服务MySQL关系数据库每个数据库可以包含多个表,每个表可以包含多个行;可以处理多个表的视图;支持空间和第三方扩展SELECT、INSERT、UPDATE、DELETE、函数、存储过程支持ACID性质(InnoDB),主从复制和主主复制Post

5、greSQL关系数据库每个数据库可以包含多个表,每个表可以包含多个行;可以处理多个表的视图;支持空间和第三方扩展;支持可定制类型SELECT、INSERT、UPDATE、DELETE、内置函数,自定义存储过程支持ACID性质,主从复制,由第三方支持的多主复制MongoDB使用硬盘存储的非关系文档存储每个数据库都可以包含多个表,每个表可以包含多个无schema的BSON文档创建命令、读取命令、更新命令、删除命令、条件查询命令等支持map-reduce操作,支持主从复制,分片,空间索引为什么使用Redis有memcached使用经验的读者可能知道,用户只能用APPEND命令将数据添加到已有字符串的

6、末尾。memcached的文档中声明,可以用APPEND命令来管理元素列表。这很好!用户可以将元素追加到一个字符串的末尾,并将那个字符串当作列表来使用。但随后如何删除这些元素呢?memcached采用的办法是通过黑名单(blacklist)来隐藏列表里面的元素,从而避免对元素执行读取、更新、写入(包括在一次数据库查询之后执行的memcached写入)等操作。相反地,Redis的LIST和SET允许用户直接添加或者删除元素。使用使用Redis而不是而不是memcached来解决问题,不仅可以让代码变得更简短、更易懂、更易维护,而且还来解决问题,不仅可以让代码变得更简短、更易懂、更易维护,而且还可

7、以使代码的运行速度更快(因为用户不需要通过读取数据库来更新数据)。除此之外,在其他许多情况下,可以使代码的运行速度更快(因为用户不需要通过读取数据库来更新数据)。除此之外,在其他许多情况下,Redis的效率和易用性也比关系数据库要好得多。的效率和易用性也比关系数据库要好得多。数据库的一个常见用法是存储长期的报告数据,并将这些报告数据用作固定时间范围内的聚合数据(aggregates)。收集聚合数据的常见做法是:先将各个行插入一个报告表里面,之后再通过扫描这些行来收集聚合数据,并根据收集到的聚合数据来更新聚合表中已有的那些行。之所以使用插入行的方式来存储,是因为对于大部分数据库来说,插入行操作的

8、执行速度非常快(插入行只会在硬盘文件末尾进行写入)。不过,对表里面的行进行更新却是一个速度相当慢的操作,因为这种更新除了会引起一次随机读(random read)之外,还可能会引起一次随机写(random write)。而在Redis里面,用户可以直接使用原子的(atomic)INCR命令及其变种来计算聚合数据,并且因为Redis将数据存储在内存里面,而且发送给Redis的命令请求并不需要经过典型的查询分析器(parser)或者查询优化器(optimizer)进行处理,所以对Redis存储的数据执行随机写的速度总是非常迅速的。使用 Redis 而不是关系数据库或者其他硬盘存储数据库,可以避免写

9、入不必要的临时数据,也免去了对临时数据进行扫描或者删除的麻烦,并最终改善程序的性能。Redis数据结构简介结构类型结构类型结构存储值结构存储值STRING字符串可以是字符串、整数或浮点数LIST列表一个链表,链表上的每个节点都包含 一个字符串SET集合包含字符串的无序收集器,被包含的每个字符串都是唯一的HASH散列包含键值对的无序散列表ZSET有序集合字符串成员与浮点数分值之间的有序映射,元素排列顺序由分值的大小决定Redis命令部分Redis命令对于5种结构都是通用的DEL、TYPE、RENAME完整的Redis命令列表http:/redis.io/commandsRedis中的字符串命令命

10、令行为行为GET获取存储在给定键中的值SET设置存储在给定键中的值DEL删除存储在给定键中的值Redis中的字符串命令命令行为行为INCRINCR key-name 将键存储的值加1DECRDECR key-name 将键存储的值减1INCRBYINCRBY key-name amount 将键存储的值加上整数amountDECRBYDECRBY key-name amount 将键存储的值减去整数amountINCRBYFLOATINCRBYFLOAT key-name amount 将键存储的值加上浮点数amountRedis中的自增命令和自减命令Redis中的字符串命令命令行为行为APP

11、ENDAPPEND key-name value 将值value追加到给定键key-name当前存储的值的末尾GETRANGEGETRANGE key-name start end 获取一个由偏移量start至偏移量end范围内所有字符组成的子串,包括start和end在内SETRANGESETRANGE key-name offset value 将从start偏移量开始的字串设置为给定值GETBITGETBIT key-name offset 将字符串看作是二进制位串,并返回位串中偏移量为offset的二进制位的值SETBITGETBIT key-name offset value 将字符

12、串看作是二进制位串,并将位串中偏移量为offset的二进制位的值设置为value处理子串和二进制位的命令Redis中的字符串命令命令行为行为BITCOUNTBITCOUNT key-name start end 统计二进制位串里面值为1的二进制位的数量,如果给定了可选的start偏移量和end偏移量,那么只对偏移量指定范围内的二进制位进行统计BITOPBITOP operation dest-key key-name key-name 对一个或多个二进制位串执行包括并(AND)、或(OR)、异或(XOR)、非(NOT)在内的任意一种按位运算操作,并将计算得出的结果保存在dest-key键里面处

13、理二进制位的命令Redis中的列表命令命令行为行为RPUSH将给定值推入列表的右端LPUSH将给定值推入列表的左端LRANGE获取列表在给定范围上的所有值LINDEX获取列表在给定位置上的单个元素LTRIM保留列表在给定范围上的所有值,包含起止偏移量元素RPOP从列表的右端弹出一个值,并返回被弹出的值LPOP从列表的左端弹出一个值,并返回被弹出的值Redis中的列表命令命令行为行为BLPOPblpop key key . timeout 从第一个非空列表中弹出位于最左端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现BRPOPbrpop key key . timeout从第一个非

14、空列表中弹出位于最右端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现RPOPLPUSHrpoplpush source destination 从source列表中弹出位于最右端的元素,然后将这个元素推入destination列表的最左端,并向用户返回这个元素BRPOPLPUSHbrpoplpush source destination timeout从source列表中弹出位于最右端的元素,然后将这个元素推入destination列表的最左端,并向用户返回这个元素;如果source为空,那么在timeout秒内阻塞并等待可弹出的元素出现阻塞式的列表弹出命令以及在列表之间移动元素

15、的命令,常见的用例就是消息传递和任务队列Redis中的集合命令命令行为行为SADD将给定元素添加到集合SMEMBERS返回集合包含的所有元素SISMEMBER检查给定元素释放存在于集合中SREM如果给定的元素存在于集合中,那么移除这个元素Redis中的集合命令命令行为行为SREMSREM key member member . 从集合里面移除一个或多个元素,并返回被移除元素的数量SCARDSCARD key 返回集合包含的元素的数量SRANDMEMBERSRANDMEMBER key count 从集合里面随机的返回一个或多个元素。当count为正数时,命令返回的随机元素不会重复;当count

16、为负数时,命令返回的随机元素可能会出现重复SPOPSPOP key count 随机地移除集合中的一个元素,并返回被移除的元素SMOVESMOVE source destination member 如果集合source包含元素member,那么从集合里面移除元素,并将改元素添加到集合destination中;如果member被成功移除,那么命令返回1,否则返回0Redis中的集合SDIFFSDIFF key key .返回那些粗在于第一个集合、但不存在于其他集合中的元素(差集)SDIFFSTORESDIFFSTORE destination key key .将差集存储到destinatio

17、n里面SINTERSINTER key key .返回那些同时存在于所有集合中的元素(交集)SINTERSTORESINTERSTORE destination key key .将交集存储到destination里面SUNIONSUNION key key .返回那些至少存在于一个集合中的元素(并集)SUNIONSTORESUNIONSTORE destination key key .将并集存储到destination里面用于组合和处理多个集合的Redis命令Redis中的散列命令命令行为行为HSET在散列里面关联起给定的键值对HGET获取指定散列键的值HGETALL获取散列包含的所有键值

18、对HDEL如果给定键存在于散列里面,那么移除这个键HMGET获取一个或多个散列键的值HMSET为散列里面的一个或多个键赋值HLEN返回散列包含的键值对数量Redis中的散列命令命令行为行为HEXISTSHEXISTS key field检查给定键是否存在于散列中HKEYSHKEYS key获取散列包含的所有键HVALSHVALS key获取散列包含的所有值HGETALLHGETALL key获取散列包含的所有键值对HINCRBYHINCRBY key field increment将键field存储的值加上整数incrementHINCRBYFLOATHINCRBYFLOAT key fiel

19、d increment将键field存储的值加上浮点数incrementRedis中的有序集合命令命令行为行为ZADDZADD key NX|XX CH INCR score member score member .将一个带有给定分值的成员添加到有序集合里面ZRANGEZRANGE key start stop WITHSCORES根据元素在有序排列中所处的位置,从有序集合里面获取多个元素ZRANGEBYSCOREZRANGEBYSCORE key min max WITHSCORES LIMIT offset count获取有序集合在给定分值范围内的所有元素ZREMZREM key mem

20、ber member .如果给定成员存在于有序集合,那么移除这个成员Redis中的有序集合命令命令行为行为ZCARDZCARD key返回有序集合包含的成员数量ZINCRBYZINCRBY key increment member将member成员的分值加上incrementZCOUNTZCOUNT key min max返回分值介于min和max之间的成员数量ZRANKZRANK key member返回成员member在有序集合中的排名ZSCOREZSCORE key member返回成员member的分值Redis中的有序集合命令命令行为行为ZREVRANKZREVRANK key me

21、mber返回有序集合里成员member的排名,成员按照分值从大到小排列ZREVRANGEZREVRANGE key start stop WITHSCORES返回有序集合给定排名范围内的成员,成员按照分值从大到小排列ZRANGEBYSCOREZRANGEBYSCORE key min max WITHSCORES LIMIT offset count返回有序集合中分值介于min和max之间的所有成员ZREVRANGEBYSCOREZREVRANGEBYSCORE key max min WITHSCORES LIMIT offset count获取有序集合中分值介于min和max之间的所有成员

22、,并按照分值从大到小的顺序来返回它们有序集合的范围型数据获取命令Redis中的有序集合ZREMRANGEBYRANKZREMRANGEBYRANK key start stop移除有序集合中排名介于start和stop之间的成员ZREMRANGEBYSCOREZREMRANGEBYSCORE key min max移除有序集合中分值介于min和max之间的成员ZINTERSTOREZINTERSTORE destination numkeys key key . WEIGHTS weight AGGREGATE SUM|MIN|MAX对给定的有序集合执行类似于集合的交集运算ZUNIONSTOR

23、EZUNIONSTORE destination numkeys key key . WEIGHTS weight AGGREGATE SUM|MIN|MAX对给定的有序集合执行类似于集合的并集运算范围性数据删除命令,以及并集命令和交集命令SORT命令命令命令行为行为SORTSORT source-key BY pattern LIMIT offset count GET pattern GET pattern ASC|DESC ALPHA STORE dest-key 根据给定的选项,对输入的列表、集合或者有序集合进行排序,然后返回或者存储排序的结果sort命令可以同时处理字符串、集合、列表

24、和散列MULTI命令和EXEC命令用于实现基本事务特性这两个命令可以让用户将多个命令当做一个命令来执行自动过期命令命令命令行为行为PERSISTPERSIST key 移除键的过期时间TTLTTL key 查看给定键距离过期还有多少秒EXPIREEXPIRE key seconds让给定键在指定的秒数之后过期EXPIREATEXPIREAT key timestamp将给定键的过期时间设置为给定的UNIX时间戳PTTLPTTL key查看给定键距离过期时间还有多少毫秒PEXPIREPEXPIRE key milliseconds让给定键在指定的毫秒数之后过期PEXPIREATPEXPIREAT

25、 key milliseconds-timestamp将一个毫秒级精度的UNIX时间戳设置为给定键的过期时间自动删除无用数据Redis客户端Redis客户端连接public class Redis /private final JedisSentinelPool pool; private final JedisPool pool; public Redis() JedisPoolConfig config = new JedisPoolConfig(); /最大空闲连接数, 默认8个 config.setMaxIdle(8); /最大连接数, 默认8个 config.setMaxTotal(

26、8); /获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1 config.setMaxWaitMillis(-1); /逐出连接的最小空闲时间 默认1800000毫秒(30分钟) config.setMinEvictableIdleTimeMillis(1800000); /最小空闲连接数, 默认0 config.setMinIdle(0); this.pool = new JedisPool(config, localhost); public void testJedis() try (Jedis

27、jedis = pool.getResource() jedis.set(hello, wolrd); jedis.get(hello); Part 2Redis数据结构Redis 底层结构字符键哈希键集合键有序集合键列表键链表raw字典跳跃表整数集合压缩列表embstrlongsds-字符结构struct sdshdr int len; int free; char buf;优点:计算长度时间复杂度为o(1)避免缓存溢出减少修改字符串的内存分配链表链表Redis 列表键底层实现之一typedef struct listNode struct listNode *prev; struct li

28、stNode *next; void *value; listNode;typedef struct list listNode *head; listNode *tail; void *(*dup)(void *ptr); void (*free)(void *ptr); int (*match)(void *ptr, void *key); unsigned int len; list;字典dict字典是哈希键和集合键的底层实现之一使用场景:当数据量比较大的时候本质:哈希表查找效率O(1)难点:Rehash字典空字典哈希节点Rehash字典重新分配空间触发条件:1) 服务器目前没有执行BG

29、SAVE或BGREWRITEAOF,并且哈希表的负载因子大于12) 服务器目前正在执行BGSAVE或BGREWRITEAOF,并且哈希表的负载因子大于5负载因子 uesd / size Rehash startRehash processingRehash end跳跃表优点查找效率接近二叉平衡术构造简单:二叉平衡术,红黑树Redis跳跃表跳跃表原理跳跃表层次分配算法简单实现:二项分布算法特点:节点较少容易出现不均匀分布情况,节点越多,分布越趋于稳定构建一个简单的跳跃表看一看redis怎么实现跳跃表整数集合intset整数集合是集合键的底层实现当一个集合中的元素都为整数时,redis使用整数集合

30、作为集合键的底层实现整数集合的数据结构typedef struct intset uint32_t encoding; uint32_t length; int8_t contents; intset;升级整数集合默认采用int_16的数据类型,当插入的数大约int_8的范围时候,采取升级策略,最高支持int_64降级关于降级,不支持一些关键点intset使用数组(contents)来存储数据,数据按照由小到大的顺序存储,体现在intsetSearch这个函数的二分查找方法中。当插入新元素时,首先判断encoding是否小于当前值,否则调用intsetUpgradeAndAdd函数,将原来in

31、tset中的数据都变成新的encoding,同时把新元素插入到set。在执行intsetAdd和intsetRemove函数增删元素的时候,都要调用intsetResize增加或者减少空间,同时按照顺序插入或者删除元素。在移动元素时,使用intsetMoveTail,内部通过memmove实现。压缩列表压缩列表是列表键、哈希键、以及有序集合的底层实现当列表键和哈希键都包含较少项,并且要么是较小整数要么是较短字符串,redis就会使用压缩列表作为底层实现属性属性类型类型长度长度zlbytesunit32_t4字节zltailunit32_t4字节zllenunit16_t2字节entryX列表节

32、点结构不定zllenunit8_t1字节Redis 底层结构字符键哈希键集合键有序集合键列表键链表raw字典跳跃表整数集合压缩列表embstrlongPart 3Redis数据库单机数据库redisServerdb.dbnum(16)db0db1db2db15redisClientdb数据库键空间rootcodis-server # redis-cli -h -p 9000:9000 SELECT 2(error) ERR invalid DB index, only accept DB 0:9000 SELECT 0OK数据

33、库键空间:9000 set message hello worldOK:9000 rpush alphabet a b c(integer) 3:9000 hset book name Redis is good(integer) 1:9000 hset book author Josiah L. Carlson(integer) 1数据库键空间redisDbdictdictStringObject“alphabet”StringObject“book”StringObject“message”ListOb

34、jectStringObject“a”StringObject“b”StringObject“c”HashObjectStringObject“name”StringObject“author”StringObjcet“Redis is good”StringObjcet“Josiah L. Carlson”StringObjcet“hello world”数据库键空间:9000 hget book authorJosiah L. Carlson:9000 get messagehello world:9000 lrange alphabet 0 -11) a2) b3) c过期键删除策略定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作。惰性删除:放任过期键不管,但是每次从键空间内获取键时都检查取

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论