一:String(字符串)

注:String是二进制安全的,意味着可以存储任何数据,包括.jpg图片以及序列化对象,但是redis中中字符串value最大不超过512M。

常用命令

1:set [key] [value];设置键值对

如果用set命令设置了一个重复的key,那么该key的value会覆盖原来的value

setnx [key] [value]

如果存在重复的key命令不会通过(利用其原子性)

mset [key1] [value1] [key2] [value2]……

同时设置多个key,如果存在重复的key就覆盖该key原来的value

msetnx [key1] [value1] [key2] [value2]……

同时设置多个key,如果存在相同的key,则命令不会通过

2:get [key];获取key对应的value

   mget [key1] [key2]……同时获取多个key的值

3:getrange [key] start stop 获取值的范围

4:setrange [key] [offset] [value] 用value覆盖从offset位置开始的值

5:append [key] 追加内容

6:setex [key] [seconds] [value] 设置key并且为key设置一个过期时间,单位是s

7:strlen [key] 该key对应得String长度。(这里要注意,会存在扩容问题,所以有时候会对结果造成误解)

8:incr [key] 对key对应的整型value值加1,返回的结果是最终的value值

   incrby [key] [increment] 在key对应的整形value的基础上加increment,并且返回最终的value值

9:decr [key] 对key对应的整型value值减1,返回的结果是最终的value值

   decrby [key] [increment] 在key对应的整形value的基础上减去increment,并且返回最终的value值

11:getset [key] [value] 返回原来key的value并且将新的value值覆盖原来的value值

10:扩容机制:当字符串小于1M时,内存不够时扩容一倍(加倍扩容)

                      当字符串长度大于1M时,内存不够会在原本的基础上每次扩容1M,最大为512M

11:String底层数据结构为简单动态字符串

二:List(列表)

1:lpush/rpush <key> <value1> <value2> <value3>…  创建一个列表,并且在里面从左至右添加元素,至少要有一个元素(原因是:键在人在,键亡人亡

2:lpop/rpop  <key> 从列表左边/右边 弹出一个元素 返回结果是该元素值

3:rpoplpush <key1> <key2> 从key1列表右边弹出一个值添加到key2列表左边

4:lrange <key> <start> <stop>按照索引位置获取元素,从左至右

5:lrange <key> 0 -1 获取该列表所有的元素

6:lindex <key> <index> 返回index位置的元素

7:lrem <key> <n> <value> 从左至右删除n个value值

8:llen <key> 返回列表长度

9:linsert <key> before <value> <newvalue>在value的前面插入newvalue值

10:lset <key> <index> <value>设置新的value值覆盖index位置原来的值,返回结果为ok

11:数据结构:在数据量不是很多的情况下使用的是一块连续的内存,即ziplist(压缩列表)

在数据量增多的一个情况下使用的是zipList+链表成为quickList(快速链表)

压缩列表结构,压缩列表详细解释可以看我另外的一篇文章

img

注:Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。本质上是一个双向链表,每一个节点就是一个zipList(一种顺序型数据结构)。 

三:set(集合)不存在重复元素

1:sadd <key> <valuee1> <value2> …创建集合并且添加元素

2:smembers <key> 取出集合中的所有值

3:scard <key> 取出集合中元素个数

4:srem <key> <member> 从集合中删除元素

5:spop <key> 从集合中随机弹出一个元素,不过该元素会被删除

6:srandmember <key> <n> 从集合中随机取出n个元素,不过不会被删除

7:smove <source> <destination> <value> 从集合中取出value转移到另外一个集合

8:sinter <key1> <key2> 返回两个集合的交集

9:sunion <key1> <key2> 返回两个集合的并集

10:sdiff <key1> <key2> 返回两个集合的差集 (key1中有的key2没有的)

数据结构:使用了dict字典,字典底层是用哈希表实现的

四:Hash(哈希)一个String’类型的feild和value的映射表

1:hset <key> <filed> <value> 给key集合中的field键赋值value

2:hget <key> <field>从key集合的feild中取出value

3:hmset <key> <field1> <value1> <field2> <value2>

4:hexists <key> <field> 查看集合中是否有field这个给定域

5:hkeys <key> 返回集合中所有的field域

6:hvals <key> 返回集合中所有的value值

7:hincrby <key> increment <filed> 给field域所对应的value值加1

8:hsetnx <key> <filed> <value> 添加元素,不过不允许有重复的field

底层数据结构实现:当field-value长度较短或者元素个数太少时,用zipList,否则用HashTable

五:zset(有序集合)

1:zadd <key> <scope1> <value1> <scope1> <value2> 将一个或者多个元素添加到集合中

2:zrange <key> <start> <stop> [WITHSCORES]  返回集合元素,下标在start和stop之间

3:zrem <key> <value> 删除指定元素

4:zincrby <key> <increment> <value> 在value对应的scope上增加increment

5:zrank <key> <value> 返回集合的排名

6:zcount <key> <min> <max> 返回该区间的集合元素的个数

底层数据结构实现:使用了hash(关联value和scope)和跳表(给value排序),关于跳表这种数据结构

可以看我其他文章。

 


版权声明:本文为qq_51294553原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_51294553/article/details/126752967