一文让你掌握Redis基础,快来查漏补缺吧
作者头像
  • 刘小刚
  • 2020-05-17 18:24:10 0

Redis 是什么

Redis 是一个开源的内存数据结构存储系统,可以用作数据库、缓存和消息中间件。它支持多种数据结构,包括字符串、哈希、列表、集合和有序集合等。此外,它还支持位图、HyperLogLog 和地理空间索引等数据结构。

Redis 内置了复制、Lua 脚本、LRU 驱逐、事务以及不同级别的磁盘持久化功能。并通过 Redis 哨兵和自动分区提供高可用性。

NoSQL 是什么

我们知道 Redis 是一种非关系型数据库(NoSQL)。那么,为什么会出现 NoSQL?NoSQL 又是什么?

单机数据库的时代

在网站访问量较小的时候,使用单一数据库即可应对流量需求。

缓存+拆分

随着访问量增加,单一数据库无法满足需求。因此,我们在中间加入缓存层,并将数据库进行拆分、优化和读写分离。这里的缓存就是 NoSQL 的一种应用,但 NoSQL 不仅仅局限于缓存功能。例如,Redis 还可以实现简单的消息队列、处理会话共享、计数器、排行榜、好友关系等功能,是一个非常强大的工具。

Redis 通用命令

接下来,我们来介绍一些 Redis 的通用命令。

操作 Key 和 Value

Redis 是一种键值存储的缓存数据库,所有的数据都有唯一的键。

  • keys pattern:获取符合要求的所有键。通常在生产环境中不推荐使用,因为 Redis 是单线程的,执行耗时操作会阻塞其他操作。一般会使用 scan 命令替代。
  • dbsize:获取当前存储数据个数。
  • exists key:判断是否存在该键。
  • del key:删除指定数据。
  • type key:获取指定键的数据类型。
  • rename key newkey:重命名键。

过期时间

Redis 中很多数据用于缓存,因此需要设置过期时间。Redis 提供了强大的过期时间设置功能。 - expire key seconds:为某个键设置过期时间。 - ttl key:查看某个键的剩余时间,返回负数表示剩余时间,-1 表示永久有效,-2 表示已过期或不存在。

Redis 的五种基本数据类型

Redis 支持五种基本数据类型:字符串、哈希、列表、集合和有序集合。

字符串

字符串是最常见的数据类型,在各种编程语言中都有。对于 Redis,字符串同样不可或缺。

  • set key value:设置值。
  • get key:获取某个键的值。
  • mset key1 value1 key2 value2:批量设置值。
  • mget key1 key2:批量获取值。
  • incr key:自增指定键的值。
  • decr key:自减指定键的值。
  • incrby key value:自增指定数值。
  • decrby key value:自减指定数值。
  • setnx key value:如果不存在该键则设置成功。
  • set key value xx:如果存在则设置成功,否则失败。
  • append key value:在原有内容基础上追加内容。
  • strlen key:获取字符串长度。
  • getrange key start end:获取指定范围的内容。
  • setrange key index value:设置指定范围的内容。
  • setex key seconds value:设置值且设置过期时间。
  • set key value ex seconds nx:为不存在的键设置值且设置过期时间。

哈希

哈希可以视为小型 Redis,底层实现与 Java 中的 HashMap 类似,使用数组 + 链表的结构。不同的是,Redis 中的哈希值只能是字符串,并且采用渐进式 rehash 方式。

  • hset key field value:设置哈希中某个键的值。
  • hsetnx key field value:如果不存在则设置成功。
  • hmset key field1 value1 field2 value2:批量设置。
  • hget key field:获取哈希中某个键的值。
  • hmget key field1 field2:批量获取。
  • hgetall key:获取全部。
  • hdel key field:删除某个键。
  • hexists key field:判断是否存在。
  • hlen key:获取指定键对应的哈希中的存储个数。
  • hvals key:获取所有值。
  • hkeys key:获取所有键。
  • hincrby key field increment:添加某个值。
  • hincrbyfloat key field float:添加浮点数。

列表

Redis 中的列表类似于 Java 中的 LinkedList,底层是通过链表实现的。因此,插入和删除操作较快,但索引定位较慢。

  • lpush key item1 item2 item3:从左边入栈。
  • rpush key item1 item2 item3:从右边入栈。
  • lpop key:从左边出栈。
  • rpop key:从右边出栈。
  • lindex key index:获取指定索引的元素。
  • lrange key start end:获取指定范围的元素。
  • linsert key before|after item newitem:在指定元素的后面或前面添加新元素。
  • lrem key count value:删除指定数量的元素。
  • ltrim key start end:保留指定范围的元素。
  • lset key index newValue:更新某个索引的值。
  • blpop key timeout:没有则阻塞(timeout 指定阻塞时间,为 0 表示永不过期)。
  • brpop key timeout:没有则阻塞(timeout 指定阻塞时间,为 0 表示永不过期)。

集合

Redis 中的集合类似于 Java 中的 HashSet,元素不可重复。可以用于去重,并且可以进行交集、并集等操作。

  • sadd key value:添加元素。
  • sdel key value:删除某个元素。
  • sismember key value:判断是否是集合中的元素。
  • srandmember key count:随机获取指定数量的元素。
  • spop key count:从集合中随机弹出元素。
  • smembers key:获取集合所有元素。
  • scard key:获取集合个数。
  • sinter set1 set2:获取所有集合的交集。
  • sdiff set1 set2:获取所有集合的差集。
  • sunion set1 set2:获取所有集合的并集。

有序集合

Redis 中的有序集合是一种带有分数的集合,可以实现排行榜等功能。底层使用跳表实现,能够快速定位。

  • zadd key score element:添加元素,score 用于排序。
  • zrem key element:删除某个元素。
  • zscore key element:获取某个元素的分数。
  • zincrby key increment element:添加某个元素的分数。
  • zrange key start end [withscores]:获取指定索引范围的元素。
  • zrangebyscore key minScore maxScore [withscores]:获取指定分数范围的元素。
  • zcard key:获取有序集合长度。

Redis 中的事务和管道

管道 Pipeline

在某些场景下,我们需要在一次操作中执行多个命令。如果逐个执行命令会浪费很多网络消耗时间。如果将多个命令一次性传输到 Redis 中执行,则会减少很多延迟时间。需要注意的是,管道中的命令并不是原子性的,可能会被其他命令交叉执行。

事务

关系型数据库具有 ACID 特性,Redis 能保证原子性和隔离性,但无法保证一致性,因为 Redis 事务不支持回滚。

简单来说,Redis 中的事务与管道相比多了一个原子性操作,即不会被其他命令分割。 - multi:事务开始的标志。 - exec:执行事务。 - discard:清除事务中所有命令。 - watch key:在事务结束前监控某个键,如果在提交事务时发现该键的值被其他客户端更改,则事务会失败。 - unwatch key:取消监控。

希望这些信息对你有所帮助!如果你觉得不错,可以继续关注后续的更新。

    本文来源:图灵汇
责任编辑: : 刘小刚
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
一文补缺掌握基础Redis查漏
    下一篇