Redis 是一个开源的内存数据结构存储系统,可以用作数据库、缓存和消息中间件。它支持多种数据结构,包括字符串、哈希、列表、集合和有序集合等。此外,它还支持位图、HyperLogLog 和地理空间索引等数据结构。
Redis 内置了复制、Lua 脚本、LRU 驱逐、事务以及不同级别的磁盘持久化功能。并通过 Redis 哨兵和自动分区提供高可用性。
我们知道 Redis 是一种非关系型数据库(NoSQL)。那么,为什么会出现 NoSQL?NoSQL 又是什么?
在网站访问量较小的时候,使用单一数据库即可应对流量需求。
随着访问量增加,单一数据库无法满足需求。因此,我们在中间加入缓存层,并将数据库进行拆分、优化和读写分离。这里的缓存就是 NoSQL 的一种应用,但 NoSQL 不仅仅局限于缓存功能。例如,Redis 还可以实现简单的消息队列、处理会话共享、计数器、排行榜、好友关系等功能,是一个非常强大的工具。
接下来,我们来介绍一些 Redis 的通用命令。
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,字符串同样不可或缺。
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 中执行,则会减少很多延迟时间。需要注意的是,管道中的命令并不是原子性的,可能会被其他命令交叉执行。
关系型数据库具有 ACID 特性,Redis 能保证原子性和隔离性,但无法保证一致性,因为 Redis 事务不支持回滚。
简单来说,Redis 中的事务与管道相比多了一个原子性操作,即不会被其他命令分割。
- multi
:事务开始的标志。
- exec
:执行事务。
- discard
:清除事务中所有命令。
- watch key
:在事务结束前监控某个键,如果在提交事务时发现该键的值被其他客户端更改,则事务会失败。
- unwatch key
:取消监控。
希望这些信息对你有所帮助!如果你觉得不错,可以继续关注后续的更新。