概述
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会详细讲解
除此以外,还可以这样写set命令
setnx
setex
如果key存在,新的value覆盖了旧的value,数据的类型可能会被改变,key的生存时间也会失效
演示代码
使用flushall可以清除Redis中所有key
ex
nx
xx
setnx
setnx key seconds
setex
setex key value seconds
psetex
psetex key millionseconds
GET
获取key对应的value
需要注意的是,get只适用于字符串类型,如果是其他类型则会报错
MSET
一次插入多个键值对,key和value交替写,时间复杂度O(N),N是key的数量
MGET
一次获取多个value,时间复杂度O(N),N是key的数量
增减命令
将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)
如果key不是合理整数则报错
如果直接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
如果key不存在,那么和直接使用set一样
如果插入汉字,取出的时候客户端不会自动翻译二进制数据,而是将二进制转换为十六进制
可以在Redis启动的时候加上–raw的选项,就可以解决上述问题了,退出Redis使用ctrl + d
getrange
相当于Java中的substring,切分value中的部分字符串,范围由start和end确定(左闭右闭区间)
Redis中的下标从1开始,并且支持负数,如果是-1那就代表倒数第一个元素 = len - 1
getrange key start end
但是,由于中文一般是3个字节,那么在使用getrange后,切割的结果可能不是一个完整的汉字了
setrange
将字符串中的部分子串替换为别的内容,返回值是替换之后的字符串长度
setrange key offset value
其中的offset是从第几个字节开始替换,替换的长度就是value的长度
如果对一个不存在的key进行setrange,并不会报错,而是在偏移量之前添加空字节0x00
同样的,如果value是一段中文,那么setrange可能会出错
strlen
获取字符串的长度,单位是字节,如果value不是string类型,则报错,如果key不存在,返回0
strlen key