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命令,执行nget命令的耗时为n次网络时间+n次命令时间,使用mget命令,执行nget命令的耗时为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种编码

  • int8 个字节的 长整型
  • 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进行集中管理

posted @ 2020-05-10 13:02  范特西-  阅读(145)  评论(0)    收藏  举报