String首先,Redis的数据存储会以key-value的形式存储,所有的key都是string类型。这里所说的类型特指值存储的类型。下面提到的hash和list都是根据value来解释的。Redis会根据传入的字符串类型的规则进行判断,采用相应的内部编码进行存储。numeric类型会编码存储为8字节长整型,小于等于39字节的字符串会使用emstr编码存储,大于39字节的字符串会使用raw编码存储。查看key对应的value的存储类型,执行objectencodingk1命令。?常用写命令1//1.setkey:k1valuev12setk1v13//2.与前面的setk1v1命令一致,k1的过期时间为10s4setk1v1ex10nx(仅当k1不存在设置成功)或setk1v1ex10xx(设置k1存在设置成功)5**k1不存在设置成功另一种写法6setnxk1v17**k1过期时间另一种写法8setexk110v19//3.批量设置key值10msetk1v1k2v2k3v311//4.对k1中的值进行自增操作,如果k1中的值类型不是数值类型,报错返回,如果key不存在,k1会根据初始值0自动递增12incrk113//5.k1中的值会自动递增2的长度。14incrbyk12?一般usedreadcommands1//1.获取keyk1的值2getk13//2.批量获取k1,k2,k3的值4mgetk1k2k3k4注:一般我们使用key的业务名:对象名:以属性名的形式命名。HashHash类型的值在Redis中以{{key,value},{key,value}}的形式存储。我们用character和hash类型的存储模型图来更直观的理解它们之间的关系。关系如图1-1图1-1Redis根据哈希类型的个数(对应图中的字段个数),将哈希类型存储在不同的编码中。如果hash类型个数小于hash-max-ziplist-entries(默认512)且所有值的存储大小(对应图中的值)小于hash-max-ziplist-value(默认64bytes),则使用更紧凑的ziplist编码进行存储。当不能满足ziplist条件时,会使用hashtable编码进行存储。因为ziplist在节省内存方面比hashtable要好,但是如果数据量上来,检索效率是不如hashtable的。?常用写命令1//1.增加一对field:valuetoregister:user:12hsetregister:user:1namezhangmj3//2。register:user:1field(age)4hincrbyregister:user:1age25//3的值加2。批量设置register:user:1的多个field-values6hmsetregister:user:1name'zhangmoujiang'age127//4.删除nameofregister:user:18hdelregister:user:1name?常用读命令1//1.获取nameregister:user:1的值2hgetregister:user:1name3//2.获取批量获取register:user:1多个字段的值4hmgetregister:user:1nameage5//3.获取所有字段对应的register:user:16hkeysregister:user:17//4.获取register:user:1对应所有字段值8hvalsregister:user:19//5.获取register:user:1所有字段和value10hgetallregister:user:1Redis中list类型的存储模型如图图1-2:图1-2中list类型中取值最大的存储元素为2^32-1,可以重复。value元素的内部编码会根据元素的个数和大小,采用ziplist和linkedlist两种编码方式存储。当value元素个数小于list-max-ziplist-entries(默认512),且value中每个元素的大小小于list-max-ziplist-value(64字节)时,将使用ziplist进行编码.当不能满足ziplist的条件时,会使用链表编码。Ziplist编码压缩数据以减少内存,而linkedlist使用链表数据结构来存储数据。据说在Redis3.2版本之后,提供了更合理的内部编码quicklist,结合了ziplist和linkedlist的优点。?常用的书写命令从左到右标有这个图标,方便书写:??,从右到左标有这个图标??,列表指的是user:1:message1//1。??插入元素2rpush到列表user:1:message'piaoliang''handsome'3//2。??将元素4lpush插入列表user:1:message'xx1''xx2'5//3。在元素xx2之前插入xx1.56linsertuser:1:messagebefore'xx2''xx1.5'7//4。Insertxx3afterelementxx28linsertuser:1:messageafter'xx2''xx3'9//5.从列表左侧弹出元素10lpopuser:1:message11//6。从列表右侧弹出元素12rpopuser:1:message13//7。从左侧弹出元素,如果列表不为空则立即弹出,如果列表为空则阻塞3s返回。该命令的基本格式为:blpopkey[key]timeout,如果超时设置为0且列表为空,客户端将阻塞并等待直到运行该命令。如果设置了多个key,只要key列表中有元素,就会立即返回14blpopuser:1:message315//8。同brpop,但是元素从右边弹出16brpopuser:1:message3171819//9。从左到右删除列表中等于xx2的2个元素20//这条命令的基本格式是:lremkeycountvlaue21//其中count>0将从左到右删除count个等于value的元素22//count<0会从右往左删除count个等于value的元素23//count=0会删除list中所有等于value的元素24lremuser:1:message2xx225//10.保留list中第二个元素和第4个元素元素,删除所有其他26ltrimuser:1:message1327//11.将列表中的第一个元素更改为xxx028lsetuser:1:message0xxx0Commonreadcommand1//1。??获取第一和第二个元素。2lrangeuser:1:message013//2.??获取第一个和第二个元素4//假设列表元素为g,f,h,k,则获取h,k的元素5lrangeuser:1:message-1-26//3.获取列表右起第一个元素7lindexuser:1:message-18//4。获取user:1:message列表元素的长度9llenuser:1:message10//其中??列表元素索引下标[0,N-1],??列表元素索引下标:[-1,-N]N为数列表元素的使用?应用场景通过lpush+brpop命令实现消息队列。每个用户都有自己的文章列表,需要分页展示每个用户的文章列表。Set集合类型的元素可以重复,集合类型的存储模型图如图1-3所示:图1-3集合类型有两种内部编码:intset,当集合类型为an时整数且数量小于set-max-inset-entries(默认512),将采用这种编码方式。当不能满足intset编码条件时,会采用hashtable。常用写命令1//1.添加tag1和tag2元素2sadduser:1tag1tag23//2.删除tag2元素,返回删除成功的个数4sremuser:1tag25//3.从中随机弹出一个元素thecollection/从集合中随机弹出n个元素6spopuser:17//4.弹出集合[user:1]与[user:2]交集的结果存入destination8sinterstoredestinationuser:1user:29//5.set[user:1]和set[user:2]的并集结果存储在destination10sunionstoredestinationuser:1user:211//6.set[user:的差值结果1]和集合[user:2]存储在destination12sdiffstoredestinationuser:1user:2?常用读命令1//1.计算元素个数2scarduser:13//2.是否有tag3集合中的元素4sismemberuser:1tag35//3.从集合中随机返回一个元素/从集合中随机返回2个元素6srandmemberuser:1/srandmemberuser:127//4.获取集合中的所有元素in,返回的结果是无序的8smembersuser:1910//5.求集合[user:1]和集合[user:2]的交集11sinteruser:1user:212//6.求集合的unionof[user:1]andtheset[user:2]13sunionuser:1user:214//7.求set之间的不同点,即:user:2的集合的元素不在user:115sdiffuser:2user:1注意:当集合中的元素过多时,使用smembers命令会损害性能。推荐使用sscan命令完成有序集合的存储模型有序集合类型如图1-4所示:图1-4可以类比集合类型和哈希类型的组合,其中value包含两个主要字段score和member,并且member中的元素的值不能重复,score中元素的类型是可以重复的整数值。我们可以根据score中元素的值对member中的元素进行排序。内部也使用了两种编码:ziplist(压缩列表)skiplist(跳过列表)?写操作命令1//1.添加集合成员,(85,zmj)2zaddusers85zmj3//2.添加集合成员,existOnly设置成功后4zaddusersXX87zhangmoujiang5//3.添加一个集合成员,只有不存在才设置成功6zaddusersNX87zhangmoujiang7//4.删除集合中的成员caonimei8zremuserscaonimei9//5.给会员加1xunini10zincrbyusers1xuxnini?读取操作命令1//1.获取集合中的成员数量2zcardusers3//2.获取集合中zmj成员的分数4zscoreuserszmj5//3.获取chenxiongshun内会员评分setRanking(分数从低到高)6zrankuserschenxiongshun7//4.同zrank(分数从高到低)8zrevrankuserschenxiongshun9//5.返回指定rank范围内的成员(分数从低到高)10zrangeusers02[withscores]11//6.同zrange(分数从高到低)12zrevrangeusers01[withscores]13//7.按照指定分数从低到高返回成员14//基本格式zrangebyscorekeyminmax[withscores][limitoffsetcount]15zrangebyscoreusers509016//8.返回指定分数范围内的成员数17zcountusers0100几个管理密钥的常用命令1//1。当前数据库Numberofkeys2dbsize3//2。随机返回当前数据的一个key4randomkey5//3。将key1设置为20秒后过期。如果key不存在,返回结果为0。如果key设置了过期时间,执行set命令后,key的过期时间会被清除。6使密钥1过期207//4。检查key1还剩多少秒,返回的数字以秒为单位。返回-2表示8ttlkey19//5已过期。去掉keykey110persisitkey111//6的过期时间。获取所有key,key后面可以跟正则表达式来匹配key的名字12keys*13//7.选择数据库0,redis默认有16个数据库,编号从0...14开始选择015//8。清除当前数据库数据16flushdb17//9.清除所有数据库数据18flushall
