文章目录
- 关于string类型
- string基本操作
- 关于使用set还是mset的思考
- 数值增减操作
- 数值时效性设置
- key的命名规范
- 关于set命令的扩展
关于string类型
众所周知,redis是一个存key-value的数据库,可以通过set命令存入数据,如set name Jam
、set age 22
,对于这种set命令,虽然我们明面上没有指定数据类型,但是所有的key都是以string存储,我们所说的数据类型实际指的是value的数据类型。
string类型存储的是单个数据,是redis最简单、最常用的存储类型,一个存储空间存一个数据。
string类型保存的都是字符串,但是如果字符串是一个数字(正负整数、小数),那么可以当作数字来进行计算。
string基本操作
- 增加一条数据:
set key value
,如set name Jam
- 获取数据:
get key
,如get name
- 删除数据:
del key
,如del name
在之前的博客中有提到这3个基本操作,这里不再过多介绍,除此之外,本篇博客再介绍4条新的基本操作: - 增加多条数据:
mset key1 value1 key2 value2 ...
,如mset name Jam age 22
。 - 获取多条数据:
mget key1 key2
,如mget name age
,这里如果获取的数据不存在,就会返回nil,即Java中的null。 - 获取value的长度:
strlen key
,如strlen name
,如果key没有对应的值,即值为nil,会返回0。 - 追加信息到原value之后:
append key value
,如append name Jam
,此时name的值就为"JamJam",如果这个key本来就没有值,那么就会新建一个key-value的键值对。
关于使用set还是mset的思考
在学习阶段,用set还是mset最直观的感受,肯定就是一条语句和多条语句的区别,但是在实际的应用场景中,有成百上千条数据需要set时呢?
先看看这两者的执行步骤:
举个简单的例子,如果有10条数据,单条操作和批量操作区别不大,无非是单条操作麻烦点;如果有1000条数据,批量操作的优点就显现出来了,它能够提升与redis交互时的效率;但是如果有1000000条数据呢?redis是单线程的,一个批量操作过来,这1000000条数据没执行完轮不到其他的数据操作,其他操作都阻塞在那里了,这样也不行。对于大数据量,我们可以采用分片的方法,但是具体每次执行多少次操作,就要视具体的情况来定了。
所以,我们不能一概而论的说单条操作好还是批量操作好,需求结合具体的业务场景,具体问题具体分析。
数值增减操作
- 使数值+1:
incr key
,如incr age
。 - 使数值加一个整数:
incrby key increment
,如incrby age 233
,注意:这里增加的数量可以是负数,相当于减法,但是必须是整数。 - 使数值加一个小数:
incrbyfloat key increment
,如incrbyfloat age 2.33
,同样,可以加负数,相当于减法。 - 使数值-1:
decr key
,如decr age
。 - 使数值减一个整数:
decrby key increment
,如decrby age 233
上述命令都是针对数值型字符串来说的,如果是非数值型字符串,在进行这些操作时将会报错。
数值型字符串的最大值是 9,223,372,036,854,775,807,也就是Java中的Long.MAX_VALUE。
数值时效性设置
- 设置数据的生效时间,单位为秒:
setex key seconds value
,如setex test 10 hah
,设置test-hah这个键值对的有效时间为10s,10s之后这个数据就被自动清理。 - 设置数据的生效时间,单位为毫秒:
psetex key milliseconds value
,如psetex test 5000 hah
,设置test-hah这个键值对的有效时间为5s,5s之后这个数据就被自动清理。
key的命名规范
因为一般情况下真正的数据还是存储在关系型数据表里,所以对于用redis来存储其中的某个数据时,使用如下命名规范:
表名:主键名:主键值:字段名,举个例子,有一个user表,主键为fid,有一个字段为name,则key可以命名为:“user:fid:1234567:name”
关于set命令的扩展
上面有介绍到一些关于set的命令,如set、mset、setex、psetex,但我们在redis客户端里使用时,输入set后的显示如下:
他给的提示是set key value [EX seconds] [PX milliseconds] [NX|XX]
,这个可以说是一种带参数的写法,而上面的几个命令都可以转为带参数的写法:
-
setex key seconds value
-->set key value ex seconds
-
psetex key milliseconds value
-->set key value px milliseconds
至于"NX"和"XX"之前没有提到,这里也顺便介绍下: - 只有当不存在这个key时,才写入数据:
set key value nx
,如set pet cat nx
,只有当不存在"pet"这个key时才会写入。 - 只有存在这个key时才写入:
set key value xx
,与上一正好相反。