字符串类型是Redis最基础的数据结构,键,值均为字符串类型,并且其他数据结构都是在字符串的基础上构建的。
注:字符串值最大不能超过512MB;
一、命令
1、常用命令
1)设置值
set key value [ ex seconds] [px millseconds] [nx | xx]
ex seconds 为键设置秒级过期时间
px milliseconds 为键设置毫秒级过期时间
nx 键必须不存在才能设置成功,用于新增
xx 键必须存在才能设置成功,用于更新,与nx相反
//设置1000秒
127.0.0.1:6379> set test test EX 1000
OK
127.0.0.1:6379> ttl test
(integer) 999
//更新为500秒
set test test EX 500 XX
OK
127.0.0.1:6379> ttl test
(integer) 498
//由于nx用于新增,所以更新会失败
127.0.0.1:6379> set test test EX 500 NX
(nil)
127.0.0.1:6379>
2)判断键是否存在
exists key 返回0表示不存在,1表示存在
3)除了set,redis还提供了setex 和setnx两个命令
setnx和nx 选项一样,setex和ex选项一样
setnx key value 如果键存在,则返回0,表示存储失败
setex key seconds value 设置key的值过期时间seconds秒
使用场景:
setnx可以作为分布式锁的一种实现方案,官网给出的setnx分布式锁方法:https://redis.io/topics/distlock
4) 获取值
get key 如果获取的键不存在,返回nil(空)
5)批量设置值
mset key1 value1 key2 value2 ...
6)批量获取值
mget key1 key2 key3 如果某些键不存在,则对应位置返回nil
127.0.0.1:6379> mset a 1 b 2 c 3
OK
127.0.0.1:6379> mget a d b c f
1) "1"
2) (nil)
3) "2"
4) "3"
5) (nil)
tip:如果没有mget批量操作,那么n次get的是时间= n次网络时间+n次命令时间
使用mget的时间 n次get的时间 = 1次网络时间 + n次命令时间
7)计数(场景:统计浏览次数等)
incr key 该命令用于对值做自增操作,返回结果分为三种情况
i 值不是整数,返回错误
ii 值是整数,返回自增后的结果
iii 键不存在,创建键,并且将值默认为0自增,返回结果为1
//值不为整数,返回错误
127.0.0.1:6379> incr ff
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
redis还提供了 decr(自减) incrby(自增指定数字) decrby(自减指定数字) incrbyfloat(自增浮点数)
127.0.0.1:6379> set number 5
OK
127.0.0.1:6379> decr number
(integer) 4
127.0.0.1:6379> incrby number 3
(integer) 7
127.0.0.1:6379> incrbyfloat number 1.5
"8.5"
2、不常用命令
1)追加值
append key value 可以向字符串尾部追加值
127.0.0.1:6379> get number
"8.5"
127.0.0.1:6379> append number w
(integer) 4
127.0.0.1:6379> get number
"8.5w"
127.0.0.1:6379>
2)字符串长度
strlen key 返回字符串的长度 ,integer类型,如果是中文,一个中文占3字节
127.0.0.1:6379> set china 中国
OK
127.0.0.1:6379> strlen china
(integer) 6
127.0.0.1:6379> set ceshi 12
OK
127.0.0.1:6379> strlen ceshi
(integer) 2
127.0.0.1:6379>
3)设置并返回原来的值
getset key value
127.0.0.1:6379> getset test ceshi
(nil)
127.0.0.1:6379> getset test hehe
"ceshi"
127.0.0.1:6379>
4)设置指定位置的字符
setrange key offeset value offeset:表示指定位置
127.0.0.1:6379> set tes pest
OK
127.0.0.1:6379> setrange tes 0 b
(integer) 4
127.0.0.1:6379> get tes
"best"
127.0.0.1:6379>
5)获取部分字符串
getrange key start end [start,end]包左也包右
127.0.0.1:6379> get tes
"be1t"
127.0.0.1:6379> getrange tes 1 2
"e1"
127.0.0.1:6379>
6)返回当前键的数据结构
127.0.0.1:6379> type tes
string
7)每种数据结构都有至少两种以上的编码,redis会根据当前的值以及长度决定使用哪种内部编码
object encoding key 查询内部编码
127.0.0.1:6379> object encoding tes
"raw"
3、共享session
分布式的web服务将用户的信息如果保存在各服务器中,出于负载均衡的考虑,分布式服务会将用户的访问分发到不同的服务器上,用户可能刷新一次就需要重新登录,为了解决这个问题,可以将用户的session进行统一管理,存储到redis,每次用户刷新或者查询登录信息直接从redis获取即可。
4、限速
为了安全考虑入,如每次登录时让用户输入手机验证码,但是不能频繁调用短信网关,会限制用户每分钟获取验证码评率;如下伪代码
phoneNum="151xxxxxxxx";
key = "shortMsg:limit:" + phoneNum;
isExists = redis.set(key,1,"EX 60","NX");
if(isExists != null || redis.incr(key) <= 5){ // !=null说名设置成功,为第一次获取;
//通过
} else{
//限速
}