Reids快速入门
String
是什么?
String就是字符串,它是Redis中最基本的数据对象,最大为512MB。
基本操作
写操作
SET
语法:SET key value
功能:设置一个key的值为特定的value,成功则返回OK。
String:对象的创建或者更新都是该命令。
1 | 127.0.0.1:6379>SET str cat |
SETNX
语法:SETNX key value
功能:用于在指定的ky不存在时,为key设置指定的值,返回值0表示「key存在」不做操作,1表示设置成功。
如果对存在的Key,调用SETNX:
1 | 127.0.0.1:6379>SETNX str fish |
对不存在的key,调用SETNX:
1 | 127.0.0.1:6379>SETNX strmart fish |
DEL
语法:DEL key[key]
功能:删除对象,返回值为删除成功了几行。
1 | 127.0.0.1:6379>DEL str |
读操作
GET
语法:GET key
功能:查询某个key,存在就返回对应的value,如果不存在返回nil。
1 | 127.0.0.1:6379>get str |
MGET
语法:NGET key [key…]
功能:一次查询多个key,如果某个key不存在,对应位置返回nil。
1 | 127.0.0.1:6379>MGET str strmart |
底层实现
三种编码
String有三种编码方式:
INT编码:这个很好理解,就是存一个整型,可以用long表示的整数就以这种编码存储;
EMBSTR编码:如果字符串小于等于阈值字节,使用EMBSTR编码(连续内存);
RAW编码:字符串大于阈值字节,则用RAW编码(不连续内存)。
随着我们的操作,编码可能会转换:
INT->RAW:当存的内容不再是整数,或者大小超过了Iong的时候;
EMBSTR->RAW:任何操作之后EMBSTR都会变成RAW,原因前面有解释。
sdshdr
EMBSTR编码和RAW编码由redisObject
和sdshdr
这两部份构成,它解决了C语言中字符串的三个问题:
- 每次计算字符串长度的复杂度为O(N);
- 对字符串进行追加,需要重新分配内存;
- 非二进制安全。
从SDS的结构,我们很容易看出SDS是如何对症下药解决问题的:
- 增加长度字段len,快速返回长度;
- 增加空余空间(alloc-len),为后续追加数据留余地;
- 不再以’\0’作为判断标准,二进制安全。
LIST
是什么?
Redis List是一组连接起来的字符串集合,List最大元素个数是2^32^ -1。
基本操作
写操作
LPUSH
语法:LPUSH key value [value …]
功能:从头部增加元素,返回值为List中元素的总数。
1 | 127.0.0.1:6379> LPUSH listbz s1 s2 s3 |
RPUSH
语法:RPUSH key value [value …]
功能:从尾部增加元素,返回值为List中元素的总数。
1 | 127.0.0.1:6379> RPUSH listbz s5 |
LPOP
语法:LPOP key
功能:(头部)移出并获取列表的第一个元素。
1 | 127.0.0.1:6379> LPOP listbz |
RPOP
语法:RPOP key
功能:(尾部)移出并获取列表的最后一个元素。
1 | 127.0.0.1:6379> RPOP listbz |
DEL
语法:DEL key [key …]
功能:删除对象,返回值为删除成功了几行。
1 | 127.0.0.1:6379> DEL listbz |
读操作
我们使用如下数据,构造集合用于读操作的学习:
LLEN
语法:LLEN key
功能:查看List的长度,即List中元素的总数。
1 | 127.0.0.1:6379> LLEN listbz |
LRANGE
语法:LRANGE key start stop
功能:查看start到stop为角标的元素。
1 | 127.0.0.1:6379> LRANGE listbz 0 1 |
start、stop如果为负数,表示倒数第几个元素:
1 | 127.0.0.1:6379> LRANGE listbz -2 -1 |
底层实现
3.2版本之前,List对象有两种编码方式,一种ZIPLIST(紧凑内存),另一种是LINKEDLIST。
当满足如下条件时,用ZIPLIST编码:
- 列表对象保存的所有字符串对象长度都小于64字节;
- 列表对象元素个数少于512个。
ZIPLIST
SET
是什么?
Redis的Set是一个不重复、无序的字符串集合。
基本操作
写操作
SADD
语法:SADD key member [member。。]
功能:添加元素,返回值为成功添加了几个元素
1 | 127.0.0.1:6379> SADD setniuniu aa bb cc |
SREM
语法:SREM key member [member …]
功能:删除元素,返回值为成功删除了几个元素
1 | 127.0.0.1:6379> SREM setniuniu aa |
读操作
SISMEMBER
语法:SISMEMBER key member
功能:查询元素是否存在
1 | 127.0.0.1:6379> SISMEMBER setbz aa |
SCARD
语法:SCARD key
功能:查询集合元素个数
1 | 127.0.0.1:6379> SCARD setbz |
SMEMBERS
语法:SMEMBERS key
功能:查看集合的所有元素。
1 | 127.0.0.1:6379> SMEMBERS setbz |
SSCAN
语法:SSCAN key cursor [MATCH pattern] [COUNT count]
功能:查看集合元素,可以理解为指定游标进行查询,可以指定个数,默认个数为10
例子1:从0号位置开始查询,默认10个
1 | 127.0.0.1:6379> SSCAN setniuniu 0 |
例子2:使用MATCH模糊查询
1 | 127.0.0.1:6379> SSCAN setniuniu 0 MATCH 1* |
SINTER
语法:SINTER key [key …]
功能:返回在第一个集合里,同时在后面所有集合都存在的元素。(第一个集合为准的并集)
1 | 127.0.0.1:6379> SINTER setniuniu setmart |
SUNION
语法:SUNION key [key …]
功能:返回所有集合的并集,集合个数大于等于2
1 | 127.0.0.1:6379> SUNION setmart setniuniu |
SDIFF
语法:SDIFF key [key …]
功能:返回第一个集合有,且在后续集合中不存在的元素,集合个数大于等于2,注意,是以第一个集合和后面比,看第一个集合多了哪些元素。
1 | 127.0.0.1:6379> SDIFF setniuniu setmart |
底层实现
当满足以下条件时使用INTSET编码:
- 集群元素都是整数
- 元素数量不超过512个
否则用HASHTABLE编码。
优缺点:
INTSET排列比较紧凑,内存占用少,但是查询时需要二分查找。
HASHTABLE查询一个元素的性能很高,能O(1)时间就能找到一个元素是否存在。