Redis——String类型详解

概述

Redis中的字符串直接按照二进制的数据存储,不会有任何的编码转换,因此存放什么样,取出来的时候就什么样。而MySQL默认的字符集是拉丁文,如果插入中文就会失败

Redis中的字符串类型不仅可以存放文本数据,还可以存放整数,JSON,xml,图片,视频,音频等等(但是音频视频的体积很大,Redis中对String类型限制大小为512mb)

常用命令

SET

通过自动补全可以看到set命令的完整语法
在这里插入图片描述
Redis文档中语法格式说明:

符号 解释
[ ] 代表可选项,[ ]和[ ]之间可以同时存在
| 代表或者的意思,多个|只能出现一个

value后面的ex|px代表着过期时间
也就是说

set key value ex 10

等价于

set key value
expire key 10

通过简化代码数量,减少网络通信的次数,提升显效率
并且,一句代码还可以保证原子性,Redis分布式锁中会有所体现,后面的blog会详细讲解
Redis——String类型详解_第1张图片
除此以外,还可以这样写set命令

setnx
setex

如果key存在,新的value覆盖了旧的value,数据的类型可能会被改变,key的生存时间也会失效

演示代码

使用flushall可以清除Redis中所有key
在这里插入图片描述

ex

Redis——String类型详解_第2张图片

nx

Redis——String类型详解_第3张图片

xx

Redis——String类型详解_第4张图片

setnx

setnx key seconds

Redis——String类型详解_第5张图片

setex

setex key value seconds

Redis——String类型详解_第6张图片

psetex

psetex key millionseconds

Redis——String类型详解_第7张图片

GET

获取key对应的value
在这里插入图片描述
需要注意的是,get只适用于字符串类型,如果是其他类型则会报错
在这里插入图片描述

MSET

在这里插入图片描述

一次插入多个键值对,key和value交替写,时间复杂度O(N),N是key的数量

MGET

在这里插入图片描述
一次获取多个value,时间复杂度O(N),N是key的数量
Redis——String类型详解_第8张图片

增减命令

将string类型的value当作数字,进行加减操作,时间复杂度都是O(1)

命令 操作
incr value + 1
incrby value + n
decr value - 1
decrby value - n
incrbyfloat value +/- 小数

incr

incr key

此时的key必须是一个64位内的整数,操作的返回值就是value+1后的结果(相当于++i)
Redis——String类型详解_第9张图片
如果key不是合理整数则报错
Redis——String类型详解_第10张图片
如果直接incr一个不存在的key,那么就会把这个key的value当作0
在这里插入图片描述

incrby

incrby key increment

在这里插入图片描述
同理,如果针对一个不存在的key进行incrby,那么会将这个key的value当作0处理

decr

逻辑和incr一致

decr key 

decrby

逻辑和incrby一致

decrby key decrement

incrbyfloat

其他逻辑和incrby一致,但是由于没有decrbyfloat,因此只能通过incrbyfloat key -n的操作来实现减法

incrbyfloat key increment

append

如果key存在,拼接key对应的value和给定字符串的内容,返回拼接完的字符串有多少个字节(utf8中的一个汉字通常是3个字节)

append key value

Redis——String类型详解_第11张图片
如果key不存在,那么和直接使用set一样
在这里插入图片描述
如果插入汉字,取出的时候客户端不会自动翻译二进制数据,而是将二进制转换为十六进制
在这里插入图片描述
可以在Redis启动的时候加上–raw的选项,就可以解决上述问题了,退出Redis使用ctrl + d
在这里插入图片描述

getrange

相当于Java中的substring,切分value中的部分字符串,范围由start和end确定(左闭右闭区间)

Redis中的下标从1开始,并且支持负数,如果是-1那就代表倒数第一个元素 = len - 1

getrange key start end

Redis——String类型详解_第12张图片
但是,由于中文一般是3个字节,那么在使用getrange后,切割的结果可能不是一个完整的汉字了
在这里插入图片描述

setrange

将字符串中的部分子串替换为别的内容,返回值是替换之后的字符串长度

setrange key offset value

其中的offset是从第几个字节开始替换,替换的长度就是value的长度
Redis——String类型详解_第13张图片
如果对一个不存在的key进行setrange,并不会报错,而是在偏移量之前添加空字节0x00
Redis——String类型详解_第14张图片

同样的,如果value是一段中文,那么setrange可能会出错

strlen

获取字符串的长度,单位是字节,如果value不是string类型,则报错,如果key不存在,返回0

strlen key

Redis——String类型详解_第15张图片

String的编码方式

编码方式 说明
int 64位/8字节的整数
embstr 压缩字符串 小于等于39个字节的字符串
raw 普通字符串 大于39个字节的字符串

通过object encoding key可以查看对应key的编码方式
Redis——String类型详解_第16张图片
在Redis中,存储小数其实和存储一个字符串一样,因此每次对小数进行算数操作,都需要把字符串转换为小数,然后再进行计算,算完再转为小数
在这里插入图片描述

string类型的应用场景

作为缓存直接返回数据

Redis——String类型详解_第17张图片
上述策略中,随着时间推移,越来越多的key从mysql中存入Redis,使Redis的数据变得过多,那么有如下两种解决方案

  1. 设置key的过期时间
  2. Redis提供淘汰策略

计数功能

Redis——String类型详解_第18张图片
Redis中只记录视频的播放次数,并且异步同步数据到统计数据的数据库

共享会话

Redis——String类型详解_第19张图片
http中的cookie是用来实现用户信息的保存的,其需要session的配合完成。服务器这边存储了用户的数据,而cookie是让浏览器存储用户的身份标识(sessionId)

但如果应用了分布式系统,存在多个应用服务器。与用户登录时可能将用户会话信息存储在a服务器中,但是用户下次访问请求可能发送到c服务器中,而c服务器中没有用户的会话信息

解决方法是:所有的服务器都把用户的会话信息存放在Redis中

手机验证码

服务器将用户的手机号当作key,验证码当作value存放在Redis中,并设置过期时间,用户在指定时间内提交验证码给服务器,服务器通过手机号向Redis获得正确的验证码,并与用户发送过来的进行比对,返回true或false

你可能感兴趣的:(数据库,redis,redis,数据库,缓存)