03-2 redis字符串

  • 字符串是redis最基础的数据结构,字符串类型的值实际可以是:
  • 简单字符串,复杂字符串(json,xml),数字(整数,浮点数),二进制(图片,音频,视频)但是不能超过512mb

一、字符串常用命令:

1.1、设置值:set

  • 语法:set key value [ ex seconds ] [ px milliseconds ] [ nx | xx ]
  • 返回值:ok代表设置成功
  • ex seconds:为键设置秒级过期时间
  • px milliseconds:为键设置毫秒级过期时间
  • nx:键必须不存在才设置成功,用于添加
  • xx:与nx相反,键必须存在才可以设置成功,用于更新

1.2、setex,setnx:

  • 语法:setex key seconds value
  • 语法:setnx key value
127.0.0.1:6379> exists hello            //hello这个不存在
(integer) 0
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> setnx hello redis        //因为key不存在直接sentnx失败
(integer) 0
127.0.0.1:6379> set hello jedis xx        //key存在可以直接set xx
OK
127.0.0.1:6379> get hello
"jedis"
127.0.0.1:6379> 

setnx和setxx的应用场景:

  • 由于redis的单线程处理机制,如果有多个客户端同时在线 setnx key value,根据setnx的特性只有一个客户端能设置成功,setnx可以作为分布式锁的一种实现方案。

1.3、获取值:get

  • 语法:get key
  • 返回值:不存在的键返回nil(空)

1.3.1、批量设置,批量获取

  • 语法(设置):mset key value [ key value … ]
  • 语法(获取):mget key [ key … ]
  • 返回值:如果有些键不存在,值位nil(空),结果按照传入顺序返回

  • 特点:批量操作可以提高开发效率,如果没有mget这样的命令要执行n系get耗时为n次命令时间+1次网络时间。使用mget只是一次操作的时间

1.4、计数:incr

  • 返回值:
  • 不是整数:返回错误
  • 值是整数:返回自增后的结果
  • 键不存在:返回值为0自增,结果为1。

1.5、同类计数命令:decr(自减),incrby(自增指定数字),decrby(自减指定数字),incrbyfloat(自增浮点数)

  • 语法:

incr:incr key-name

  • 将键存储的值加1操作

decr: decr key-name

  • 将键存储的值减1操作

incrby: incrby key-name amount

  • 将键存储的值加上整数amount

decrby:decrby key-name amount

  • 将键存储的值减去整数amount

incrbyfloat: incrbyfloat key-name amount

  • 将键存储的值加上浮点数amount(在redis2.6以上的版本可用)
127.0.0.1:6379> set string-add 23                //给创建key
OK
127.0.0.1:6379> incr string-add                 //String自增和自减操作
(integer) 24
127.0.0.1:6379> decr string-add
(integer) 23
127.0.0.1:6379> incrby string-add 3            //String与整数加减操作
(integer) 26
127.0.0.1:6379> decrby string-add 10
(integer) 16
127.0.0.1:6379> incrbyfloat string-add 4.3    //String加浮点数操作
"20.3"
  • 注意:当redis中操作了一个不存在的key,redis会将key设置当成0来操作
127.0.0.1:6379> get test1            //整数自增操作:默认将key设置为0
(nil)
127.0.0.1:6379> incr test1
(integer) 1
127.0.0.1:6379> get test1
"1"
127.0.0.1:6379> decr test2            //整数自减操作:默认将key设置为0
(integer) -1
127.0.0.1:6379> get test2
"-1"
127.0.0.1:6379> incrby test3 3        //整数加整数操作:默认将key设置为0
(integer) 3
127.0.0.1:6379> get test3
"3"
127.0.0.1:6379> decrby test4 4        //整数减整数操作:默认将key设置为0
(integer) -4
127.0.0.1:6379> get test4
"-4"
127.0.0.1:6379> incrbyfloat test5 2.3    //整数减浮点数操作:默认将key设置为0
"2.3"
127.0.0.1:6379> get test5
"2.3"

二、不常用命令:

2.1、追加值:append,可以向字符串尾部追加值

  • 语法:append key value
127.0.0.1:6379> set key hskjfsahfdjk
OK
127.0.0.1:6379> append key test-data
(integer) 21
127.0.0.1:6379> get key
"hskjfsahfdjktest-data"

2.2、字符串长度:strlen

  • 语法:strlen key
127.0.0.1:6379> get key
"hskjfsahfdjktest-data"
127.0.0.1:6379> strlen key
(integer) 21
127.0.0.1:6379> set leng "测试"
OK
127.0.0.1:6379> strlen leng        //每个中文占用3个字节
(integer) 6

2.3、设置并返回原值:getset

  • 语法:getset key value
  • 说明:返回之前的值
127.0.0.1:6379> get key
"hskjfsahfdjktest-data"
127.0.0.1:6379>  getset key getset-data
"hskjfsahfdjktest-data"
127.0.0.1:6379> get key
"getset-data"

2.4、设置指定位置的字符:setrange

  • 语法:setrange key offeset value
127.0.0.1:6379> get key
"test-data"
127.0.0.1:6379> setrange key 3 d        //将key中的第3个字符换成d(从0开始计算)
(integer) 9
127.0.0.1:6379> get key
"tesd-data"

2.5、获取部分字符串:ferange

  • 语法:gerange key start end
  • 说明:start和end分别是开始和结束的偏移量,便宜量从0开始计算
127.0.0.1:6379> get key
"tesd-data"
127.0.0.1:6379> getrange key 5 8    //获取key中第5到第8个字符(从0开始计算)
"data"

三、内部编码

  • 字符串类型的内部编码有3种:
  • int:8个字节的长整型
  • embstr:小于等于39个字节的字符串
  • raw:大于39个字节的字符串

  • redis会根据当前值的类型和长度决定使用哪种内部编码实现,如:

127.0.0.1:6379> set ange 23y12783618
OK
127.0.0.1:6379> object encoding ange
"embstr"
127.0.0.1:6379> set key 123
OK
127.0.0.1:6379> object encoding key
"int"

四、字符串使用场景:

4.1、缓存功能:

  • 说明:用户缓存数据读取,通过key从redis中读取用户数据,没有数据再从数据库中获取
public User getUserInfo(Long id){
    String key = "user_info:"+id;
    String value = redis.get(key);
    if (value !=null){
        //将value转换成User对象并返回
    }else{
        // TODO 从数据库中获取数据并返回
    }

}

4.2、计数

  • redis可以实现快速计数,查询缓存的功能,同时数据可以异步到其他数据源,用户每操作一次就会在redis中执行计数操作
long  incrCount(Long id){
    String key ="incr_count:"+id;
    return redis.incr(key);
}

4.3、共享session

  • 在负载均衡的情况下为了保证session在不同服务器上的数据同步,将session数据存放到redis中,这样就保证了每个服务器中获取到session数据都是一样的

4.4、限速

  • 在短信验证时会对用户手机进行验证,限制用户当天不能超过5次
public boolean checkPhone(String phone){
    String key ="msg_phone:"+phone;
    String isHase = redis.set(key, 1,"EX 86400","NX");

    if(isHase != null || reids.incr(key)<=5){
        retuen true;
    }else{
        return false;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_34231253/article/details/81127194
今日推荐