Redis相关命令及应用场景详解

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis相关命令及应用场景详解

一、Redis是什么

Redis是远程字典服务Remote Dictionary Service的简称。Redis 是内存数据库,KV 数据库,V支持多种数据结构,如:string、list、hash、set、zset等。

二、Redis编译安装和启动

2.1 编译安装
git clone https://gitee.com/mirrors/redis.git -b
6.2
cd redis
make
make test
make install
# 默认安装在 /usr/local/bin
# redis-server 是服务端程序
# redis-cli 是客户端程序
2.2 启动
mkdir redis-data
# 把redis文件夹下 redis.conf 拷贝到 redis-data
# 修改 redis.conf
# requirepass 修改密码 123456
# daemonize yes
cd redis-data
redis-server redis.conf
# 通过 redis-cli 访问 redis-server
redis-cli -h 127.0.0.1 -a 123456

三、核心点

Redis是请求回应模式,也就是redis客户端发送命令请求,redis-sever给相应的回复。命令的返回值很重要。我们需要根据不同的返回值,处理自己的业务逻辑。

四、Redis中的编码

redis 内存数据库;

  1. 到底是要运行速度快,还是要存储效率高;
  2. 数据量少的时候,存储效率高为主;
  3. 数据量多的时候,运行速度快;

五、Redis K-V中的Value类型分析

5.1 String字符串

Redis的string是二进制安全字符串,还可以存储图片等二进制数据。string扩容原理:字符串小于1M时,加倍扩容超过1M每次增加1M;字符串的最大长度为512M。支持bit操作。

5.1.1 基本命令

SET key val  #设置 key 的 value 值
GET key # 获取 key 的 value
INCR/DECR key # 执行原子加一/减一的操作
INCRBY/DECRBY key increment  # 执行原子加一个/减一个整数的操作
SETNX key value #如果key不存在,则设置 该kv,如果存在则执行失败
DEL key # 删除 key val 键值对
SETBIT key offset value  # 设置字符串offset位置的为calue
GETBIT key offset # 统计字符串offset位置的值
BITCOUNT key # 统计字符串被设置为1的bit数.

5.1.2 应用

对象存储

可以存储那些,极少修改的对象。比如可以将用户的部分属性数据,保存为json格式。如果要修改某个属性,需要get key得到json串,再进行反序列化,得到结构体,再修改该属性,再序列化为json格式,set key val进行保存。可以看到比较麻烦,如果要经常修改某个属性,string就不适合存储了,可以使用hash进行存储。

累加器

比如博客的阅读量统计

分布式锁

分布式锁具体可以参考我之前的文章分布式锁原理及实现

位运算

比如可以用来统计用户某个月的签到情况。分析:该用户2022年10月第一天、第二天签到,第三天缺勤,第四天签到。 bitcount 得到该用户10月签到3次。getbit获取该用户某一天的签到情况。

5.2 List

链表中数据压缩条件:

  • 元素长度大于等于48
  • 元素压缩后长度差超过8

List是双向链表,元素前后插入时间复杂度是O(1),查找某个元素时间复杂度是O(n)。

5.2.1 基本命令
LPUSH key value [value ...] # 从队列的左侧入队一个或多个元素
LPOP key  # 从队列的左侧弹出一个元素
RPUSH key value [value ...]  # 从队列的右侧入队一个或多个元素
RPOP key  # 从队列的右侧弹出一个元素
LRANGE key start end # 返回从队列的 start 和 end 之间的元素 0, 1 2 负索引
# list 没有去重功能
LREM key count value  # 从存于 key 的列表里移除前 count 次出现的值为 value 的元素
# RPOP 的阻塞版本,因为这个命令会在给定list无法弹出任何元素的时候阻塞连接,应用:超时时间 + 延时队列
BRPOP key timeout 
5.2.1 应用
栈、队列

栈:LPUSH + LPOP 或者 RPUSH +RPOP

队列:LPUSH + RPOP 或者 RPUSH + LPOP

阻塞队列

LPUSH + BRPOP 或者 RPUSH + BLPOP

BRPOP key timeout 其中,timeout为0,表示永久阻塞。

阻塞连接。BRPOP,如果数据没准备好会阻塞,直到别的客户端有数据写入。客户端A使用BRPOP阻塞等待获取teacher队列中的消息,当客户端A生产消息后,客户端A就能收到消息。

异步消息队列

与队列操作一样,只是在不同系统之间。

5.2.4 获取固定窗口记录(战绩)

比如,假设LOL游戏助手只保存你的最近50场对局记录,查找当前50条战绩,这些记录需要按照时间顺序返回。

lpush rank '{"user":"panda","hero":"卡莎","result":"win","honor":"mvp","timestamp":"2022-10-22 12:00:00"}'
lpush rank '{"user":"panda","hero":"卡莎","result":"win","honor":"mvp","timestamp":"2022-10-22 11:00:00"}'
lpush rank '{"user":"panda","hero":"麦林炮手","result":"win","honor":"mvp","timestamp":"2022-10-22 10:00:00"}'
lpush rank '{"user":"panda","hero":"霞","result":"win","honor":"","timestamp":"2022-10-22 09:00:00"}'
lpush rank '{"user":"panda","hero":"霞","result":"win","honor":"mvp","timestamp":"2022-10-22 08:00:00"}'
lpush rank '{"user":"panda","hero":"泰隆","result":"win","honor":"mvp","timestamp":"2022-10-22 07:00:00"}'
lpush rank '{"user":"panda","hero":"卡萨丁","result":"win","honor":"mvp","timestamp":"2022-10-22 06:00:00"}'
ltrim 0 49  裁剪最近50条战绩记录 
lrange 0 -1

实际项目中需要保证命令的原子性,一般用Lua脚本。

-- redis lua脚本
local record = KEYS[1]
redis.call("LPUSH", "rank", record)
redis.call("LTRIM", "rank", 0, 49)

5.3 Hash

5.3.1 基本命令
HSET key field value  # 设置 key 对应 hash 中的 field 对应的值
HGET key field  # 获取 key 对应 hash 中的 field 对应的值
HMSET key field1 value1 field2 value2 ... fieldn valuen  # 设置多个hash键值对
HMGET key field1 field2 ... fieldn  # 获取多个field的值
HINCRBY key field increment  # 给 key 对应 hash 中的 field 对应的值加一个整数值
HLEN key  # 获取 key 对应的 hash 有多少个键值对
HDEL key field  # 删除 key 对应的 hash 的键值对,该键为field
5.3.2 应用
存储对象

hash可以优雅的修改hash:10001对象指定属性的值。如果是前面提到的string就比较复杂了。注意:hash的value只能是string类型。

5.4 Set

set集合用来存储唯一性字段,不要求有序。

5.4.1 基础命令
SADD key member [member ...]  # 添加一个或多个指定的member元素到集合的 key中
SCARD key  # 计算集合元素个数
SMEMBERS key # SMEMBERS key
SISMEMBER key member  # 返回成员 member 是否是存储的集合 key的成员
SRANDMEMBER key [count]  # 随机返回key集合中的一个或者多个元素,注意并不删除这些元素
SPOP key [count] # 从存储在key的集合中移除并返回一个或多个随机元素
SDIFF key [key ...] # 返回一个集合与给定集合的差集的元素
SINTER key [key ...]  # 返回指定所有的集合的成员的交集
SUNION key [key ...]  # 返回给定的多个集合的并集中的所有成员
5.4.2 应用举例
抽奖

SADD 设置一等奖抽奖用户;SRANDMEMBER 随机抽取一等奖一名

共同关注

假设用户A的粉丝有:mark darren king

假设用户B的粉丝有:mark darren panda

则:A 和 B 的共同粉丝:darren king

推荐好友

假设用户A的粉丝有:mark darren king otto

假设用户B的粉丝有:mark darren king

则:C可能认识的人:otto

5.5 ZSET

zset是一个有序集合,典型应用就是实现排行榜功能。

5.5.1 基础命令
# 添加到键为key有序集合里
ZADD key [NX|XX] [CH] [INCR] score member [score member ...] 
ZREM key member [member ...]  # 从键为key有序集合中删除 member 的键值对
# 返回有序集key中,成员member的score值
ZSCORE key member
# 为有序集key的成员member的score值加上增量increment
ZINCRBY key increment member
# 返回key的有序集元素个数
ZCARD key
# 返回有序集key中成员member的排名
ZRANK key member
# 返回存储在有序集合key中的指定范围的元素   order by id
limit 1,100
ZRANGE key start stop [WITHSCORES]
# 返回有序集key中,指定区间内的成员(逆序)
ZREVRANGE key start stop [WITHSCORES]
5.5.2 应用举例

Redis 命令详解官方地址:http://redis.cn/commands.html

文章参考与<零声教育>的C/C++linux服务期高级架构系统教程学习:

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
NoSQL 安全 测试技术
Redis游戏积分排行榜项目中通义灵码的应用实战
Redis游戏积分排行榜项目中通义灵码的应用实战
56 4
|
2月前
|
监控 NoSQL Java
场景题:百万数据插入Redis有哪些实现方案?
场景题:百万数据插入Redis有哪些实现方案?
46 1
场景题:百万数据插入Redis有哪些实现方案?
|
2月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
84 6
|
6天前
|
NoSQL 应用服务中间件 API
Redis是如何建立连接和处理命令的
本文主要讲述 Redis 是如何监听客户端发出的set、get等命令的。
|
25天前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
55 8
|
1月前
|
监控 NoSQL 网络协议
【Azure Redis】部署在AKS中的应用,连接Redis高频率出现timeout问题
查看Redis状态,没有任何异常,服务没有更新,Service Load, CPU, Memory, Connect等指标均正常。在排除Redis端问题后,转向了AKS中。 开始调查AKS的网络状态。最终发现每次Redis客户端出现超时问题时,几乎都对应了AKS NAT Gateway的更新事件,而Redis服务端没有任何异常。因此,超时问题很可能是由于NAT Gateway更新事件导致TCP连接被重置。
|
1月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
43 5
|
2月前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
72 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
1月前
|
存储 NoSQL Java
Redis命令:列表模糊删除详解
通过本文的介绍,我们详细探讨了如何在Redis中实现列表的模糊删除。虽然Redis没有直接提供模糊删除命令,但可以通过组合使用 `LRANGE`和 `LREM`命令,并在客户端代码中进行模糊匹配,来实现这一功能。希望本文能帮助你在实际应用中更有效地操作Redis列表。
61 0
|
2月前
|
缓存 NoSQL 测试技术
Redis如何解决频繁的命令往返造成的性能瓶颈!
Redis如何解决频繁的命令往返造成的性能瓶颈!