redis入门——常用命令以及基本数据类型

本文详细介绍了Redis中的各种核心命令,包括哈希、列表、集合和有序集合的使用,强调了它们的时间复杂度、应用场景和注意事项,指出在生产环境中应谨慎使用可能影响性能的O(n)操作。
摘要由CSDN通过智能技术生成
  1. SETNX key value官方说明 O(1) short for “SET if Not eXists”.

  2. MSET key value [key value ...]官方说明 O(n) 批量设置key的值,这个还是有使用场景的,批量设置虽然是O(n),但是节约了网络IO

  3. MGET key [key ...]官方说明 O(n) 批量获取一堆key的值,使用场景同样是解决网络io,但是请求的key如果超级多,也会造成阻塞

  4. INCR key官方说明 O(1) key++再返回,如果key不存在,那么会先创建一个=0的key 然后再++,也就是直接返回1,这个可以做分布式环境的原子计数器。

  5. DECR key官方说明 O(1) 跟上面那个相反 这个是减减操作,如果key不存在,那会直接返回-1

  6. INCRBY key increment官方说明 O(1) 可以设置每次加几的累加器

  7. DECRBY key decrement官方说明 O(1) 可以设置每次减几的累减器

  8. APPEND key value官方说明 O(1) 为key以字符的形式拼接上value,如果key不存在,第一次拼接之后,key的值等于value的值,需要注意的是,一个中文的汉字算3个长度,也就是说"1我"的长度为4

  9. STRLEN key官方说明 返回字符串的长度,如果key不存在,那就返回0,如果包含汉字,那一个汉字算3个长度。

  10. SETRANGE key offset value官方说明 O(1) 从offset开始修改key的值,offset从0开始计算,如果key本身不存在,同时offset不等于0,那么前面会用空格补全

  11. GETRANGE key start end官方说明 O(n) 返回key的start到end的值,相当于字符串截取,从左到右截取时,从0开始计算位置。从右到左截取时从-1开始计数,getrange k1 0 -1=get k1

应用场景及注意事项

  1. value的最大值是512M

  2. 一般用来做共享session的存储

  3. 使用INCRDECR可以实现原子计数器,从而还可以实现限流的功能

  4. 从时间复杂度上看,大部分命令都是O(1)的,可以放心使用,但是像del、mset、mget、getrange这些都是O(n)的,使用时需要确认好应用场景以及使用方式。

哈希


首先,画个图理解一下哈希这种数据结构,当执行hget时,我们可以从redis中获取到一个哈希表,这个哈希表中的键用field来标识,值用value来表示。

哈希表

常用命令

  1. HSET key field value [field value ...]官方说明 如果只设置一个field的value,那么时间复杂度就是O(1),如果设置多个,那就是O(n)了

  2. HGET key filed官方说明 O(1) 从key对应的哈希表中获取filed的值

  3. HGETALL key官方说明 O(n) 获取key对应的哈希表的所有内容,如果这个哈希表很大,那很可能造成redis阻塞

  4. HSCAN key cursor [MATCH pattern] [COUNT count]官方说明 O(n) 虽然说这个也是O(n)的,但是由于HSCAN是分批次的同时可以指定返回条数,所以会好很多

应用场景及注意事项

  1. 从时间复杂度上说:hdel、hmget、hmset、set都跟field的个数有关,而hkeys、hgetall、hvals都跟field的总数有关。

public class User {

String name;

int age;

String id;

}

hset user:1 name 张三 age 12 id fdjskla

这样做的优点是简单直观,使用合理可减少内存空间的消耗,缺点是需要控制ziplist与hashtable两种编码的转换,而且hashtable会消耗更多的内存。同样是上面的例子,我们也可以使用字符串来存储,字符串存储有两种方案:

set user:1:name 张三

set user:1:age 12

set user:1:id fdjskla

优点:简单直观,每一个key对应一个值

缺点:键数过多,占用内存多,user信息过于分散,一般不用于生产环境

set user:1 serialize(userInfo);

优点:编码简单,如使用序列化合理内存使用率高

缺点:序列化与反序列化有一定开销,更新属性时需要吧userInfo全部取出来进行反序列化,更新后再序列化到redis

列表


列表用来存储多个有序的字符串,一个列表可以存放2的32次方-1个元素,一般来说,列表的操作是区分从左到右,还是从右到左的

list

常用命令

  1. RPUSH key element [elements...]官方说明 O(n) 从右侧(right)开始push数据到list中,相当于我们常用的add操作。push几个,时间复杂度就是O(几)

  2. LPUSH key element [elements...]官方说明 O(n) 从左侧(left)开始push数据到list中,相当于add(0,element)。这样也是,push的数据越多,时间复杂度越高

  3. LRANGE key start end官方说明 O(S+N) 需要注意的是,这里的L并不是left的意思,而是指list,LRANGE的具体用法与GETRANGE类似,这里就不说了。

  4. LINSERT key BEFORE|AFTER pivot element官方说明 O(n) 这里的L也是指list意思。意思是在某一个元素的前面或后面插入另一个元素,时间复杂度取决于pivot的位置。

  5. LPOP key [count]官方说明 O(n) 从左侧(left)弹出count个元素,count的默认值为1,时间复杂度取决于要返回的元素的个数。

  6. RPOP key [count]官方说明 O(n) 从右侧(right)弹出count个元素,count的默认值为1,时间复杂度取决于要返回的元素的个数

  7. LREM key count element官方说明 O(n+m) 这里的L是list的意思,当count>0,列表从头到位查找并删除元素,当count<0时,列表从尾到头遍历并删除元素,当count=0时,删除列表中的所有element。时间复杂度取决于列表中元素个数n和要删除的元素个数m

  8. LSET key index element官方说明 O(n) 这里的L也是list的意思,当index>=0时,代表从头到尾定位并设置元素,当index<=-1时,代表从尾到头定位并设置元素,感觉这个就是LPUSH+RPUSH的结合,如果index=0或index=-1,则时间复杂度为1。

  9. LINDEX key index官方说明 O(n) 返回列表中index位置的元素,这样也是根据index是否大于0来区分检索方向的。

  10. LLEN key官方说明 O(1) 返回key对应的列表的元素个数,如果key已存在,但是不是列表,那么会抛出异常,如果key不存在或key是个空列表,那么会返回0。

  11. BLPOP key [keys...] timeout官方说明 O(n) 阻塞式(blocking)LPOP,如果key不存在,或者key指向的list为空,则当前命令会阻塞timeout秒,当timeout=0时,代表阻塞无限久。redis 6.0以后,timeout是double类型而不再是int。当同时存在多个监听的key时,如果有一个key对应的列表不为空,那么就会返回那个列表中的元素,如果所有的列表都为空,那么就会阻塞。

  12. BRPOP key [keys...] timeout官方说明 O(n) 阻塞式(blocking)RPOP

应用场景

  1. 队列的阻塞式特性可以当做简单的消息中间件

  2. 生产者—>消费者

在这个模型中,生产者执行rpush list:1 id1 id2 id3, 消费者执行blpop list:1 0,当存在可消费的id时,消费者不会阻塞,但是如果没有可消费的id,那消费者就会陷入阻塞,直到有人调用了rpush list:1 id4

  1. 消息广播

服务A启动后,执行brpop list:A 0监听队列A,同时执行rpush queueNameList list:A注册自己的监听队列,然后服务B启动,执行brpop list:B 0开始监听队列B,同时也注册自己rpush queueNamelist list:B,这时,如果服务C要通知服务A和服务B,那么服务C执行lrange queueNameList 0 -1获取到一个队列列表,然后依次执行rpush list:A 消息内容 rpush list:B 消息内容这时服务A与服务B就都收到消息了。

  1. 如果多个服务同时监听了一个队列,那么一个消息只能被一个服务消费。

  2. 由于list是按插入顺序排序的,所以还可以做时间轴

  3. LPUSH+LPOP=STACK(栈) 先进后出

  4. LPUSH+RPOP=QUEUE (队列) 先进先出

  5. LPUSH+LTRIM=CAPPEND COLLECTION(有限集合)

  6. LPUSH+BRPOP=MESSAGE QUEUE(消息队列)

集合


集合和我们常用Set还是很类似的,也是一个容器,容器内不能存放相同的元素,同时,在这个容器内的元素是无序的。

集合

常用命令

  1. SADD key member [members...]官方说明 O(n) 向集合中插入元素,时间复杂度与插入的元素个数相关

  2. SCARD key官方说明 O(1) 返回key对应的集合中元素的个数,如果key指向的集合不存在,那么会返回0

  3. SISMEMEBER key member官方说明 O(1) 判断某元素是否存在于集合中,如果存在则返回1,如果元素不存在或者key指向的集合不存在都会返回0

  4. SRANDMEMBER key [count]官方说明 O(n) 从key指向的集合中随机返回count个元素,时间复杂度与count相关。count的默认值为1,

  5. 当count=0时,没有返回值。

  6. 当count>0且小于集合中元素的总数时,随机从集合中返回count个元素.

  7. 当count>集合中元素的总数时,返回集合中全部的元素,但是依旧没有顺序。

  8. 当count<0时,返回的结果中可能出现重复项,但是返回结果的长度一定是count*-1个

  9. SPOP key [count]官方说明 O(n) 从集合中随机pop出count个元素并返回。时间复杂度与count的个数相关,count的默认值为1

  10. SMEMBERS key官方说明 O(n) 返回集合中所有的元素,无序

  11. SINTER key [key...]官方说明 O(n*m) 对给定的集合做交集并返回,时间复杂度为集合中元素个数相乘

  12. SUNION key [key...]官方说明 O(n) 对给定的集合做并集并返回,时间复杂度为所有参与运算的集合的元素的总个数

  13. SDIFF key [key...]官方说明 O(n) 返回集合1与集合2的差集,需要注意的是集合A-集合B<>集合B-集合A ,时间复杂度为所有参与运算的集合的元素的总个数

  14. SINTERSTORE destination key [key...]官方说明 O(n*m) 对给定的集合做交集并存储到destination中,如果destination已存在且不为空,那么destination会被覆盖。

  15. SUNIONSTORE destination key [key...]官方说明 O(n) 对给定的集合做并集,并将结果存到destination中,如果destination已经存在,那么会被覆盖。

  16. SDIFFSTORE destination key [key...]官方说明 O(n) 对给定的集合做差集运算,并将结果存到destination中,如果destination已存在,那么会被覆盖

应用场景

  1. 集合一般在互联网应用上可以用来做用户标签

  2. 使用SPOP命令可以从集合中随机弹出count个元素,利用这种特性可以用来做抽奖

  3. 集合的交、并、差运算的时间复杂度都比较高,所以尽可能使用store命令将结果储存起来,方面下次查看。但是需要注意的是,store命令存储的结果并不会跟着原始集合的变化而变化,当原始集合发生变化后,需要再次使用store命令才能获取到最新的结果。

有序集合


相比集合,有序集合提供了顺序的功能,不过这个顺序是基于score来实现的,有序集合中的每一个元素都有一个score,集合中的所有元素都可以按照score来排序,同样的,有序集合中也不允许出现重复项,但是不同的元素的score是可以重复的

有序集合

常用命令

  1. ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]官方说明 O(log(n)) 向有序集合中插入一个元素,插入元素时,先写元素的分数,再写元素

  2. NX 只做插入操作,只有当元素不存在时,才能插入成功

  3. XX 只做更新操作,只有当元素存在时,才能更新成功

  4. LT 如果元素不存在,那么这个参数无效,如果元素存在,那么只有当新score小于当前的score时,才能设置成功

  5. GT 如果元素不存在,那么这个参数无效,如果元素存在,那么只有当新score大于当前的score时,才能设置成功

  6. CH 修改返回值为发生变化的成员总数,原始是返回新添加成员的总数 (CH 是 changed 的意思)。更改的元素是新添加的成员,已经存在的成员更新分数。 所以在命令中指定的成员有相同的分数将不被计算在内。注:在通常情况下,ZADD返回值只计算新添加成员的数量。

  7. INCR 对元素的分数进行增加操作,增加的值为score,这个和ZINCRBY的效果是一样的

  8. 需要注意的是:GTLTNX是互斥的

  9. ZINCRBY key increment member官方说明 O(log(n)) 对指定的元素的分数增加increment

  10. ZSCORE key member官方说明 O(1) 返回指定元素的分数,如果元素不存在或者key不存在,那么就返回nil

  11. ZRANK key member官方说明 O(log(n)) 返回指定元素在有序集合中的排名,排名的依据是按分数的升序排列,排名第一的返回0,如果key不存在或者member不存在,那么就返回nil

最后

返回指定元素的分数,如果元素不存在或者key不存在,那么就返回nil

  1. ZRANK key member官方说明 O(log(n)) 返回指定元素在有序集合中的排名,排名的依据是按分数的升序排列,排名第一的返回0,如果key不存在或者member不存在,那么就返回nil

最后

[外链图片转存中…(img-kMpTEPUF-1714440489874)]

[外链图片转存中…(img-MYMiAo5r-1714440489874)]

[外链图片转存中…(img-3fGCA39x-1714440489875)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值