Redis-String的基本介绍

目录

1、set   O(1)

2、get   O(1)

3、mset   O(N)--N指的是新增的键值对的个数

4、mget     O(N)--N指的是查询的键值对的个数

5、incr incrby decr decrby incrbyfloat -----O(1)

6、append --O(1)

7、getrange --O(1)

8、setrange O(1)

9、strlen O(1)

string在redis中的三种编码方式


我们都知道redis存储的是键值对,键一般都是字符串,但是值就有很多类型了,比如:string,list,hash,set,zset等等,今天我要分享的是string相关的一些语法以及基本使用,最后会介绍string的一些主要的应用场景,以后也会慢慢分享其他的数据类型的用法,本人才疏学浅,想要真正的了解redis相关的知识可以前往redis官方。

redis对于string的存储都是以二进制的形式,那就意味着你可以去存很多类型的值:整数,字符串,json,xml,音频等等,但是我们一般不会存视频,因为redis对于string值的大小也有约束,是512MB,我们一般一个视频动辄就是一两个GB,所以我们不会去存视频,就是你只有500MB,小于约束的512MB,我们也不是怎么放,还记得redis的特点就是存取键值对的速度就是要快,况且redis的客户端和服务器是通过网络通信并且是单线程的,一但通信的负载很大,就会让后面的很多命令都阻塞,要是是你自己的redis服务器就还好,影响的只是你自己的服务器,如果是在生产环境这样,就可能会导致程序好像挂了一样,无法做出响应,引发一系列的问题......

在分享命令之前,要先知道命令中的一个潜规则:

[]表示可有可无;

| 表示只能选一个,不能同时存在;

[]和[]可以同时存在;

1、set   O(1)

        在这之前已经分享redis的一些常用命令,其他就包含set和get,从字面意思就可以看出:set就是新增一个键值对,get就是去获取key对应的value值;

        set key value [ex s|px ms][nx|xx]

        set是关键字,意思是去新增一个key-value的键值对,默认key和value都是字符串(当然redis会对value的类型去存储,后面我会在分享string的一些编码方式:int,embstr,raw);

        key就是你可以输入一个字符串,用于标识一个键值对,并且这个键在整个redis中是唯一的;

        value你可以属于任何类型的字符,中文,英文,数字以及上面提到的,只要是能用二进制表示的都可以,不过我们一般输入的只有字符串,数字,json等等;

        ex意思是你可以在设置这个键值对的时候给这个键值对设置一个过期时间,ex 后面属于一个整数,单位是秒;px意思也是设置一个过期时间,不过单位是毫秒;所以你可以选择要不要设置一个过期时间,如果你要设置过期时间,你只能选择设置秒还是毫秒;

        nx表示只有这个key不存在,才能添加成功,如果key存在,就返回nil(相当于null,NULL,None),表示设置失败;

        xx表示只有这个key存在,才能添加成功,而且我们是用新的value去覆盖原先的value;如果key不存在,就返回nil;

2、get   O(1)

        get key

        get的用法就比较简单了,get key就是去redis中获取key对应的value的值,返回的就是value的值,如果key不存在,就返回一个nil;

        值得注意的是:get命令只能去获取value为字符串的,如果是指的类型是list,set或者其他类型会报错;如下图,key3的value是list,就会报错

3、mset   O(N)--N指的是新增的键值对的个数

        mset key1 value1 key2 value2 key3 value3

        mset就是一次性的去设置多个多键值对,按理说可以一次性的添加很多个键值对,一万个都可以,但是我们也不会这么做,考虑的还是网络通信的问题,数据量太大,容易造成服务器阻塞;

        但是如果你要添加几个键值对而且要快的话,建议使用这个命令,也不是多使用几次set,一次set就是一次网络开销,你十次就是十次网络开销,但是你使用mset就只有一次网络开销,TCP连接会经历封装和拆包,开销还是蛮大的;

4、mget     O(N)--N指的是查询的键值对的个数

命令返回所有(一个或多个)给定 key 的值。 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 

5、incr incrby decr decrby incrbyfloat -----O(1)

        incr key,

        incr表示将value类型为整数的值+1,比如key 的value原来是3,incr key,那么key的value就是4,增加成功就会返回增加之后的value的值;如果key不存在,就会初始化key的value为0,再执行incr操作,返回1;

       incrby key n(整数) 表示将值增加n,可以随意的增加,只要是8个字节能够表示的整数能够存下,就可以增加成功,返回修改成功后的值;

       decr key,就是将key存的value的整数值-1,返回修改后的值;

       decrby key n,就是将key存的value的整数值-n,返回修改后的值;

        incrbyfloat key float,这个指令表示你可以将key存的值加上一个浮点数,你也可以选择加上一个整数,不过如果是整数的话就相当于incrby;

值得注意的是:没有decrbyfloat,因为你incrby你可以选择加上一个负数,decrby你可以选择减去一个正数,incrbyfloat你可以选择加上一个负数(负整数,负浮点数);

6、append --O(1)

        append就是在key对应的value后面添加上字符串,返回添加成功够的字符串的字节数,没看错,就是字节数,前面说到redis存的都是二进制数据;如果你添加的是两个中文,返回的长度要在原来value的字节数的基础上+6,一个中文占三个字节;比如你添加的是你好两个中文,redis会将“你好”使用utf-8编码转码存储起来,如果你使用get去获取中文的value,展示的也是utf-8编码后的十六进制的样式;

查询utf-8表,可以证明确实如此:

如果你是用的xshell这样的方式去连接redis服务器的话,如果你想在xshell上输入get key,看到的是中文的话,你可以在使用redis-cli客户端去连接服务器的时,在后面加上--raw(redis-cli --raw)

        如果可以key不存在,效果就相当于set;

7、getrange --O(1)

        getrange key start end

        就是去获取key对应的value的字节下标是start到end的子字符串,包含start和end,也就是前闭后闭区间的,这就意味着如果你存取的是中文的话,下标不合适就会返回一串乱码,如果是数字或者英文中文的话就正常返回;比较特殊的是下标可以是负数,-1就表示字符串的最后一个字节,-2就表示倒数第二个字节,可以用len-1,len-2,不去看len来记忆

8、setrange O(1)

        setrange key offset  value

        会根据value的长度去替换key对应的value从offset下标开始的字符串,相信下图你们就会知道怎么使用了?

如果key不存在,效果相当于set,只不是offset之前的字节要被替换成x00(一个字节)

 

9、strlen O(1)

       strlen key求的是key对应的value长度,不过不是字符长度,是字节长度;

        如果可以不存在就返回0;

        如果value数据类型不是string,就报错;

value为string的相关命令常用的大概就是这些了,更详细的可以去查看官方的文档;

string在redis中的三种编码方式

接下来说一下string在redis中的三种编码方式:int、embstr,raw

如何查看是什么编码方式呢?object encoding key就可以查看key对应的value的编码方式;

如果value是整数,redis就会用int去编码value,方便进行计数操作;

如果value的长度小于等于redis配置的长度,redis就回去压缩string的,即用embstr的方式编码;

如果value长度大于redis配置的长度,redis就还是用raw的方式编码;

这里不告诉你们这个配置的长度是多少,是因为我不希望你们记住这个长度,因为这个长度我们可以根据业务的实际情况去配置的,也就是这个数字是可变的,只要记得在什么情况下会去使用三种编码方式即可;

那为什么redis会根据字符串的字节长度去用两种方式来编码呢?主要还是为了节约空间,能够存下更多数据,因为对于redis存的很多string类型的value来说,字节长度很多都是挺小的,比如只是存用户的信息,验证码等等比较短的数据,redis使用更节约空间的embstr,那就可以去存下更多的数据;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a添砖Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值