在Redis中的所有key都是字符串,而value的类型是存在差异的。本文介绍的就是value中的string类型。
首先要知道,Redis中的字符串,直接就是按照二进制数据的方式存储的,不会做任何的编码转换。也就是说,redis不仅仅可以存储文本数据,还可以存整数、JSON、xml、二进制的数据(图片、视频、音频)等等。
目录
SET
GET
MSET MGET
SETNX SETEX PSETEX
INCR DECR INCRBY DECRBY INCRBYFLOAT
APPEND
GETRANGE
SETRANGE
STRLEN
编码方式
String类型的应用场景
SET
我们之前简单了解过set的使用,但那只是普通的用法,而完整版是这样子的:
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
当我们使用
set key value ex 10
的时候,相当于:
set key value
expire key 10
这样子就非常方便的设置了超时时间,并且能够节省网络带宽。
前者还是一个原子性的操作。
为了演示方便,我们使用FLUSHALL来清空所有的key(注意!这个操作非常危险!和sql中的drop database是一样的!一定不能再生产环境中使用!)
过期时间:
后面的[NX|XX]:
NX:如果key不存在,才设置;如果key存在,则不设置(返回nil)
XX:如果key存在,才设置(相当于更新key的value);如果key不存在,则不设置(返回nil)
对于redis文档给出的语法格式说明:
[] 相当于一个独立的单元,表示可选项(可有可无的),其中 | 表示或者的意思,只能出现一个
[] 和 []是可以同时存在的。
如果key不存在,则创建新的键值对;如果key存在,则是让新的value覆盖旧的value,可能会改变原来的数据类型。
GET
对于get来说,只是支持字符串类型的value,如果value是其他的类型,使用get获取就会出错。
例如此时我们使用lpush来构造一个list类型的key,再使用get就会报错:
MSET MGET
MGET [key ...]
MSET key value [key value ...]
和set和get类似,只不过加上了M的操作可以一次性操作多条。
并且这个操作是非常节省网络带宽的,一次可以操作多条,对于硬件资源的消耗是比较小的。
SETNX SETEX PSETEX
SETNX:不存在才能设置,存在则设置失败。这个命令可以用于保证键的唯一性,因为它只有在键不存在时才会设置值。
SETEX:允许同时设置一个键的值和它的生存时间
Redis 的 PSETEX
命令与 SETEX 类似,但用于设置键的值并指定过期时间,单位为毫秒。
INCR DECR INCRBY DECRBY INCRBYFLOAT
-
INCR:
- 命令格式:
INCR key
- 功能:将键
key
的值增加 1。如果键不存在,它将首先将键设置为 0,然后增加 1。 - 返回值:增加后的值。
- 命令格式:
-
INCRBY:
- 命令格式:
INCRBY key increment
- 功能:将键
key
的值增加指定的increment
值。如果键不存在,它将首先将键设置为 0,然后增加increment
。 - 返回值:增加后的值。
- 命令格式:
-
DECR:
- 命令格式:
DECR key
- 功能:将键
key
的值减少 1。如果键不存在,它将首先将键设置为 -1,然后减少 1。 - 返回值:减少后的值。
- 命令格式:
-
DECRBY:
- 命令格式:
DECRBY key decrement
- 功能:将键
key
的值减少指定的decrement
值。如果键不存在,它将首先将键设置为-decrement
,然后减少decrement
。 - 返回值:减少后的值。
- 命令格式:
-
INCRBYFLOAT:
- 命令格式:
INCRBYFLOAT key increment
- 功能:将键
key
的值增加指定的浮点数increment
。如果键不存在,它将首先将键设置为increment
的值。 - 返回值:增加后的值,浮点数格式。
- 命令格式:
INCR
和 DECR
命令只能用于存储整数值的键,而 INCRBY
和 DECRBY
可以用于增加或减少任意整数值,包括负数。INCRBYFLOAT
则允许以浮点数形式增加键的值。
APPEND
Redis 的 APPEND
命令用于向键(key)的现有值追加字符串值。如果键不存在,APPEND
命令会将键的值设置为给定的字符串。如果键已经存在并且类型是字符串,APPEND
命令会将字符串值追加到现有字符串的末尾。
GETRANGE
GETRANGE
命令用于获取键(key)的字符串值的一部分,即从一个指定的起始偏移量到一个指定的结束偏移量之间的子字符串。
第一个数字代表着从前往后数,第二个数代表着从后往前数。
SETRANGE
SETRANGE
命令用于用指定的字符串值替换键(key)的字符串值中的某个部分。如果键不存在,SETRANGE
会创建一个新的键,并将其值设置为指定的字符串。如果键已存在且类型为字符串,SETRANGE
会从指定的偏移量开始替换现有字符串的部分内容。
STRLEN
返回键所关联的字符串值的长度。如果键不存在或者键的值不是字符串类型,STRLEN
命令会报错。
编码方式
string 内部有三种编码方式:
- 1.int 64位/8字节 的整数
- 2.embstr 压缩字符串.适用于表示比较短的字符串,
- 3.raw 普通字符串.适用于表示更长的字符串,只是单纯的持有字节数组
String类型的应用场景
应用服务器访问数据的时候,先査询 Redis。
如果 Redis 上数据存在了,就直接从 Redis 取数据交给应用服务器,不继续访问数据库了
如果 Redis 上数据不存在,再读取 MySQL,把读到的结果返回给应用服务器。同时,把这个数据也写入到 Redis 中。
这样的数据大部分都是热点数据,把用户最需要频繁读取的数据放在redis中,能极大地减缓mysql的读取写入量。
但是随着时间的推移,redis中的数据会越来越多,什么数据都往里面存的话,肯定会堆积成山。于是有几个简单的策略可以减缓这种情况:
- 在把数据写入到redis中的时候,给key设置一个过期时间
- redis在内存不足的时候,设置了一个淘汰策略
对于session会话,redis会和应用服务器相互配合,做到不同的服务器的redis数据可以共享: