1.Redis中的string
注意本文以及之后讲的redis的类型但是指的value的类型,所有的key都是string
Redis中的字符串,直接就是按照二进制数据的方式存储的,不会做任何的编码转换,这里相对于mysql就比较好(个人感觉),因为mysql默认的字符集是拉丁文插入中文会失败。
string不仅可以存储文本数据还可以存储整数、普通文本字符串、JSON、xml、二进制数据,这里值得一提的是redis对于string的类型限制了大小最大为512M,这是因为redis是单线程其希望进行的操作都比较快速。
2.String常用操作
2.1 SET
SET key value [expiration EX seconds | PX milliseconds] [NX | XX]
redis文档给出的语法格式说明:[]相当于一个独立的单元,表示可选项(可有可无),|表示或者的意思,[]和[]之间可以同时存在
对于第一个中括号其指的是设不设置过期时间,EX表示设置的时间单位是s而PX表示设置的时间的单位是ms。
对于第二个括号中的NX表示如果key不存在才设置,如果key存在则不设置(返回nil),而XX表示key存在才设置(相当于更新key中的value),如果key不存在则返回nil
2.2 失去年终奖小技巧
清除redis上所有的数据的操作,这就等价于删库了(drop database)
FLUSHALL //轻易不要使用,不然废了,但是学习中可以随便用
2.3 GET
GET key //这个命令还是比较简单的
· 对于GET来说,只是支持字符串类型的value,如果value是其他类型,使用GET获取就会报错,下面我对list类型的value使用get就出现了报错
2.4 MGET 以及 MSET
MGET key [key ...]
MSET key value [key value ...]
对比于上面的set和get其实mset和mget的区别在于一次操作多组键值对。
对于多组key和value其实mset和mget是高效的,这是因为我们的这些命令其实是需要通过网络来发送给redis的服务端的,那么相对于多次发送的set和get显然是一次发送多组数据的mset和mget更高效
但是一次设置太多的数据依旧可能会导致redis阻塞。
2.5 String中存储的是数字时可以使用的操作
2.5.1 value是整数
incr:针对value+1
incrby:针对value+n
decr:针对value-1
decrby:针对value-n
这四个操作的返回值都是相应操作后的值,值得一提的是上面的操作如果key不存在会将key视为0创建并进行操作。
其实incrby也可以用来实现减法,这就好比加上一个负数。同样的decrby也可以用来实现加法
2.5.2 value是浮点数
incrbyfloat:把key对应的value进行+-运算,运算的操作数可以是浮点数,但是并没有提供decrbyfloat这样的命令,就只能同加上负数来实现减法
这里猜测为什么没有提供减法版本,可能是因为使用redis进行的计数操作一般都是针对整数进行的。
这里因为是多个客户端对接一个服务端那么上面的这些对数字操作的命令会不会存在线程安全的问题呢?就比如在c++中我们起了两个线程对同一个变量都进行++10000次但是结果并不是20000一般结果都是比20000小的。但是其实是没有问题的这是因为redis是一个单线程。
2.6 字符串操作
2.6.1 获取字符串的长度
APPEND KEY VALUE
append返回值的长度单位是字节,这是因为redis的字符串并不会对字符编码做任何处理,换而言之就是redis只认识字节不认识字符。
append可以用来设置key,如果key已经存在那么append会将value追加到key原来的value中
2.6.2 从某个位置开始替换字符串
SETRANGE key offset value
offset表示从哪个位置开始,value表示替换的字符串。
2.6.3 截取字符串
GETRANDGE key start end
这个区间是左闭右闭的,这里确实需要注意,因为C++中的区间是左闭右开的,并且这里的下标是支持负数的对应关系如下,简单来说负数就是len-1位置处的元素
3.string内部的三种编码格式
int:64位/8字节的整数
embstr:压缩字符串。适用于比较短的字符串
raw:普通字符串。适用于表示更长的字符串。
object encoding 可以查看value的编码格式