Redis key的操作、5种数据类型及其使用场景

 

redis默认有16个数据库,第一个数据库是db0,第16个数据库是db15,使用下标指定要使用数据库。

 

先连接到redis服务器,再选择某个数据库进行操作:

./redis-cli -h 192.168.1.7  #端口使用默认的6379
select 0  #选择|切换数据库,不指定默认使用db0

dbsize  #返回当前数据库中key的数量

flushdb  #清空当前数据库
flushall  #清空所有数据库

 

 

 

可在redis.conf中设置redis的数据库个数:

 

 


 

 

redis的数据类型及其使用场景

redis是一个键值数据库,存储的数据都是键值对的形式,key都是string类型,value可以是以下5种类型:

  • string  字符串

  常用于缓存、限流、计数器、分布式锁、分布式session等等。

 

  • hash  哈希

  常用于存储对象,比如存储用户相关信息、存储商品信息等对象。

 

  • list  列表

  因为是有序的,常用于存储时间轴上的事件,比如生成历程报告:

  回顾你与qq一同走过的10年,xx年月日,你注册了qq号;xx年月日你发布了第一条说说,xx年月日凌晨5点半,你还在和xx聊天;

  学生的成绩变化,股市的变化、按评论时间加载的评论等等,随时间变化。

 

  • set  集合

  常用于存储无序的多个元素,比如这条说说、朋友圈的赞你的好友,文章标签,好友分组等

 

  • sorted set  有序集合

  也叫做zset。

  常用于排行榜,比如热搜、阅读排行榜、评论排行榜、精华、热销商品、金曲排行榜、最火热点、新闻热点等等。

 

 


 

 

key的常用操作

set name chy  #设置一个键值对,如果key已存在,则是修改对应的值
setnx name "chy01" #多个后缀nx,name不存在才设置,若name已存在,则不作任何操作,可以保护原值不被覆盖。
mset name "chy" age 22 #同时设置|修改多个键值对,key1 value1 key2 value2......

get name #获取name的值,如果name不存在,返回nil
mget name age #同时获取多个key的值


getset name "chy1" #先获取name原来的值,再重新赋值



type name  #查看key对应的值的数据类型


rename name myname #重命名key。将name重命名为myname,如果myname已存在,会覆盖myname原来的值 
renamenx name myname #多了nx,如果myname不存在,才执行重命名,并返回1;如果myname已存在,则不执行重命名,返回0


randomkey #从当前数据库中随机返回一个key。返回的是key,不是value


exists name  #检查指定的key是否存在,存在则返回1,不存在返回0
del name#删除一个键值对,返回1。若指定的键(值对)不存在,返回0




expire name 60  #设置某个键值对的过期时间(有效期),单位s。60s后name键值对过期,自动删除该键值对。比如说24h后删除此说说。

pexpire name 60000 #多了前缀p,表示单位是ms

expireat name 1232323232323 #多了后缀at,表示使用时间戳,单位依然是s,距离1970.01.01 00:00:00 1232323232323秒后过期
pexpireat name 121212122323 #多了前缀p、后缀at,表示使用时间戳+单位ms,距离1970.01.01 00:00:00 121212122323毫秒后过期


ttl name #查看name的过期时间,默认单位s。-2表示此key不存在、已过期、已被删除,-1表示此key未设置过期时间,永久有效。

persist name #清除设置的过期时间。默认永不过期。



setex name 60 "chy02" #设置|修改一个键值对,并设置过期时间。60s后过期,ex即expire。


move name 1 #把name键值对移到db1,即键值对的剪切


keys n* #使用正则表达式匹配key,返回所有以n开头的key,匹配的是key。
keys * #获取所有的key


dump name #序列化指定的键值对,返回序列化后的值


 

 


 

 

string  字符串

string是redis的基础数据类型。

 

set name "chy" #双引、单引均可
set age 20 #redis没有数值类型,值默认是字符串类型,引不引都行。习惯上,key不引,数值型的value不引,中英文、符号之类的引一下。


strlen name  #返回字符串(值)长度

append name "01" #若键值对已存在,在值的末尾添加字符串;若key不存在,自动新建(初始化为空串),再执行添加操作。返回操作后字符串(值)的长度


incr age #值的自增。将age的值+1,并返回+1后的值。如果age不存在,会先新建(值初始化为0),再执行自增。常用于主键自增,比如订单编号。
incrby age 5  #指定增量为5,即+5,增量只能是整数
incrbyfloat age 5.0 #增量是浮点数。整数算是一种特殊的浮点数,所以整数也行。

decr age  #值的自减
decrby age  5  #指定减量,即-5




getrange name 0 2 #返回value的[0,2]区间上的字符串。redis的区间都是闭区间,都支持负数索引
getrange name 0 -1 #支持负数索引

 

 


 

 

hash  哈希

hash也叫做散列,一个hash可储存多个键值对,hash中的键值对不叫作键值对,而是叫做字段。一个 hash 可以存储 232 - 1(42亿+)个字段。

 

 hash中字段值必须是字符串类型。

hset user name "chy"  #在user中添加|更新name字段,如果user不存在,会自动创建。若之前name不存在,添加name字段并返回1;若之前name存在,则更新其值,返回0
hsetnx user name "chy" #多了后缀nx,如果name字段已存在,则不进行任何操作,可以保护name字段的原值不被覆盖
hmset user name "chy" age 20 #同时添加|更新多个字段


hget user name #获取单个字段的值
hmget user name age #获取多个字段的值


hgetall user #获取整个hash的所有字段(字段名+字段值)
hkeys user #获取所有的字段名
hvals user #获取所有的字段值


hdel user name #删除一个字段。hdel返回删除的字段个数
hdel user name age #删除多个字段


hincrby user age 5 #字段值的自增,指定增量,+5
hincrby user age -2 #负值表示字段值的自减,-2。没有hincr、hdecr、hdecrby命令

hincrbyfloat user age 5.0 #用法同上,只不过支持浮点数
hincrbyfloat user age -2.0 #


hexists user name #判断某个字段是否存在,存在返回1,不存在返回0

hlen user #获取字段数

 

h即hash,m即multiple。

user是一个hash,是redis的一个key,值是多个字段。

 

hash适合储存对象、json数据,一个字段存储一个属性。

 

 


 

 

list  列表

list是有序集合,元素可以重复,但元素只能是字符串类型。一个list可以存储 232 - 1 (42亿+)。

 

lpush users "zhangsan" "lisi" #在list的头部插入一个或多个元素,l即left。若users不存在,会先自动创建,再插入。先插入"zhangsan",再插入"lisi",每次都是在最前面插入,list第一个元素是lisi
lpushx users "zhangsan" "lisi" #多了一个x,表示如果users不存在,不作任何操作,不会自动创建

rpush users "wangwu" "zhaoliu" #在list的尾部插入一个或多个元素,r即right,每次都是在最后面插入,list的最后一个元素是zhaoliu
rpushx users "wangwu" "zhaoliu" #多个一个x,表示如果users不存在,不作任何操作,不会自动创建




lpop users #弹出list的第一个元素。弹出是指返回并删除一个元素。
rpop users #弹出list的最后一个元素


blpop users 60 #弹出列表的第一个元素,若list是空的,会阻塞等待60s,这60s内list内有了元素就弹出。60是超时时间。b即block,阻塞。
brpop users 60 #最后一个元素



rpoplpush list1 list2 #弹出list1的最后一个元素,并在list2的头部插入该元素。即把列表的最后一个元素剪切到另一个列表的开头。
brpoplpush list1 list2 60 #设置超时时间



llen users #返回list的长度(元素个数),第一个l即list

lrange users 0 -1 #返回[0,-1]上的所有元素。redis的区间都是闭区间,都支持负数索引

lindex users 1 #返回指定位置上元素,是查找、并不是删除。指定下标。

lset users 1 "zhangwei" #修改指定位置上元素,该位置要已存在元素,才能修改,否则报错。



lrem users 0 "zhangsan" #移除list中所有值为zhangsan的元素。0表示删除匹配到的所有元素
lrem users 2 "zhangsan" #从前往后搜索,删除匹配到的前2个元素
lrem users -2 "zhangsan" #从后往前搜索,删除匹配到的前2个元素。正负表示搜索方向,数值表示删除个数。


ltrim users 1 3 #修剪list,只保留[1,3]上的元素,会删除其它元素


linsert users before "zhangsan" "lisi" #从前往后搜索"zhangsan",在匹配的第一个"zhangsan"前面插入元素lisi"。若"zhangsan"不存在,不做任何操作,返回-1;若users不存在,不做任何操作,返回0
lisert users after "zhangsan" "lisi" #
从前往后搜索"zhangsan",在匹配的第一个"zhangsan"后面插入元素lisi"

 

 list适合存储有序的多个元素,比如评论(时间顺序)。

lpush comments '{"id":1,"comment":"质量很好","date":12121212121212}'

元素只能是字符串,可以把整个json数据作为字符串存储,但整个json必须加引号。

 

 

比如回顾你与qq一同走过的10年,xx年月日,你注册了qq号;xx年月日你发布了第一条说说,xx年月日凌晨5点半,你还在和xx聊天;

 

学生的成绩变化,股市的变化、按评论时间加载的评论等等。

 

 

 


 

 

set  集合

set是无序集合,元素不可重复,元素只能是字符串。一个set可以存储 232 - 1 (42亿+)个元素。

 

sadd users "zhangsan" "lisi"  #向集合中添加一个或多个元素,若users不存在,会自动创建。若set中已有该元素,则不添加该元素,返回本次操作添加的元素个数
srem users "zhangsan" "lisi" #删除set中的一个或多个元素,若set中没有该元素,自动跳过


smembers users #返会set中的所有元素

sismember users "zhangsan" #检测某个元素是否是users的成员,是返回1,不是返回0。s is member ,第一个s即set。

scard users #返回set中的元素个数



spop users #随机弹出一个元素。set是无序的,只能随机弹,不能指定弹出哪个元素


srandmember users #随机返回一个元素。是返回,不是弹出,不会删除该元素
srandmember users 3  #随机返回3个元素。随机返回一个元素,再从剩下的元素中随机返回一个,再从剩下的元素中随机返回一个,依此类推。就是说返回的元素各不相同。
srandmember users -3 #负数表示每次都从整个集合中选,不是从剩下的里面选,即返回的元素可能有相同的。若数值大于集合的元素总数,则返回集合中的所有元素。



smove set1 set2 "zhangsan" #把set1中的元素"zhangsan"剪切到set2中



sinter set1 set2 set3 #返回这些集合的交集(共同元素)
sinterstore destset set1 set2 set3 #多了后缀store,表示求交集,并把交集中的元素存储到集合destset中。返回的是交集中的元素个数


sunion set1 set2 set3 #并集(合并到一起)
sunionstore destset set1 set2 set3


sdiff set1 set2 #求差集(set1中有、set2中没有的元素)
sdiffstore destset set1 set2

 

常用于存储无序的多个元素,比如一条说说、朋友圈赞你的好友,博客文章的分类,联系人分组等。

要存储多个元素,且这些元素不需要排序。

 

 


 

 

sorted set  有序集合

也叫做zset,元素有序,每个元素都会关联一个分数(整型、浮点型),通过分数的大小来排序。

元素不能重复,分数可以重复。元素只能是字符串。一个sorted set可以存储2^32-1(42亿+)个元素。

 

zadd grade 90 "zhangsan" 98.5 "lisi" #添加|更新一个或多个元素。关联的分数在前,元素在后。分数支持整型、浮点型,负数也可以。如果元素已存在,则更新关联的分数。返回此次操作添加的元素个数

zrangebyscore grade 90 100 #返回分数在[90,100]上的所有元素
zrangebyscore grade 90 100 withscores #返回时带上对应的分数

zscore grade "zhangsan"  #返回该元素关联的分数。比如查询积分。

zincrby grade 5 "zhangsan" #将指定元素关联的分数+5。比如积分的增减。
zincrby grade -5 "zhangsan" #负数即减,-5


zrange grade 0 -1 #返回[0,-1]上的所有元素。
zrange grade 0 -1 withscores #返回时带上对应的分数
#zrevrange的用法同上,只不过多了rev,表示按分数降序排列。默认都是按分数升序排列。
#比如获取排行旁前10的名单



zrank grade "zhangsan" #返回该元素的位置(下标)。
#zrevrank用法同上,只不过按分数降序排列
#比如查询排名





zcount grade 90 100 #返回分数在[90,100]上的元素个数


zcard grade #返回元素个数


zrem grade "zhangsan" "lisi" #删除一个或多个元素

zremrangebyrank grade 0 2 #删除[0,2]上的所有元素
zremrangebyscore grade 90 100  #删除分数在[90,100]上的所有元素

 

 sorted set常用于排行榜,比如阅读排行旁、评论排行榜、推荐排行榜、热搜排行榜、最热视频、最火音乐、热卖商品、人气指数、积分排名等等。

分数即是衡量指标,上面涉及到下标的操作,默认都是按分数升序排列,可以把前缀z换为zrev,表示按分数降序排列。

要存储多个元素,且这些元素需要排序。

 

 


 

 

 说明

  • redis中命令不区分大小写,比如SET、set都是一样的。但是键值对、字段、元素等都要区分大小写。
  • string是基础数据类型,hash、list、set、sorted set都是数据结构
  • hash的字段的值,list、set、sorted set的元素,都只能是字符串,如果要存储其它类型的数据,要加引号作为字符串存储。

 

posted @ 2019-06-23 15:14  chy_18883701161  阅读(3583)  评论(0编辑  收藏  举报