比较基础的命令不做过多赘述(例如string的set、get等),主要记录一下各类型的大概实现方式和需要费力记忆的命令,帮助理解和更好地运用redis各类型以解决工作中的问题。
需要注意的是:redis中各数据类型是不能嵌套的。不像编程语言中A类可以拥有成员属性B类。
1、string类型:
string类型是二进制安全的,因为在redis底层的实现中,string类型是一个结构体,内容如下:
struct sdshdr{
long len;
long free;
char buf[];
}
因为使用len记录了总长度,使用free记录了buf数组中剩余可用长度,所以不需要使用nil字符作为结束,从而实现二进制安全
在redis中,也使用string类型保存数字,从而拥有incr、decr等方法,具体实现细节隐藏在底层,不细表了。
mset命令:一次set多个key的值,但若失败一个,则整个命令失效(类似于事务机制,要么都成功,要么都不成功),不会出现部分成功部分失败的情况。
msetnx 命令:参考mset,但比mset多一个限制条件:若其中一个key已存在,则也视为事务失败
2、list列表:
列表在redis中使用双链表实现,但并不提供精确查找(精确查找需要遍历链表,时间复杂度为O(n) ),只能范围查找,所以更加适用于做各类排行榜、队列等。
lrange:获取指定区间的元素(只读)
ltrim:截取指定区间元素(只写),若成功,返回OK(不返回截取后的内容),会修改该列表
blpop/brpop,阻塞式地pop,但它有个特点是可以一次pop多个list,并且pop的顺序是从左到右(例如从list1-list2-list3的顺序),若list1存在内容,就会永远pop出list1的内容直到list1为空,再去pop出list2的内容,所以可用于实现优先级队列,同时它带有timeout属性(以秒为单位),故可结合起来实现带超时的优先级队列。若超时,返回的是nil(编程语言中为NULL或None,视语言而定)
3、set集合:
集合内的元素是无序的,在redis中集合实现的方式是通过hashtable,所以它查找和删除元素的时间复杂度为0(1),它主要应用场景是快速查找元素是否存在、存储不可重复的数据,例如维护一个网站的用户名记录,可快速获取该用户名是否已存在;集合一般用于做记录,例如网站中用户一天只能投票一次,就可以使用集合存储已经投过票的用户id,从而避免重复投票
spop:删除并返回set中的一个随机元素