以前用Redis,总是理不清头绪,还是系统的学习一遍的好,该部分为学习笔记,后续的部分将按照一定的顺序发布,每个人学习方式不一样,这里遵循原则,先面在点,宏观上对Redis有一个了解,具体的命令可查文档详细看,下一篇整理Redis架构、Redis高可用、Redis集群特性。 Redis 概览简介 开源的内存数据结构存储,数据库,缓存和消息代理.支持的数据结构包括[strins,lists,sets,bitmaps, hyperloglogs(海量计算), geospatial indexes(地理空间索引)],内置replcation特性,Lua脚本,事物,不同种类的磁盘持久化选项,使用Redis Sentinel实现高可用,使用Redis实现自动分区. 可在以下操作实现原子操作[分布式的潜力]appending to string []APPEND a 123-> 如果key存在则追加不存在和创建,返回添加的字节数->strlen 可返回value的长度[STRLEN a]->getrange 可返回value指定的的字符范围[GETRANGE a 0 4] ->setrange用来覆盖已经存在的字符范围[SETRANGE a 2 100];incrementing the value in hash ->push an element tolist ->union -> 联合difference -> 差异getting the memever with higest ranking in a stored set->从排序的集合中获取排名最高的元素优秀的性能表现,工作在内存中,数据可以一次性持久化到硬盘空间中,或者配置将执行的命令都答应到日志中,支持简单的master-slave的异步复制其它特性,事物,发布订阅,Lua scripting,key生存周期,自动故障转移,LRU缓存过期算法支持的语言Redis数据类型 结构化的数据存储服务,支持不同种类的值类型, 二进制的安全的字符串 lists ->string元素的集合,根据插入顺序对元素排序->有点像链表 sets ->未排序的string元素的集合,保证元素的唯一性 sorted sets ->排序的集合->类似与sets,每个string元素有一个关联的浮点数叫做score,元素按照score进行排序,相比sets 有序的集合可以检索一系列的元素[top10,bottom10] hashs ->key-value对组成的存储结构,key\value都是字符串 bit arrays[simpy bitmaps]->比特数组->设置和清除指定的bit位,设置所有字节为1,找到第一个未操作的位 HyperLogLogs ->一个概率数据结构用来估计集合的基数,Redis的Keys key被定义为二进制类型,可以使用任何二进制作为key,空字符串也是有效的key.key的使用准则: 不建议使用很长的字节数据作为key[存储代价+检索代价],如果业务中存在很大key可以SHA1进行哈希. 非常短的key也不是一个好主意. ->推荐的格式->"user:1000:followers” ->找到一个平衡点 使用统一的模式 最大允许的key是512MBRedis String 存储一个key-value对,键值都为二进制,最大大小都限制为512M;支持一下命令 SET,GET,INCR,INCRBY,DECR,DECRBY,GETSET,MSET,MGET 通用命令修改和查询Keys 支持以下通用的命令 EXISTS,TYPE,DELRedis Key过期 Redis支持为每个key设置过期时间, 精确到秒\或者毫秒 过期时间的解析始终是1毫秒 过期的key被复制或者持久化到磁盘,****EXPIRE ->设置过期时间PERSIST ->删除key的过期时间限制SET ->使用SET的扩展参数TTL ->查看KEY的剩余过期时间Redis List Redis List使用链表实现,在链表的头部添加十个和十万个元素的时间是一样的.如果需要快速的访问大量元素的中间部分时候可以考虑使用有序的SET集合LPUSH ->在列表的左边添加元素,RPUSH ->在列表的右边添加一个元素,LRANGE ->从列表中提取一定范围的数据, 索引:-1->最后一个元素,-2->列表的倒数第二项LPOP ->从列表的左边返回并删除一个元素,RPOP ->从列表的右边返回并删除一个元素,常见用例 .记录用户在社交网络上的最近更新博客 .生产-消费模型,使用LPUSH进行生产->RPOP进行消费或者相反->Redis提供了更好的实现限制列表 Redis允许为列表设置一个元素的上限,使得最新的值溢出旧的值LTRIM ->类似于LRANGE,将指定列表范围的元素设置为保留值,所有给定范围之外的元素被移除.阻塞列表操作 Redis列表可用于队列,可作为内部进程通信系统的构建块[阻塞操作];在这之前可以使用轮询的方式实现生产-消费模型, Redis实现了阻塞的列表操作BRPOP ->只有新元素被添加到列表的时候才会返回,或者达到指定的超时时间.BLPOP ->同上 [BLPOP b 10] ->阻塞从列表的左边获取元素10秒超时,可以同时订阅多个列表,1. 客户端是有序的,先等待先获取到2. 由于支持多个列表的等待,返回值是一个两个元素的数组第一个为列表名称,第二个为值.3. 如果超时返回空扩展 RPOPLPUSH\BRPOPLPUSH.键的自动创建和删除 如果向聚合数据类型添加一个元素,如果目标不存在,则在添加元素之前创建空聚合数据类型. 当从聚合数据类型中删除元素,如果值为空则键自动销毁 调用只读命令LLEN 将返回列表的长度,*** 当一个List元素为空时键不在存在!!!!!!Redis Hashs 散列可以很方便的用来描述对象,放入散列的数据量没有限制[可用内存], HMSET ->一次设置多个散列值 HGET ->返回一个散列的值 HMGET ->一次返回多个散列KEY的值Redis Sets 集合是无序的字符串集合, SADD ->向集合添加元素 SMEMBERS ->获取集合的所有元素,变参可用于判定是否集集合的元素 SINTER ->执行不同集合之间的交集 SPOP ->删除一个随机元素并返回 SUNIONSTORE, ->执行集合的合并操作 SCARD. ->返回集合中元素的个数 SRANDMEMBER ->随机返回几个元素而不删除他们,具备返回重复和非重复元素的能力Redis Sorted Sets Reids排序的集合,类似与集合和散列的混合,元素唯一不重复,虽然内部元素无须,但排序集中的每个元素都与一个浮点数值关联 ->Score,每个元素被映射到Score,排序集中的元素是按顺序进行的[不是按请求] 如果A\B的分数不一样如果A的分数大于B的分数则A>B 如果A\B得分相同.按字典顺序比较A和B 排序的集合通过一个双端的数据结构实现,包含一个 Skip List和一个HashTable 添加一个元素的时间复杂度为Log N ZADD ->向有序的集合中添加元素同时指定分数, ZRANGE ->按范围获取有序集合中的元素 ,使用WITHSCORES 选项返回分值 ZREVRANGE ->逆向返回元素范围操作 ZRANGEBYSCORE ->使用积分范围进行查询操作. ZREMRANGEBYSCORE ->按照积分范围来删除元素,返回删除元素的数量 ZREVRANK ->范围元素在排序中的位置,从1开始字典排名 ZRANGEBYLEX -> ZREVRANGEBYLEX -> ZREMRANGEBYLEX -> ZLEXCOUNT. ->Redis Bitmaps 非实际的数据类型二是一个定义在字符串删的针对于bit的操作,最大长度2^32个位,每个位有0或者1,存储信息时候提供极端的存储空间 SETBIT -> 将指定bitmap的位置设置为0或者1 GETBIT -> 获取指定bitmap指定位置的状态,超出范围被认为是0 BITOP -> 在不同的字符串之间执行bit操作[AND,OR,XOR,NOT] BITCOUNT ->统计被设置为1的位的个数 BITPOS ->返回第一个为0或者1的位常见用例 .所有类型的实时分析 .存储空间有效,性能要求高的布尔信息,和对象的id相关联 .对于一个很大的bigmap可以使用分割HyperLogLogs 概率数据结构,用来估算一个集合的基数,传统的计数需要考虑元素是否重复等特性算法使用的内存数与计数的量成正比,Redis提供了一种算法集合提供准确的内存交换,以一个标准错误估计方法的结束,Redis实现中错误率低于1%,算法的优势在于不在需要使用的内存量与所计算的条目的数量成正比,而是可以使用固定数量的内存.最坏的情况下12K,或者更少如果HyperLogLogs [HLLs ]有更少的元素. 在Redis 中HLLS是一种不同的数据结构,被编码为一个Redis字符串,可以调用GET来获取一个序列化的HLL,使用SET序列化回服务器. 概念上来说HLLS就像是使用集合来完成相同的任务, 数据结构仅仅包含是否包含元素的状态,并不包含实际的数据. 每次看到新元素使用PFADD加入计数 每次想要检索使用PFADD添加的元素的近似值时,使用PFCOUNTpfadd hll a b c dpfcount hll用例 每天在搜索表单中计算用户执行的特殊查询的次数OTHERS 使用合理的方式迭代大型key空间 使用Lua 脚本实现改善延迟和带宽 Redis也是一个发布订阅系统