Redis 数据结构 字符串

    字符串类型是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{

                                //限速

                                }

            

                    


         








猜你喜欢

转载自blog.csdn.net/m0_37668842/article/details/80819659