Redis 基本命令和使用
Redis(REmote DIctionary Server)是一个开源的内存数据存储系统,常用作数据库、缓存和消息中间件。它具有高性能、灵活性和可扩展性,被广泛应用于各种应用程序和系统中。
1 Redis 和 MySQL 的区别
相较于关系型数据库 (SQL) MySQL,Redis 是非关系型数据库 (NoSQL) 它们在数据存储、数据模型、性能和适用场景等方面有一些异同点。
Redis 是一个基于键值存储的内存数据库,它将数据存储在内存中,以实现快速的读写操作。Redis 支持多种数据结构,包括字符串、哈希、列表、集合和有序集合,每个数据结构都有对应的操作和功能。Redis 适用于需要高性能和低延迟的应用场景,例如缓存、会话存储、实时应用程序和消息队列等。此外,Redis 还支持发布订阅模式,允许消息的发布者将消息广播给多个订阅者。而 MySQL 是一个关系型数据库管理系统,它使用表格来组织和存储数据。MySQL 支持 SQL 查询语言,并提供丰富的功能,如事务处理、索引、复制和高可用性等。MySQL 适用于需要结构化数据存储和复杂查询的应用场景,例如企业应用、电子商务和大规模数据处理。
另一个重要的区别是数据模型。Redis 是一个键值存储系统,其中每个键都与一个值相关联,值可以是字符串、哈希、列表、集合或有序集合。这种灵活的数据模型使得 Redis 能够处理多种数据类型和复杂的数据结构。而 MySQL 是一个关系型数据库,数据以表格的形式组织,每个表格包含多个列和行,每行代表一个记录,每列代表一个字段。
2 Redis 常用服务端管理命令
2.1 PING
检测连接是否存活
1 | 47.120.5.13:6379> ping |
2.2 ECHO
在命令行打印一些内容
1 | 47.120.5.13:6379> echo test |
2.3 EXIT/QUIT
退出客户端
1 | C:\Users\A>redis-cli -h 47.120.5.13 |
2.4 INFO
查看服务器信息
1 | 47.120.5.13:6379> info |
2.5 DBSIZE
统计当前库下key的数量
1 | 47.120.5.13:6379> dbsize |
2.6 SELECT
Redis 默认使用16个库,从0到15。可以试用select db 进行切换
1 | 47.120.5.13:6379> set test1 test1 |
2.7 FLUSHDB
清空当前数据库中的键值对
1 | 47.120.5.13:6379> flushdb |
2.8 FLUSHALL
清空所有数据库的键值对
1 | 47.120.5.13:6379> flushall |
2.9 SHUTDOWN
退出服务器端
1 | 47.120.5.13:6379> shutdown |
2.10 MOVE key n
不同数据库之间数据是不能互通的,move移动键到指定数据库
1 | 47.120.5.13:6379> set test1 test1 |
3 Redis 常用的 Key 相关命令
3.1 keys patternd
*表示通配符,表示匹配任意字符,会遍历所有键。
1 | 47.120.5.13:6379> keys * |
3.2 exists key [key…]
查询是否存在(一个或多个)key,返回存在的个数。
1 | 47.120.5.13:6379> exists test1 |
3.3 del key [key…]
删除(一个或多个)key,返回成功删除的个数
1 | 47.120.5.13:6379> del test2 test3 |
3.4 type key
查询并返回 key 所储存的值的类型
1 | 47.120.5.13:6379> type test1 |
3.5 (p)expire key seconds
expire: 以秒为单位设置 key 的过期时间
pexpire:以毫秒为单位设置 key 的过期时间
1 | 分别给 test1 和 test2 设置2秒(2000毫秒)的过期时间 |
3.6 (p)ttl key
ttl:以秒为单位返回 key 的剩余过期时间
pttl:以毫秒为单位返回 key 的剩余过期时间
(integer) -1 : 永不过期
1 | 47.120.5.13:6379> ttl test1 |
3.7 persist key
设置 key 永不过期
(integer) -1 : 永不过期
1 | 设置 test3 有过期时间 |
3.8 rename key newKeyName
更改 key 名称
1 | 47.120.5.13:6379> keys * |
4 String(字符串)基本操作命令
string(字符串)是 Redis 中最基本的数据类型,单个数据能存储的最大空间是512M。
4.1 set key value [EX seconds] [PX milliseconds] [NX|XX]
nx:如果key不存在则建立,xx:如果key存在则修改其值,也可以直接使用setnx/setex命令。
1 | 47.120.5.13:6379> keys * |
请注意:
EX(Expiration) 和 PX(Expiration in milliseconds) 可以同时出现,这两个选项用于设置键的过期时间,可以根据需要选择以秒或毫秒为单位来指定过期时间。
NX(Not Exists)和XX(Exists)选项不能同时出现。这两个选项是互斥的,意味着在同一个SET命令中不能同时指定NX和XX。如果使用NX选项,表示只有在键不存在的情况下才会进行设置。如果键已经存在,SET命令将不会执行任何操作。如果使用XX选项,表示只有在键已经存在的情况下才会进行设置。如果键不存在,SET命令将不会执行任何操作。即 { SET key value NX XX } 这样的组合是无效的
4.2 get key
获取 key 键相对应的 value 值
1 | 47.120.5.13:6379> get test |
4.3 incr(by) key (increment)
incr key : 单次递增,字符串中的值不是数字类型则会报错。
incrby key increment : 单次递增 increment ,如果是浮点型数据可使用 incrbyfloat 命令递增
1 | 47.120.5.13:6379> set test1 666 |
4.4 mset key value [key value …]
批量存放键值
1 | 47.120.5.13:6379> mset test2 value2 test3 value3 test4 value4 |
4.5 mget key [key …]
批量获取键值,Redis接收的是UTF-8的编码,如果是中文一个汉字将占3位返回。
1 | 47.120.5.13:6379> mget test2 test3 |
4.6 strlen key
获取值的长度
1 | 47.120.5.13:6379> strlen test2 |
4.7 append key value
在原键值尾部追加内容
1 | 47.120.5.13:6379> get test2 |
4.8 getrange key start end
获取部分字符键值
1 | 47.120.5.13:6379> get test2 |
4.9 String(字符串)的一些应用场景
用户会话管理:在一个分布式的网络服务中,用户的会话信息(例如登录状态)被存储在多个不同的服务器上。然而,在负载均衡的情况下,服务器会将用户的请求分散到多个不同的服务器上,以平衡服务器的负载压力。这可能会导致一个问题:用户在刷新页面时可能会被引导到不同的服务器,从而需要重新登录,这对于用户体验来说是无法容忍的。而解决这个问题,我们只需要使用具有高可用性和可扩展性的 Redis,每当用户进行登录操作或者需要验证登录状态时,系统会从Redis中获取相应的会话信息。这种设计可以确保用户的会话状态在不同服务器之间保持一致,从而提供更好的用户体验。
缓存热门数据:当涉及需要频繁读取的数据时,我们可以利用 Redis 缓存的机制,从而避免频繁地访问数据库,从而提高系统的性能表现。以电子商务网站为例,可以将热门商品的信息序列化后存储在 Redis 中,这样就能够有效减轻数据库的负担。这种做法能够在用户频繁请求热门商品信息时,快速地从 Redis 缓存中获取数据,而不必每次都直接查询数据库,从而更有效地提升整个系统的响应速度和性能水平。
5 Hash(哈希)基本操作命令
Hash 适合用来存储类似于对象信息这样的数据。在使用 Hash 类型时,我们需要一个空间来容纳多个键值对数据,这使得我们能够有效地存储和检索这些数据。这种数据类型的背后原理是使用哈希表的数据结构来进行数据存储,这带来了快速的存储和查询操作,因为它们都能在常数时间内完成,从而保证了高效性能。
5.1 hset(nx) key field value
hset:存放键的单个字段值
hsetnx:字段值不存在时才存放字段的值,避免覆盖已经存在的数据
1 | 如果字段值存在,使用 hset 会覆盖原值 |
5.2 hmset key field value [field value …]
存储一个键的多个字段值
1 | 47.120.5.13:6379> hmset user name zhangsan age 15 address xiamen |
5.3 h[m]get key field [field …]
hget key field:获取单个字段值
hmget key field [field …]:获取多个字段值
1 | 获取单个字段值 |
5.4 hgetall key
获取该键中所有的字段与值
1 | 47.120.5.13:6379> hgetall user |
5.5 hkeys key
获取所有的字段
1 | 47.120.5.13:6379> hkeys user |
5.6 hvals key
获取所有字段值
1 | 47.120.5.13:6379> hvals user |
5.7 hexists key field
判断键的字段是否存在
1 | 47.120.5.13:6379> hexists user name |
5.8 hlen key
获取键的字段数量
1 | 47.120.5.13:6379> hlen user |
5.9 hincrby key field increment
单次递增/递减 increment
1 | 47.120.5.13:6379> hget user age |
5.10 hash(哈希)的一些应用场景
购物车功能实现:购物车功能的核心在于用户在前端点击商品后,将商品添加到购物车中。前端会传递商品的唯一标识(商品 ID)以及购买所需的数量等数据到后端。在 Java 环境下,通过接收这些前端传递的参数,我们可以实现购物车的一系列操作,例如添加商品、增加或减少购买数量,移除特定商品或清空整个购物车等功能。而如果我们选择使用Redis来实现购物车功能,我们可以巧妙地利用 Redis 的 Hash 类型。在这种情况下,我们以每个用户的唯一标识(用户 ID)作为主键(key),然后以商品的唯一标识(商品 ID)作为字段(field),将购买数量作为对应的值(value)。这样的数据结构正好满足了购物车所需的三个重要元素,从而非常适合构建购物车功能。
实时统计与计数: 如果你需要实时地统计和计数不同事件或指标,例如网站的页面访问次数、用户点击次数等,可以使用 Redis 的 Hash 来存储这些统计数据。每个事件的唯一标识作为Hash的键,不同统计指标作为字段,对应的值存储具体的计数。
6 List(列表)基本操作命令
List 数据类型可以容纳多个数据项,并且能够按照数据进入的顺序进行有序存储。每个 List 存储空间可以保存多个数据,同时数据项的插入顺序也会在其中得以体现。List 数据类型的实现基于双向链表的存储结构,这使得数据的插入和删除操作更加高效且灵活。
6.1 lpush key value [value …]
从左端存值
1 | 47.120.5.13:6379> lpush list1 zhangsan |
6.2 rpush key value [value …]
从右端存值
1 | 47.120.5.13:6379> lrange list1 0 -1 |
6.3 lset key index value
按索引存值
1 | 47.120.5.13:6379> lset list1 2 wujiu |
6.4 lpop key
左端弹出元素
1 | 47.120.5.13:6379> lrange list1 0 -1 |
6.5 rpop key
右端弹出元素
1 | 47.120.5.13:6379> lrange list1 0 -1 |
6.6 llen key
获取元素个数
1 | 47.120.5.13:6379> lrange list1 0 -1 |
6.7 lrange key start stop
截取 list 中的部分元素
1 | 47.120.5.13:6379> lpush list1 zhangsan wangwu |
6.8 lindex key index
通过索引获取值
1 | 47.120.5.13:6379> lrange list1 0 -1 |
6.9 lrem key count value
1 | 47.120.5.13:6379> lpush userids 111 222 333 111 222 222 333 222 222 333 |
6.10 ltrim key start stop
按索引删除部分值
1 | 47.120.5.13:6379> lrange userids 0 -1 |
6.11 List(列表)的一些应用场景
微信朋友圈点赞:在这个场景中,需要根据顺序展示点赞好友的信息,并且在取消点赞时,需要移除相关好友的信息。使用 Redis 的 List 数据结构。可以将朋友圈内容作为 Key,将点赞的用户信息作为 Value。在点赞时,可以通过使用 RPUSH 命令将用户信息添加到 List 中,这样可以维持点赞的顺序。而在取消点赞后,可以使用 LREM 命令从 List 中移除相应的用户信息,从而实现移除取消点赞的好友信息的操作。
实时数据流: List 也可以用于存储实时数据流,如日志信息或用户活动记录。新数据可以追加到 List 中,同时旧数据可以通过控制List的长度进行自动清理,以保持最近的数据。
聊天应用: List 可以用于存储聊天应用中的聊天消息。新消息可以追加到 List 中,而聊天历史可以通过 LRANGE 命令进行获取。
历史记录: List 还可以用于存储用户活动的历史记录,如用户浏览记录、搜索记录等。新的活动可以添加到 List 中,而过期的历史可以通过控制 List 的长度进行管理。
任务队列: 除了简单的消息队列,List 还可以用作更复杂的任务队列,例如在任务处理系统中,任务可以以 JSON 格式存储在 List 中,然后工作进程可以从 List 中获取并执行任务。
7 Set(集合)基本操作命令
Set 是一种无序的、不重复元素集合。每个 Set 中的元素都是唯一的,且没有特定的顺序。Redis 的 Set 数据结构内部使用哈希表来存储元素,这使得添加、删除和查找操作都可以在平均常数时间内完成。
7.1 sadd key member [member …]
添加 set 集合,顺序随机且不重复
1 | 47.120.5.13:6379> sadd user zhangsan lisi wangwu zhaoliu zhangsan sunqi |
7.2 smembers key
获取全部元素
1 | 47.120.5.13:6379> smembers user |
7.3 srandmember langs count
随机获取 count 个元素
1 | 47.120.5.13:6379> srandmember user 3 |
7.4 sismember key member
判断集合是否存在元素 member
1 | 47.120.5.13:6379> sismember user zhangsan |
7.5 scard key
获取集合元素个数
1 | 47.120.5.13:6379> smembers user |
7.6 srem key member [member …]
删除集合元素
1 | 47.120.5.13:6379> smembers user |
7.7 spop key count
随机弹出 count 个元素
1 | 47.120.5.13:6379> sadd user zhangsan lisi wangwu zhaoliu zhangsan sunqi |
7.8 set(集合)的一些应用场景
获取共同好友:当涉及共同好友、社交关系等功能时,Redis 的 Set 数据结构非常适用。在微信朋友圈的点赞、评论等情境中,这一数据结构能够发挥重要作用。实现的思路是,首先将每个用户的好友列表存储在以 “friend_{userId}” 为键的 Set 集合中。例如,用户1的好友为2、3、4;用户2的好友为1、3、4;用户3的好友为1、4、5。在这种情况下,如果用户1和用户2是好友,那么他们的共同好友可以通过计算他们好友集合的交集来获取。这种方法在社交网络应用中得到广泛应用,因为 Redis 的高效 Set 数据结构能够迅速处理好友关系、共同好友等复杂的关联操作。
投票系统:Set可用于投票系统,例如针对某个主题或选项的投票。对于每个主题或选项,你可以创建一个对应的 Set,其中每个用户的 ID 作为 Set 的一个元素。用户在投票时,可以使用 SADD 命令将其 ID 添加到特定的主题或选项 Set 中,表示他们的投票。你可以使用 SCARD 命令计算 Set 的大小来统计投票数。
用户兴趣:在用户兴趣的情景中,可以使用 Set 来存储每个用户的兴趣标签。每个用户可以有一个对应的 Set,其中每个兴趣标签作为 Set 的元素。这样,可以通过 Set 的交集操作找到共同拥有相似兴趣的用户。例如,通过计算两个用户的兴趣标签集合的交集,可以找到他们之间的兴趣相似度
。
8 ZSet(有序集合)基本操作命令
Redis的 ZSet(有序集合)是一种特殊的数据结构,它与 Set 类似,但每个元素都关联了一个分数(score),使得元素在集合中保持有序状态。ZSet 允许你根据分数范围、分数排序等进行查询和操作,因此非常适合需要排序和范围查询的场景。
有序集合在内部使用散列表和跳跃表(skiplist)的混合结构,这使得它在执行查找、插入、删除操作时都能获得较好的性能。
8.1 zadd key [NX|XX] [CH] [INCR] score member [score member …]
将一个或多个成员添加到有序集合中,并设置它们的分数。以下是各个参数的解释:
key:有序集合的键名。
[NX|XX]:可选参数,用于指定行为。NX表示只在成员不存在时执行添加操作,XX表示只在成员已存在时执行更新操作。
[CH]:可选参数,表示将操作返回的结果是修改了多少个元素的数量。
[INCR]:可选参数,表示如果设置了这个选项,命令会将分数作为增量操作处理。
score:成员的分数,用于决定成员在有序集合中的排序位置。
member:要添加的成员。
1 | 将成员"John"添加到名为"leaderboard"的有序集合中,分数为100: |
8.2 zscore key member
获取元素分数
1 | 47.120.5.13:6379> zscore leaderboard David |
8.3 zrange key start stop [WITHSCORES]
获取有序集合中指定排名范围内的成员
[WITHSCORES]:是否包含分数
1 | 获取所有元素 |
8.4 zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
按照成员的分数范围从有序集合中获取成员。以下是各个参数的解释:
key:有序集合的键名。
min:分数范围的最小值。
max:分数范围的最大值。
[WITHSCORES]:可选参数,如果指定该选项,命令会同时返回成员的分数。
[LIMIT offset count]:可选参数,用于限制返回的成员数量,offset 表示从哪个位置开始,count 表示要返回的成员数量。
1 | 获取在"leaderboard"中分数在100到200之间的所有成员: |
8.5 zincrby key increment member
增加指定元素分数
1 | 47.120.5.13:6379> zincrby leaderboard 5 John |
8.6 zcard key
获取集合元素个数
1 | 47.120.5.13:6379> zcard leaderboard |
8.7 zcount key min max
获取指定范围分数个数
1 | 47.120.5.13:6379> zcount leaderboard 100 110 |
8.8 zrank key member
获取元素排名
1 | 47.120.5.13:6379> zrank leaderboard Mike |
8.9 ZSet(有序集合)的一些应用场景
排行榜:在排行榜应用中,可以使用 ZSet 来管理用户的得分、积分、点击量等。每个用户被视为一个有序集合的元素,其分数表示其排名。通过使用 ZADD 命令将用户添加到 ZSet 中,同时设置其分数。你可以使用 ZRANK 命令获取用户在排行榜中的排名,也可以使用 ZREVRANGE 命令获取排行榜的前若干名。
实时热门内容:在需要实时获取热门内容的应用中,ZSet 可用于存储内容的热度或点击量。每个内容项被视为一个元素,其分数表示热度或点击量。当内容受到点击或访问时,你可以使用 ZINCRBY 命令增加其分数。使用 ZREVRANGE 命令可以获取当前的热门内容,从高分到低分。
带权重的抽奖:如果实现带权重的抽奖活动,可以将抽奖选项作为 ZSet 的元素,设置权重作为元素的分数。权重越高,被选中的概率越大。使用 ZRANDMEMBER 命令可以根据权重进行随机抽奖,选中的元素即为获胜选项。
- 标题: Redis 基本命令和使用
- 作者: HYF
- 创建于 : 2023-08-05 23:26:32
- 更新于 : 2024-07-27 21:21:50
- 链接: https://youfeng.ink/redis-c5527684e4a2/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。