Redis数据结构之字符串string
字符串类型是Redis最基础的数据结构,字符串类型的值可以是
字符串、数字、二进制,但是最大的值不能超过512MB
常用命令
设置值
set:设置值,有几个选项
set key value [ex seconds] [px milliseconds] [nx|xx]
ex seconds :为key设置秒级的过期时间
px milliseconds :为key设置毫秒级的过期时间
nx :key必须不存在才可以设置成功,用于添加
xx :key必须存在才可以设置成功,用于更新
127.0.0.1:6379> set name redis ex 100 nx
OK
setex :为key设置秒级过期时间
setex key seconds value
psetex:为key设置毫秒级过期时间
psetex key milliseconds value
setnx:key必须不存在才可以设置成功,如果key已存在,返回0
setnx key value
mset:批量设置值
mset key1 value2 key1 value2 ...
获取值
get key
mget:批量获取值
mget key1 key2 ...
批量操作可以提高开发效率,使用get命令,执行n次get命令的耗时为n次网络时间+n次命令时间,使用mget命令,执行n次get命令的耗时为1次网络时间+n次命令时间
增加值
incr:对数据自增
incr key
Incrby:对数据增加指定的整数值
incrby key increment
incybyfloat:对数据增加指定的整数或小数值
incrbyfloat key increment
如果值不是整数,会提示 (error) ERR value is not an integer or out of range
如果值是整数,会返回自增后的结果
如果key不存在,会创建key,并返回1
127.0.0.1:6379> incr age
(integer) 1
127.0.0.1:6379> incrby age 100
(integer) 101
127.0.0.1:6379> incrbyfloat age 0.99
"101.99"
127.0.0.1:6379> incrby age 0.99
(error) ERR value is not an integer or out of range
减少值
decr:对数据自减
decr age
decr age 100
其他命令
strlen:返回字符串长度
strlen key
getset:设置并返回值
getset key value
append:追加值,返回追加后的字符串长度,如果key不存在,就创建
append key value
setrange:设置字符串指定位置的值,返回字符串长度
offset:字符的索引,从0开始
setrange key offset value
127.0.0.1:6379> set name redis
OK
127.0.0.1:6379> setrange name 0 p
(integer) 5
127.0.0.1:6379> get name
"pedis"
getrange:获取部分字符串
getrange key start end
127.0.0.1:6379> getrange name 0 2
"ped"
127.0.0.1:6379>
内部编码
字符串类型内部有3种编码:
- int:
8个字节的 长整型 - embstr:小于等于
39个字节的字符串 - raw:大于
39个字节的字符串
可以使用object encoding key 查看当前编码
127.0.0.1:6379> set num 100
OK
127.0.0.1:6379> object encoding num
"int"
127.0.0.1:6379> set name redis
OK
127.0.0.1:6379> object encoding name
"embstr"
127.0.0.1:6379> set name "redis have three encoding. yes i know it have thr"
127.0.0.1:6379> object encoding name
"raw"
常用场景
缓存
缓存是一种典型的使用场景,用户第一次请求时,从数据库中查询数据,然后将数据存入redis,当用户在此请求时从redis中获取数据
//伪代码:演示缓存的使用,当然这里只是简单的演示,并没有考虑缓存穿透、击穿等问题
public String get(String key){
//从redis获取数据
Object value = redis.get(key);
if(value==null){
//如果缓存为空,查询数据库,并添加进redis
value = mysql.get(key);
redis.set(key,value);
}else{
//如果缓存存在,直接返回
value = JsonUtils.toObject(value);
}
return value;
}
接口限流
对用户的请求进行限制,避免遭到恶意的频繁请求,比如1秒内只能请求100次,比如验证码1分钟内只能获取1次
//伪代码:演示接口限流的使用,用到了setex和incr
//key前缀
String key_prefix = "limit_10s:";
public boolean limitQuest(String userId){
//获取值
Integer val = Integer.parseInt(redis.get(key_prefix+userId));
//如果为空,说明用户可以访问
if(val == null){
//设置一个10秒过期的key,用于判断这个值能不能获取到即可,value的值无所谓
redis.set(key_prefix+userId,'1',1,TimeUnit.MINUTES);
return true;
}else if(val>=100){
//说明key还没有过期,但是值超过了100,就提示用户访问频繁
return false;
}else{
//说明key还存在并且值还没超过100,那就开始计数
redis.incr(key_prefix+userId);
}
}
分布式session
在集群或者分布式的环境下,用户的session显然无法存在一台服务器上,因为这样的话当用户在A服务器登陆用户的信息存在了A服务器,下次Nginx将用户的访问均衡到B服务器,那就无法获取用户的信息;需要用户频繁的重新登录,这个问题可以通过Redis将用户的session进行集中管理


浙公网安备 33010602011771号