文章目录

  • 关于string类型
  • string基本操作
  • 关于使用set还是mset的思考
  • 数值增减操作
  • 数值时效性设置
  • key的命名规范
  • 关于set命令的扩展


关于string类型

众所周知,redis是一个存key-value的数据库,可以通过set命令存入数据,如set name Jamset 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时呢?

先看看这两者的执行步骤:

java 移除redis指定key指定值 redis 删除string_字符串

举个简单的例子,如果有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后的显示如下:

java 移除redis指定key指定值 redis 删除string_数据库_02


他给的提示是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,与上一正好相反。