Redis系列-3.字符串(String)结构
文章中可能有地方描述偏差,欢迎留言指证
1.基本
String是一种常用的redis结构,和其他编程语言中的string类似。
2.常用命令
下面所有描述里 {}都是必需参数,<>是可选参数
设置值
set {key} {value} < ex seconds> < px milliseconds> < nx|xx>
key:键的名字
value:值
ex seconds:设置秒级的过期时间
px milliseconds:设置毫秒级的过期时间
nx:当键不存在时,这条命令生效
xx:当键存在时,这条命令生效
命令成功之后会返回一个ok
获取值
get {key}
获取值,如果键不存在,会返回空(nil)
批量设置值
mset {key} {value} [key value....]
通过mset可以一次设置多条值,但在线上环境中个人不建议一次设置太多。有可能因为网络原因传输失败,或服务器因为某种原因设置失败。redis是单线程架构,只要网络不是太差,可以采用多传的方式。
如果需求是要添加多条数据,也建议用mset而不是set,这样的话可以降低网络开销。
批量获取值
mget {key} [key...]
用法同mset
计数
incr {key}
这条命令是对键做自增操作。有三种情况:
1.值不是整数,操作失败
2.值是整数,返回自增后的结果(比如以前是2,返回3)
3.键不存在,会设置一条数据为0,键名是参数key的数据,并返回结果。
除了incr命令 还有几种同类命令;
decr {key} 自减
incrby {key} {increment} 自增指定的数字
decrby {key} {decrement} 自减指定的数字
incrbyfloat {key} {increment} 自增指字的浮点数
3.不常用命令
追加值
append {key} {value}
此命令可以向字符串尾部追加值
但个人不建议直接追加,这样会导致一定的计算开销和内存管理开销。建议可以在服务器做好处理,当需要追加时,获取旧值,再直接用set添加新值,替换掉。
字符串长度
strlen {key}
返回键的长度,但如果键不是字符串会报错。其他类型也有自己的获取长度命令。此类命令不会产生遍历操作,会直接读取内部键来获取数据,时间复杂度为O(1)
设置并返回原值
getset {key} {newValue}
作用和set一样,不同的是这条命令会返回旧值
设置指定位置的字符
setrange {key} {offeset} {value}
这条命令会替换指字位置的字符
如图所示,当值为一个以上字符串,会顺序向后覆盖。
获取部分字符串
getrange {key} {start} {end}
从0开始算起,end是结束的下标,返回值也包括自己
-1代表末尾 其他数据结构也是
4.内部编码
有两种:
**int:**8个字节的长整型
embstr:字节数<=39
raw:字节数>39
redis会自动按情况转换编码类型,这样的好处是在性能 空间上取得了平衡。但是要设计阶段也要考虑数据的长度,尽量避免转换。
5.适合场景
1.缓存
保存查询结果。数据源收到命令后会处理,这些处理可有很销时。如果这些处理可能是重复的,那把结果保存在redis就非常爽了。
2.计数
像视频类网站,播放量这种数据,读写量都会比大,这时用redis也是非常好的。redis内部对int做了优化,在做加减时开销相对较小。
3.共享数据
redis有时也用做分布式架构,这时类如用户信息等数据需要在多个节点之间传递。redis就非常适合这样的场景。
4.限速
当短信验证码计时这类需求时,用redis也非常好。前面设置值时有个过期时间,当查询不到键时,不就可以又发送短信了么?