String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象
一个Redis中字符串value最多可以是512M
应用场景
需要存储常规数据的场景
缓存 session、token、图片地址、序列化后的对象(相比较于 Hash 存储更节省内存)。
需要计数的场景
- 举例:用户单位时间的请求数(简单限流可以用到)、页面单位时间的访问数。
- 比如抖音无限点赞某个视频或者商品,点一下加一次
- 是否喜欢的文章
分布式锁
利用 SETNX key value 命令可以实现一个最简易的分布式锁
String 还是 Hash 存储对象数据更好呢?
- String 存储的是序列化后的对象数据,存放的是整个对象。Hash 是对对象的每个字段单独存储,可以获取部分字段的信息,也可以修改或者添加部分字段,节省网络流量。如果对象中某些字段需要经常变动或者经常需要单独查询对象中的个别字段信息,Hash 就非常适合。
- String 存储相对来说更加节省内存,缓存相同数量的对象数据,String 消耗的内存约是 Hash 的一半。并且,存储具有多层嵌套的对象时也方便很多。如果系统对性能和资源消耗非常敏感的话,String 就非常适合
命令
增
set <key> <value> 添加键值对
mset <key1> <value1> <key2> <value2>
append <key> <value>
将给定的value追加到原来值得末尾,如果该key不存在,则重新创建一个
获取字符串长度 strlen <key>
层级
set user:userName xiao
过期时间key
setex <key> <过期时间> <value> 单位秒
查询
get <key> 查询对应键值
mget <key1> <key2> <key3>
getrange <key> <起始位置> <结束位置> 算头尾
修改
setrange <key> <起始位置> <value>
用 <value> 覆写<key> 所储存的字符串值,从<起始位置>开始。
替换
getset <key> <value>
以新换旧,设置了新值同时获得就值。
数值增减
递增数字 Incr +1 只能对数字值操作,如果为空,新增值为1
指定递增 incrby <key> <步长>
递减数字 decr <key>
指定递减 decrby <key> <步长>
分布式锁
setnx <key> <value> 只有在 key 不存在时设置 key 的值
msetnx <key1> <value1> <key2> <value2>
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
set key value [EX seconds][PX milliseconds][NX|XX]
- ex 多小秒之后过期
- px 毫秒过期
- nx 不存在才创建
- xx 存在时覆盖
- set lock pay ex 10 NX