Redis缓存数据库进阶——Redis基础数据类型(2)

一、Redis全局命令

查看所有键

keys *

keys l*

dbsize

exists

del

expire

pexpire

pexpireat key

PEXPIREAT key milliseconds-timestamp

  • key 是你想要设置过期时间的键名。
  • milliseconds-timestamp 是键应该过期的Unix时间戳(毫秒)。
  • 如果键存在并且成功设置了过期时间,返回 1
  • 如果键不存在,返回 0

persist

type

Random

 二、String数据类型

1. 设置和获取SET、GET

  • SET key value:设置指定 key 的值。如果 key 已经存储其他值,则覆盖旧值。
  • GET key:获取指定 key 的值。如果 key 不存在,则返回 nil。

 2. 批量操作MSET、MGET

  • MSET key1 value1 key2 value2 ...:同时设置一个或多个 key-value 对。当有一个 key 不成功时,操作会被全部取消。
  • MGET key1 key2 ...:获取一个或多个给定 key 的值,如果 key 不存在,则返回 nil。

批量操作的优点:

        批量操作命令可以有效提高效率,假如没有mget这样的命令,执行n次get命令具体耗时如下:
        n次 get时间=n次网络时间+n次命令时间

        使用mget命令后,要执行n次get命令操作具体耗时如下:

        n次get时间=1次网络时间+n次命令时间

        Redis可以支撑每秒数万的读写操作,但是这指的是Redis服务端的处理能力,对于客户端来说,一次命令除了命令时间还是有网络时间,假设网络时间为1毫秒,命令时间为0.1毫秒(按照每秒处理1万条命令算),那么执行1000次 get命令需要1.1秒(10001+10000.1=1100ms),1次mget命令的需要0.101秒(11+10000.1=101ms)。

 3. 自增自减INCR、DECR、INCRBY、DECRBY

  • INCR key:将 key 中储存的数字值增一。如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执行 INCR 操作。
  • DECR key:将 key 中储存的数字值减一。如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执行 DECR 操作。
  • INCRBY key increment:将 key 所储存的值加上给定的增量值(increment)。
  • DECRBY key decrement:将 key 所储存的值减去给定的减量值(decrement)。
  •  INCRBYFLOAT

4.SETNX和SETXX

    setnx: 键必须不存在,才可以设置成功,若给定的 key 已经存在,则 SETNX 不做任何动作。用于添加(分布式锁常用)。  

    setxx: 与nx相反,键必须存在,才可以设置成功,用于更新。

5.GETSET

设置新值并返回原值,将给定 key 的值设为 value ,并返回 key 的旧值(old value)。当 key 存在但不是字符串类型时,返回一个错误。

6. 追加APPEND

  • APPEND key value:如果 key 已经存在并且是一个字符串,APPEND 命令会将 value 追加到 key 原来的值的末尾。如果 key 不存在,APPEND 就相当于 SET key value。

7.字符串长度 STRLEN

  • STRLEN key:返回存储在 key 的字符串值的长度。当 key 存储的不是字符串值时,返回一个错误。

8.SETRANGE

  • setrange 设置指定位置的字符

9.GETRANGE

  • getrange 截取字符串,下标从0开始计算。

        getrange 截取字符串中的一部分,形成一个子串,需要指明开始和结束的偏移量,截取的范围是个闭区间。

10.RENAME

键重命名

但是要注意,如果在rename之前,新键已经存在,那么它的值也将被覆盖。

为了防止被强行rename,Redis提供了renamenx命令,确保只有newKey不存在时候才被覆盖。

从上面我们可以看出,由于重命名键期间会执行del命令删除旧的键,如果键对应的值比较大,会存在阻塞Redis的可能性。

10.命令的时间复杂度

字符串这些命令中,除了del 、mset、 mget支持多个键的批量操作,时间复杂度和键的个数相关,为O(n),getrange和字符串长度相关,也是O(n),其余的命令基本上都是O(1)的时间复杂度,在速度上还是非常快的。

使用场景

字符串类型的使用场景很广泛:

缓存功能

Redis 作为缓存层,MySQL作为存储层,绝大部分请求的数据都是从Redis中获取。由于Redis具有支撑高并发的特性,所以缓存通常能起到加速读写和降低后端压力的作用。

计数

使用Redis 作为计数的基础工具,它可以实现快速计数、查询缓存的功能,同时数据可以异步落地到其他数据源。

共享Session

一个分布式Web服务将用户的Session信息(例如用户登录信息)保存在各自服务器中,这样会造成一个问题,出于负载均衡的考虑,分布式服务会将用户的访问均衡到不同服务器上,用户刷新一次访问可能会发现需要重新登录,这个问题是用户无法容忍的。

为了解决这个问题,可以使用Redis将用户的Session进行集中管理,,在这种模式下只要保证Redis是高可用和扩展性的,每次用户更新或者查询登录信息都直接从Redis中集中获取。

限速

比如,很多应用出于安全的考虑,会在每次进行登录时,让用户输入手机验证码,从而确定是否是用户本人。但是为了短信接口不被频繁访问,会限制用户每分钟获取验证码的频率,例如一分钟不能超过5次。一些网站限制一个IP地址不能在一秒钟之内方问超过n次也可以采用类似的思路。

 三、Hash类型

1、hset、hget

2、hmset、hmget

hmset批量设值、hmget批量取值

3、hsetnx

4、hdel

hdel会删除一个或多个field,返回结果为成功删除field的个数。

5、hlen

计算field个数

6、hexists

hexists判断field是否存在,若存在返回1,不存在返回0

7、hkeys、hvals

hkeys获取所有field

它返回指定哈希键所有的field

hvals获取所有的值

8、hgetall

hgetall获取所有field与value

9、hincrby增加

四、Stirng和Hash的使用场景

从前面的操作可以看出,String和Hash的操作非常类似,那为什么要弄一个hash出来存储。

哈希类型比较适宜存放对象类型的数据,我们可以比较下,如果数据库中表记录user为:

1、使用String类型

需要一条条去插入获取。

set user:1:name lijin;

set user:1:age 18;

set user:2:name msb;

set user:2:age 20;

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

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

2、将对象序列化存入redis

set user:1 serialize(userInfo);

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

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

3、使用hash类型

hmset user:1 name lijin age 18

hmset user:2 name msb age 20

优点:简单直观,使用合理可减少内存空间消耗

缺点:要控制内部编码格式,不恰当的格式会消耗更多内存

 五、List操作命令

列表( list)类型是用来存储多个有序的字符串,a、b、c、c、b四个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素(element),一个列表最多可以存储(2^32-1)个元素(4294967295)。

列表类型有两个特点:

第一、列表中的元素是有序的,这就意味着可以通过索引下标获取某个元素或者某个范围内的元素列表。

第二、列表中的元素可以是重复的。

1、rpush 向右插入

2、lpush 向左插入

3、lpop

从列表左侧弹出(会删除元素)

4、rpop

从列表右侧弹出 

5、linsert

在某个元素前或后插入新元素

LINSERT key BEFORE|AFTER pivot value

  • key 是列表的键名。
  • BEFORE|AFTER 指定了在 pivot 元素之前还是之后插入新元素。
  • pivot 是列表中的一个元素,LINSERT 会在这个元素之前或之后插入新元素。
  • value 是要插入的新元素。

返回值

  • 如果操作成功,返回列表的长度。
  • 如果 pivot 不存在于列表中,返回 -1

6、Irem

对指定元素进行删除

lrem命令会从列表中找到等于value的元素进行删除,根据count的不同分为三种情况:

count>0,从左到右,删除最多count个元素。

count<0,从右到左,删除最多count绝对值个元素。

count=0,删除所有。

7、Itirm 

按照索引范围修剪列表

LTRIM key start stop

  • key:列表的键名。
  • start:要保留的起始索引(包含)。索引可以是正数或负数,其中0表示列表的第一个元素,-1表示列表的最后一个元素,以此类推。
  • stop:要保留的结束索引(包含)。索引规则与start相同。

返回值

  • 命令执行成功时,返回OK

8、lindex

lindex 获取列表指定索引下标的元素

9、llen

获取列表长度

10、blpop和brpop

它们用于从列表的头部或尾部阻塞地弹出元素。这些命令在需要实现如消息队列或生产者-消费者模式时非常有用。

BLPOP key [key ...] timeout

  • key:一个或多个列表的键。
  • timeout:阻塞的最大秒数。如果设置为 0,则无限期阻塞。

返回值:

  • 如果列表不为空,返回一个包含两个元素的列表,第一个是弹出元素的键名,第二个是弹出的元素值。
  • 如果列表为空且达到超时时间,则返回 nil

BRPOP

BRPOP 命令与 BLPOP 类似,但它是从列表的尾部阻塞地弹出元素。

BRPOP key [key ...] timeout

  • 参数与 BLPOP 相同。

返回值:

  • 如果列表不为空,返回一个包含两个元素的列表,第一个是弹出元素的键名,第二个是弹出的元素值。
  • 如果列表为空且达到超时时间,则返回 nil
使用场景
  • 消息队列:生产者可以将任务或消息推送到列表中,消费者可以使用 BLPOP 或 BRPOP 从列表中取出任务进行处理。这种方式能够很好地实现生产者-消费者模式。
  • 任务分发:在多任务处理系统中,可以将任务分发到不同的列表中,每个工作节点使用 BLPOP 或 BRPOP 从各自的列表中取出任务进行处理。
  • 数据同步:在某些场景下,可以使用列表作为数据同步的缓冲区,一端将数据推送到列表中,另一端通过 BLPOP 或 BRPOP 拉取数据进行处理。

  • 模拟栈
  • 文章列表

        每个用户有属于自己的文章列表,现需要分页展示文章列表。此时可以考虑使用列表,因为列表不但是有序的,同时支持按照索引范围获取元素。

  • 实现其他数据结构

        lpush+lpop =Stack(栈)

        lpush +rpop =Queue(队列)

        lpsh+ ltrim =Capped Collection(有限集合)

        lpush+brpop=Message Queue(消息队列)

注意事项

  • 使用 BLPOP 和 BRPOP 时,需要注意超时时间的设置,以避免长时间阻塞导致的资源浪费。
  • 在 Redis 集群环境中,由于 BLPOP 和 BRPOP 是阻塞操作,它们只能在单个节点上执行,不支持跨节点的键操作。
  • 在高并发场景下,大量客户端同时阻塞在 BLPOP 或 BRPOP 上可能会对 Redis 服务器的性能产生影响,需要合理设计系统架构和使用场景。

六、Set操作命令

1、sadd 添加元素

允许添加多个,返回结果为添加成功的元素个数

2、srem 删除元素

允许删除多个,返回结果为成功删除元素个数

3、scard 计算元素个数

4、sismember 判断元素是否在集合中

5、srandmember 随机从集合返回指定个数元素

6、spop 从集合随机弹出元素

同样可以指定个数,如果不写默认为1

既然是弹出,spop命令执行后,元素会从集合中删除,

srandmember弹出不会删除

7、smembers 获取所有元素(不会弹出元素)

返回结果是无序的

8、集合间操作命令

sinter 求多个集合的交集

交集结果保存

suinon 求多个集合的并集

并集结果保存

sdiff 求多个集合的差集

差集结果保存

使用场景

集合类型比较典型的使用场景是标签(tag)。例如一个用户可能对娱乐、体育比较感兴趣,另一个用户可能对历史、新闻比较感兴趣,这些兴趣点就是标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于用户体验以及增强用户黏度比较重要。

例如一个电子商务的网站会对不同标签的用户做不同类型的推荐,比如对数码产品比较感兴趣的人,在各个页面或者通过邮件的形式给他们推荐最新的数码产品,通常会为网站带来更多的利益。

除此之外,集合还可以通过生成随机数进行比如抽奖活动,以及社交图谱等等。

七、Zset操作命令

有序集合相对于哈希、列表、集合来说会有一点点陌生,但既然叫有序集合,那么它和集合必然有着联系,它保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数( score)作为排序的依据。

有序集合中的元素不能重复,但是score可以重复,就和一个班里的同学学号不能重复,但是考试成绩可以相同。

有序集合提供了获取指定分数和元素范围查询、计算成员排名等功能,合理的利用有序集合,能帮助我们在实际开发中解决很多问题。

1、zadd添加成员

返回结果代表成功添加成员的个数

zadd命令还有四个选项nx、xx、ch、incr 四个选项

nx: member必须不存在,才可以设置成功,用于添加。

xx: member必须存在,才可以设置成功,用于更新。

ch: 返回此次操作后,有序集合元素和分数发生变化的个数

incr: 对score做增加,相当于后面介绍的zincrby

2、zcard 计算成员个数

3、zscore 计算某个成员的分数

4、zrank计算成员的排名

zrank是从分数从低到高返回排名

zrevrank反之

很明显,排名从0开始计算。

5、zrem删除成员

允许一次删除多个成员。

返回结果为成功删除的个数。

6、zincrby 增加成员的分数

7、zrange和zrevrange返回指定排名范围的成员

有序集合是按照分值排名的,zrange是从低到高返回,zrevrange反之。如果加上 withscores选项,同时会返回成员的分数

zrangebyscore返回指定分数范围的成员,其中zrangebyscore按照分数从低到高返回

查询分数80-60的人 zrevrangebyscore按照分数从高到低返回

同时min和max还支持开区间(小括号)和闭区间(中括号),-inf和+inf分别代表无限小和无限大:

zrevrangebyscore倒序

8、zcount 返回指定分数范围成员个数

9、zremrangebyrank 按升序删除指定排名内的元素

zremrangebyrank key start end

10、zremrangebyscore 删除指定分数范围的成员

zremrangebyscore key min max

11、zinterstore 交集

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

  • destination:指定结果集保存的集合key。
  • numkeys:指定有多少个集合参与交集运算。
  • key [key ...]:指定参与交集运算的集合的key,数量要和numkeys声明的数量相等。
  • [WEIGHTS weight [weight ...]]:可选参数,指定参与交集运算各集合score的权重参数。默认情况下,权重皆为1。
  • [AGGREGATE SUM|MIN|MAX]:可选参数,指定交集中元素的score的取值方式。默认为SUM,即各集合中该元素的score乘以权重求和。也可以选择MINMAX,分别表示取最小值或最大值。

zinterstore zsetavg 2 zset66 zset67 WEIGHTS 0.5 0.5

这条命令的含义如下:

  • zinterstore:这是 Redis 中用于计算交集并存储结果的命令。
  • zsetavg:这是新创建的有序集合的名称,用于存储交集的结果。
  • 2:这指定了参与交集运算的有序集合的数量。在这个例子中,有两个集合参与运算。
  • zset66 和 zset67:这是两个参与交集运算的有序集合的名称。
  • WEIGHTS 0.5 0.5:这是可选参数,用于指定每个集合中元素的分数(score)的权重。在这个例子中,zset66 和 zset67 中元素的分数都将被乘以 0.5(即减半)。如果不指定 WEIGHTS,则默认权重为 1。

计算 zset66 和 zset67 这两个有序集合的交集,并将交集中的每个元素的分数都减半(乘以 0.5),然后将结果存储在名为 zsetavg 的新有序集合中。

12、zunionstore 并集

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值