NoSQL开发中或多或少都会用到,也是面试必问知识点。
最近这几天的面试每一场都问到了,但是感觉回答的并不好,还有很多需要梳理的知识点,这里通过几篇Redis笔记整个梳理一遍。
Redis的八大数据类型
Redis-key
用微课学Java开发基础唐亮王洋编达内教育学习Java开发基础教程书籍京东查看已下架.0.0.1:keys*(emptylistorset).0.0.1:setnamexxxOK.0.0.1:keys*1)name.0.0.1:setage1OK.0.0.1:keys*1)age2)name.0.0.1:existsname#判断key是否存在(integer)1.0.0.1:existsname1(integer)0.0.0.1:movename1(integer)1.0.0.1:keys*1)age.0.0.1:setnameyyyOK.0.0.1:expirename10#设置key的过期时间,单位是秒(integer)1.0.0.1:ttlname#查看当前key的剩余过期时间(integer)7.0.0.1:ttlname(integer)-2.0.0.1:typeage#查看当前key的类型string.0.0.1:
Redis有以下8种数据类型
1、String(字符串)
.0.0.1:setkey1v1#设置值OK.0.0.1:getkey1v1.0.0.1:appendkey1hello#追加值,如果不存在,相当于setkey(integer)7.0.0.1:getkey1v1hello.0.0.1:strlenkey1#获取字符串长度(integer)7.0.0.1:
自增、自减
.0.0.1:setviews0OK.0.0.1:getviews0.0.0.1:incrviews#自增1(integer)1.0.0.1:getviews1.0.0.1:decrviews#自减1(integer)0.0.0.1:decrviews(integer)-1.0.0.1:getviews-1.0.0.1:incrbyviews10#设置步长、自增10(integer)9.0.0.1:decrbyviews5#设置步长、自减5(integer)4
字符串范围
.0.0.1:setkey1hello,world!OK.0.0.1:getkey1hello,world!.0.0.1:getrangekey#截取字符串\[0,3\]hell.0.0.1:getrangekey10-1#获取全部的字符串,和getkey一样hello,world!.0.0.1:
替换:
.0.0.1:setkey2abcdefgOK.0.0.1:getkey2abcdefg.0.0.1:setrangekey21xx(integer)7.0.0.1:getkey2axxdefg.0.0.1:
setex(setwithexpire)
:设置过期时间
和
setnx(setifnotexist)
:不存在再设置(在分布式锁中会经常使用)
.0.0.1:setexkeyhello#设置30秒后过期OK.0.0.1:ttlkey3#剩余过期时间(integer)25.0.0.1:setnxmykeyredis#mykey不存在时设置成功(integer)1.0.0.1:keys*1)key22)key13)views4)mykey.0.0.1:setnxmykeymongoDB#mykey存在时设置失败(integer)0.0.0.1:getmykey#mykey值不变redis.0.0.1:
mset
和
mget
.0.0.1:msetk1v1k2v2k3v3#同时设置多个值OK.0.0.1:keys*1)k12)k33)k2.0.0.1:mgetk1k2k3#同时获取多个值1)v12)v23)v3.0.0.1:msetnxk1v1k4v4#msetnx是一个原子性的操作,要么一起成功,要么都失败(integer)0.0.0.1:getk4(nil).0.0.1:
对象
setuser:1{name:zhangsan,age:3}#设置一个user:1对象值为json字符来保存一个对象.0.0.1:msetuser:1:namezhangsanuser:1:age2OK.0.0.1:mgetuser:1:nameuser:1:age1)zhangsan2)2.0.0.1:
getset
:先get再set
.0.0.1:getsetdbredis#如果不存在值,则返回nil(nil).0.0.1:getdbredis.0.0.1:getsetdbmongodb#如果存在值,获取原来的值,并设置新的值redis.0.0.1:getdbmongodb.0.0.1:
String的使用场景:value除了是字符串以外还可以是数字
计数器统计多单位的数量粉丝数对象缓存存储2、List(列表)
基本的数据类型,列表。
在Redis中可以把list用作栈、队列、阻塞队列。
list命令多数以
l
开头。
.0.0.1:lpushlistone#将一个值或者多个值,插入到列表的头部(左)(integer)1.0.0.1:lpushlisttwo(integer)2.0.0.1:lpushlistthree(integer)3.0.0.1:lrangelist0-1#查看全部元素1)three2)two3)one.0.0.1:lrangelist01#通过区间获取值1)three2)two.0.0.1:rpushlistright#将一个值或者多个值,插入到列表的尾部(右)(integer)4.0.0.1:lrangelist0-11)three2)two3)one4)right.0.0.1:
弹出pop
.0.0.1:lrangelist0-11)!2)world3)world4)hello.0.0.1:lpoplist#移除list的第一个元素!.0.0.1:lrangelist0-11)world2)world3)hello.0.0.1:rpoplist#移除list的第一个元素hello.0.0.1:lrangelist0-11)world2)world.0.0.1:
索引Lindex
.0.0.1:lrangelist0-11)hjk2)world3)world.0.0.1:lindexlist1#通过下标获取list中的某一个值world.0.0.1:lindexlist0hjk.0.0.1:
Llen长度:
.0.0.1:llenlist(integer)3.0.0.1:
移除指定的值:
.0.0.1:lrangelist0-11)hjk2)world3)world.0.0.1:lremlist1world#移除list集合中指定个数的value,精确匹配(integer)1.0.0.1:lrangelist0-11)hjk2)world.0.0.1:lpushlisthjk(integer)3.0.0.1:lrangelist0-11)hjk2)hjk3)world.0.0.1:lremlist2hjk(integer)2.0.0.1:lrangelist0-11)world.0.0.1:
trim截断
.0.0.1:lrangemylist0-11)hello12)hello23)hello34)hello4.0.0.1:ltrimmylist12#通过下标截取指定长度,这个list已经被破坏了,截断之后只剩下截断后的元素OK.0.0.1:lrangemylist0-11)hello22)hello3.0.0.1:
rpoplpush:移除列表的最后一个元素,将他移动到新的列表中。
.0.0.1:lrangemylist0-11)hello12)hello23)hello3.0.0.1:rpoplpushmylistmyotherlist#移除列表的最后一个元素,将他移动到新的列表中。hello3.0.0.1:lrangemylist0-1#查看原来的列表1)hello12)hello2.0.0.1:lrangemyotherlist0-1#查看目标列表中,确实存在该值1)hello3.0.0.1:
lset:将列表中指定下标的值替换为另一个值,更新操作
.0.0.1:existslist#判断这个列表是否存在(integer)0.0.0.1:lsetlist0item#如果不存在的话,更新会报错(error)ERRnosuchkey.0.0.1:lpushlistvalue1(integer)1.0.0.1:lrangelist)value1.0.0.1:lsetlist0item#如果存在,更新当前下标的值OK.0.0.1:lsetlist1other#如果不存在的话,更新会报错(error)ERRindexoutofrange.0.0.1:
linsert:将某个具体的value插入到列表中某个元素的前面或者后面
.0.0.1:lrangemylist0-11)hello12)hello2.0.0.1:linsertmylistbeforehello2hello(integer)3.0.0.1:lrangemylist0-11)hello12)hello3)hello2.0.0.1:linsertmylistafterhello2hello(integer)4.0.0.1:lrangemylist0-11)hello12)hello3)hello24)hello.0.0.1:
小结:
list实际上是一个链表,前后都可以插入如果key不存在,创建新的链表如果移除了所有的值,空链表,也代表不存在在两边插入或者改动值,效率最高。3、Set(集合)
.0.0.1:saddmysethello#set集合中添加元素(integer)1.0.0.1:saddmysetworld(integer)1.0.0.1:smembersmyset#查看指定Set的所有值1)world2)hello.0.0.1:sismembermysethello#判断某一个值是不是在set中(integer)1.0.0.1:sismembermysethello1(integer)0.0.0.1:
.0.0.1:scardmyset#获取集合中的个数(integer)2.0.0.1:saddmysethello2(integer)1.0.0.1:smembersmyset1)world2)hello23)hello.0.0.1:sremmysethello#移除元素(integer)1.0.0.1:smembersmyset1)world2)hello2.0.0.1:
.0.0.1:smembersmyset1)kkk2)world3)hjk4)hello2.0.0.1:srandmembermyset#随机抽取一个元素hjk.0.0.1:srandmembermysethello2.0.0.1:srandmembermyset2#随机抽取指定个数的元素1)world2)hello2.0.0.1:srandmembermyset21)hello22)hjk.0.0.1:
.0.0.1:smembersmyset1)kkk2)world3)hjk4)hello2.0.0.1:spopmyset#随机删除元素hjk.0.0.1:smembersmyset1)kkk2)world3)hello2.0.0.1:spopmysethello2.0.0.1:smembersmyset1)kkk2)world.0.0.1:
.0.0.1:smembersmyset1)kkk2)world.0.0.1:saddmyset2set2(integer)1.0.0.1:smovemysetmyset2kkk#将一个特定的值,移动到另一个set集合中(integer)1.0.0.1:smembersmyset1)world.0.0.1:smembersmyset21)kkk2)set2.0.0.1:
.0.0.1:smemberskey11)b2)a3)c.0.0.1:smemberskey21)e2)d3)c.0.0.1:sdiffkey1key2#差集1)b2)a.0.0.1:sinterkey1key2#交集1)c.0.0.1:sunionkey1key2#并集1)e2)a3)c4)d5)b
4、Hash(哈希)
也是key-value形式的,但是value是一个map。
.0.0.1:hsetmyhashfieldxxx#set一个key-value(integer)1.0.0.1:hgetmyhashfield#获取一个字段值xxx.0.0.1:hmsetmyhashfield1hellofield2world#set多个key-valueOK.0.0.1:hmgetmyhashfieldfield1field2#获取多个字段值1)xxx2)hello3)world.0.0.1:hgetallmyhash#获取全部的数据1)field2)xxx3)field14)hello5)field26)world
.0.0.1:hdelmyhashfield1#删除指定的key,对应的value也就没有了(integer)1.0.0.1:hgetallmyhash1)field2)xxx3)field24)world.0.0.1:
.0.0.1:hlenmyhash#获取长度(integer)2.0.0.1:hexistsmyhashfield1#判断指定key是否存在(integer)0.0.0.1:hexistsmyhashfield2(integer)1.0.0.1:hkeysmyhash#获取所有的key1)field2)field2.0.0.1:hvalsmyhash#获取所有的value1)xxx2)world.0.0.1:
.0.0.1:hsetmyhashfield35(integer)1.0.0.1:hincrbymyhashfield31#指定增量(integer)6.0.0.1:hincrbymyhashfield3-1(integer)5.0.0.1:hsetnxmyhashfield4hello#如果不存在则可以设置(integer)1.0.0.1:hsetnxmyhashfield4world#如果存在则不能设置(integer)0.0.0.1:
Hash适合存储经常变动的对象信息,String更适合于存储字符串。