1、字符串(String)
1.1简介
- 描述:字符串是Redis中最基本的数据类型,用于存储二进制安全的数据,如字符串、整数、浮点数等。
- 最大长度:最大能存储512MB的数据。
- 应用场景:常用于缓存用户会话信息、页面片段等。
- 底层实现:Redis并没有使用C语言的原生字符串表示,而是使用了简单动态字符串(SDS)来存储字符串,这种数据结构在获取字符串长度、追加字符串等方面的操作复杂度为O(1)
1.2常见命令
- set < key>< value>:添加键值对
- get < key>查询对应键值
- append < key>< value>:将给定的值追加到key的末尾
- strlen < key>:获取值的长度
- setnx < key>< value>:只有在key不存在时,设置key-value加入到数据库
- setex < key> < timeout>< value>:添加键值对,同时设置过期时间(以秒为单位)
- incr < key>:将key中存储的数字加1处理,只能对数字值操作。如果是空,值为1
- decr < key>:将key中存储的数字减1处理,只能对数字值操作。如果是空,值为1
- incrby < key>< increment>:将key中存储的数字值增加指定步长的数值,如果是空,值为步长。 (具有原子性)
- decrby < key>< decrement>: 将key中存储的数字值减少指定步长的数值,如果是空,值为步长。 (具有原子性)
- mset < key1>< value1>[< key2>< value2>...]:同时设置1个或多个key-value值
- mget < key1>[< key2>...]:同时获取1个或多个value
- msetnx < key1>< value1>[< key2>< value2>...]:当所有给定的key都不存在时,同时设置1个或多个key-value值(具有原子性)
- getrange/substr < key>< start>< end> 将给定key,获取从start(包含)到end(包含)的值
- setrange < key>< offset>< value>:从偏移量offset开始,用value去覆盖key中存储的字符串值
- getset< key>< value>: 对给定的key设置新值,同时返回旧值。如果key不存在,则添加一个 key-value值
1.3注意
- Redis 中的字符串可以存储非常大的数据,最大可以达到 512MB。
- 尽管我们称之为“字符串”,但 Redis 的字符串是二进制安全的,这意味着你可以在其中存储任何数据,包括图片、序列化对象等。
- 当你使用
INCR
、DECR
、INCRBY
和DECRBY
命令时,Redis 会尝试将 key 的值转换为整数,如果无法转换(例如,key 的值不是整数或不存在),则这些命令会失败。 APPEND
命令可以用来在现有的字符串后追加数据,而不是替换它。STRLEN
命令返回的是字符串的字节长度,而不是字符数(这取决于你的字符串编码)。
2、哈希(Hash)
2.1简介
- 描述:哈希是一个键值对的集合,类似于其他编程语言中的字典或映射。
- 最大容量:每个哈希最多可以存储2^32 - 1个键值对。
- 应用场景:适合存储对象的属性信息,比如用户信息、商品信息等。
- 特点:每个哈希表内部都有一个哈希映射表,用于快速定位键值对。
2.2内部编码方式
- ziplist(压缩列表):当哈希对象同时满足两个条件时,使用ziplist编码:哈希对象保存的所有键值对的键和值的字符串长度都小于64字节;哈希对象保存的键值对数量小于512个。
- hashtable(哈希表):当哈希对象不能满足ziplist的条件时,就会使用hashtable编码。
2.3常见命令
- hset< key>< field>< value>[< field>< value>..1:用于为哈希表中的字段赋值,如果字段在hash表中存在,则会被覆盖
- hmset:用法同hset,在redis4.0.0中被弃用
- hsetnx< key>< field><value>:只有在字段不存在时,才设置哈希表字段中的值
- hget< key>< field> 返回哈希表中指定的字段的值
- hmget < key>< field>[< field>...]:获取哈希表中所有给定的字段值hgetall<key>:获取在哈希表中指定key的所有字段和值
- hexists <key>< field>:判断哈希表中指定的字段是否存在,存在返回1,否则返回0
- hkeys<key>:获取哈希表中所有的字段
- hvals< key>:获取哈希表中所有的值
- hlen<key>:获取哈希表中的field数量
- hdel< key>< field>[< field>...]:删除一个或多个哈希表字段
- hincrby<key>< field><increment>:为哈希表key中指定的field字段的整数值加上增加
- increment
- hincrbyfloat<key><field><increment>:为哈希表key中指定的field字段的浮点数值加上增加increment
3、列表(List)
3.1简介
- 描述:列表是一个有序的字符串集合,允许在列表的两端进行插入和删除操作。
- 底层实现:在Redis 3.2之前,List的底层实现是LinkedList或者ZipList。Redis 3.2之后,引入了LinkedList和ZipList的结合QuickList,使得List的底层实现更为高效。从Redis 7.0开始,ZipList被ListPack取代。
- 应用场景:常用于实现消息队列、任务队列等功能。
3.2特性与功能
- 有序性:列表中的元素是有序的,可以通过索引下标获取某个元素或者某个范围内的元素列表。
- 重复性:列表中的元素可以是重复的,即同一个值可以在列表中出现多次。
- 插入和删除:可以在列表的头部(左边)或尾部(右边)插入(push)或删除(pop)元素。
- 容量:一个列表最多可以存储2^32-1个元素,即约42.9亿个元素。
3.3常见命令
- lpush < key>< value1>[< value2>...]:从左侧插入一个或多个值
- lpushx< key>< value1>[< value2>...]:将一个或多个值插入到已存在的列表头部
- lrange <key>< start><stop>:获取列表指定范围内的元素,0左边第1位,-1右边第1 位,0 ~-1取出所有
- rpush< key>< value1>[< value2>...]:从右侧插入一个或多个值
- rpushx< key>< value1>[< value2>..]:将一个或多个值插入到已存在的列表尾部
- lpop<key>[count]:移除并获取列表中左边第1个元素,count表明获取的总数量,返回的为移除的元素
- rpop<key>[count]:移除并获取列表中右边第1个元素,count表明获取的总数量,返回的为移除的元素
- rpoplpush<source><destination>:移除源列表的尾部的元素(右边第一个),将该元素添加到目标列表的头部(左边第一个),并返回
- lindex< key>< index>:通过索引获取列表中的元素llen< key>:获取列表长度
- linsert<key>before after< pivot><element>:在< pivot>基准元素前或者后面插入<element>,如果key不存在,返回0。如果<pivot>不存在,返回-1,如果操作成功,返回执行后的列表长度
- lrem<key><count><element>:根据count的值,移除列表中与参数相等的元素
- ocount=0 移除表中所有与参数相等的值
- ocount>0 从表头开始向表尾搜索,移除与参数相等的元素,数量为count
- ocount<0 从表尾开始向表头搜索,移除与参数相等的元素,数量为count的绝对值lset<key><index><element>:设置给定索引位置的值
- ltrim< key>< start> < stop>:对列表进行修剪,只保留给定区间的元素,不在指定区间的被删除
- brpop < key> timeout:阻塞式移除指定key的元素,如果key中没有元素,就等待,直到有元素或 超时,执行结束。
4、集合(Set)
4.1简介
- 描述:集合是一个无序的、唯一的字符串集合,不允许重复元素存在。
- 操作:支持添加、删除和判断元素是否存在等操作。
- 应用场景:适合存储标签、用户关注列表等数据。
4.2特性
- 无序性:集合中的元素是无序的,即不保证元素的插入顺序。
- 唯一性:集合中的元素是唯一的,不存在重复的元素。
- 高效:集合的插入、删除和查找操作的时间复杂度都是O(1),即常数时间复杂度,这使得集合在处理大量数据时非常高效。
- 原子性:Redis的所有操作都是原子的,即在一个命令执行的过程中,不会被其他客户端打断,这保证了数据的一致性。
4.3常见命令
- sadd<key>< member>[< member>..]:将一个或多个成员元素加入到集合中,如果集合中已经
- 包含成员元素,则被忽略
- smembers<key>:返回集合中的所有成员。
- sismember<key><member>:判断给定的成员元素是否是集合中的成员,如果是返回1,否则返回0
- scard<key>:返回集合中元素个数
- srem< key>< member>[< member>...]:移除集合中一个或多个元素
- spop<key>[<count>]:移除并返回集合中的一个或count个随机元素
- srandmember<key>[<count>]:与spop相似,返回随机元素,不做移除smove<source><destination><member>:将member元素从source源移动到destination目标
- sinter< key>[< key>...]:返回给定集合的交集(共同包含)元素
- sinterstore<destination><key1>[< key2>..]:返回给定所有集合的交集,并存储到destination目标中
- sunion < key>[< key>...]:返回给定集合的并集(所有)元素
- sunionstore<destination><key1>[< key2>..]:返回给定所有集合的并集,并存储到destination目标中
- sdiff< key>[< key>..]:返回给定集合的差集(key1中不包含key2中的元素)
- sdiffstore<destination><key1>[< key2>..]:返回给定所有集合的差集,并存储到destination目标中蛍距
5、有序集合(Sorted Set)
5.1简介
- 描述:有序集合是一个有序的字符串集合,每个元素都会关联一个分数(score),通过分数可以对元素进行排序。同时,有序集合也保持了元素的唯一性。
- 应用场景:常用于排行榜、热门文章等场景。
- 底层实现:有序集合的底层实现主要依赖于跳跃表(SkipList)和哈希表(Dict),跳跃表用于维护元素的排序,哈希表则用于快速定位元素。
5.2基本特性
- 有序性:有序集合中的元素根据它们的分值进行排序,分值可以是重复的,但元素本身在集合中是唯一的。
- 唯一性:有序集合中的元素是唯一的,不允许有重复的元素。
- 分值:每个元素都关联一个double类型的分值,用于排序。
- 容量:有序集合中的成员数最多为2^32 - 1个(约42.9亿个元素)。
5.3常见命令
- zadd<key><score>< member>[< score>< member>..]:将一个或多个元素及其分数加入到有序集合中
- zrange < key>< min>< max> [byscore | bylex] [rev] [ limit offset count] [withscores]: 返回有序集合指定区间的成员,(byscore按分数区间,bylex按字典区间,rev反向排序(分数大的写前边小的写后边),limit分页(offset偏移量,count返回的总数),withscores返回时带有对应的分数)
- zrevrange<key>< start>< stop>[ limit offset count]:返回集合反转后的成员
- zrangebyscore <key>< min>< max> [withscores][ limit offset count]:参考zrange用法
- zrevrangebyscore< key>< max>< min> [withscores] [ limit offset count]:参考zrange用法
- zrangebylex<key>< min>< max>][ limit offset count]:通过字典区间返回有序集合的成员
- zrangebylex k2-+:减号最小值,加号最大值
- zrangebylex k2 [aa(ac:[中括号表示包含给定值,(小括号表示不包含给定值zcard < key>:获取集合中的成员数量
- zincrby<key><increment><member>:为集合中指定成员分数加上增量
- incrementzrem< key><member>[< member>...]:移除集合的一个或多个成员
- zcount<key>< min>< max>:统计集合中指定区间分数(都包含)的成员数量
- zrank< key>< member>:获取集合中成员的索引位置
- zscore < key>< member>:获取集合中成员的分数值