基本命令
set命令
将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,无论原来的数据类型是什么。之前关于此 key 的 TTL 也全部失效。
set key value [expiration EX seconds|PX milliseconds] [NX|XX]
选项[EX|PX]
EX seconds⸺使用秒作为单位设置 key 的过期时间。
PX milliseconds⸺使用毫秒作为单位设置 key 的过期时
(设置key1有10秒存活时间,值为5000)
(设置key2 为111,存活时间10秒)
上面两种写法都可以
选项[NX|XX]
NX ⸺只在 key 不存在时才进行设置,即如果 key 之前已经存在,设置不执行。
XX ⸺只在 key 存在时才进行设置,即如果 key 之前不存在,设置不执行。
也就是说,NX是用来插入新数据,XX用来更新已有数据
(先设置key1为111,然后再设置key1以NX方式为222,发现返回nil,数据还是111,数据设置失败)
(如果这时候在以XX方式设置key1就可以设置成功。如果key2不存在,以XX方式key2,返回nil,插入失败)
get命令
获取 key 对应的 value。如果 key 不存在,返回 nil。如果 value 的数据类型不是 string,会报错。 语法:
GET key
mset命令
⼀次性设置多个 key 的值 。返回值永远是 OK
MSET key value [key value ...]
mget命令
⼀次性获取多个 key 的值。如果对应的 key 不存在或者对应的数据类型不是 string,返回 nil。
mget/mset对比get/set
使用 mget / mset 由于可以有效地减少了网络时间,所以性能相较更高。
使用批量操作,可以有效提高业务处理效率,但是要注意,每次批量操作所发送的键的数量也不 是无节制的,否则可能造成单⼀命令执行时间过长,导致 Redis 阻塞。
计数命令
incr命令
将 key 对应的 string 表示的数字加一。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错。
incr key
(先设置key为1,get到的key为1.然后对key进行incr操作,key变为2)
incrby命令
将 key 对应的 string 表示的数字加对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错。
incrby key decrement
(对key增加10)
decr命令
将 key 对应的 string 表示的数字加一。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错。
decr key
decrby命令
DECRBY key decrement
(这些相关的命令都可以加/减上一个负数)
incrbyfloat命令
将 key 对应的 string 表示的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的不是 string,或者不是⼀个浮点数,则报错。允许采用科学计数法表示浮点数。
incrbyfloat key increment
字符串操作命令
append命令
如果 key 已经存在并且是一个 string,命令会将 value 追加到原有 string 的后边。如果 key 不存在, 则效果等同于 SET 命令。 返回值:追加完成之后 string 的长度。
append key value
getrange命令
返回 key 对应的 string 的子串,由 start 和 end 确定(左闭右闭)。可以使用负数表示倒数。-1 代表倒数第一个字符,-2 代表倒数第而个,其他的与此类似。超过范围的偏移量会根据 string 的长度调整成正确的值。返回值:string 类型的子串
getrange key start end
setrange命令
覆盖字符串的一部分,从指定的偏移开始。
setrange key offset value
(如果在一个不存在的key2里使用setrange命令,会在偏移量前面插入一个字节,就是 0x00)
(\0x00中,0x表示十六进制,00表示十六进制一个空字符)
strlen命令
获取 key 对应的 string 的长度。当 key 存放的类型不是 string 时,报错
strlen key
(strlen操作不存在的key时,返回0)
(类型不是string时,报错)
内部编码
字符串类型的内部编码有 3 种:
int:8 个字节的长整型。
embstr:小于等于 39 个字节的字符串。
raw:大于 39 个字节的字符串。
(这个39这个数字,是可以配置的,根据具体的使用场景设置不同的数字 )
Redis 会根据当前值的类型和长度动态决定使用哪种内部编码实现。
使用场景
缓存功能(Cache)
比较典型的缓存使用场景,其中 Redis 作为缓冲层,MySQL 作为存储层,绝大部分请求的数据都是从 Redis 中获取。由于 Redis 具有支撑高并发的特性,所以缓存通常能起到加速读写和降低后端压力的作用。
通过增加缓存功能,在理想情况下,每个用户信息,一个小时期间只会有一次 MySQL 查询,极大地提升了查询效率,也降低了 MySQL 的访问数。
与 MySQL 等关系型数据库不同的是,Redis 没有表、字段这种命名空间,⽽且也没有对键名 有强制要求(除了不能使用一些特殊字符)。但设计合理的键名,有利于防⽌键冲突和项⽬ 的可维护性,比较推荐的方式是使用 "业务名:对象名:唯⼀标识:属性" 作为键名。例如 MySQL 的数据库名为 vs,用户表名为 user_info,那么对应的键可以用"vs:user_info:6379"、"vs:user_info:6379:name" 来表示
计数功能(Counter)
许多应用都会使用 Redis 作为计数的基础工具,它可以实现快速计数、查询缓存的功能,同时数 据可以异步处理或者落地到其他数据源。如图所示,例如视频网站的视频播放次数可以使用 Redis 来完成:用户每播放一次视频,相应的视频播放数就会自增 1。
共享会话(Session)
一个分布式 Web 服务将用户的 Session 信息(例如用户登录信息)保存在各自的服务器中,但这样会造成一个问题:出于负载均衡的考虑,分布式服务会将用户的访问请求均衡到不同的服务器上,并且通常无法保证用户每次请求都会被均衡到同一台服务器上,这样当用户刷新一次访问是可能会发现需要重新登录,这个问题是用户无法容忍的。
为了解决这个问题,可以使用 Redis 将用户的 Session 信息进行集中管理,如图,在这种模式下,只要保证 Redis 是高可用和可扩展性的,无论用户被均衡到哪台 Web 服务器上,都集中从 Redis 中查询、更新 Session 信息。