建设项目环境影响评价验收网站怎样让百度快速收录网站
目录
- 1. Redis 概述
 - 什么是 Redis
 - Redis 应用场景
 
- 2. 安装与启动
 - Redis 安装步骤
 - 源代码安装
 - 使用包管理器安装(以 Ubuntu 为例)
 
- 编译与启动命令
 - 编客户端连接
 
- 3. Redis 存储结构
 - KV 存储结构
 - 数据结构类型
 - String(字符串)
 - List(列表)
 - Hash(哈希)
 - Set(集合)
 - Zset(有序集合)
 
- 4. 基础命令
 - String 相关命令
 - List 相关命令
 - Hash 相关命令
 - Set 相关命令
 - Zset 相关命令
 
- 5. Redis 高级应用
 - 分布式锁
 - 位运算
 - 累加器
 - 阻塞队列与异步消息队列
 - 分布式定时器
 
- 6. Redis 使用场景
 - 朋友圈点赞与评论
 - 购物车实现
 - 抽奖应用
 - 时间窗口限流
 - 百度热榜与延时队列
 - 参考
 
在现代应用开发中,Redis 作为一个高性能的键值存储数据库,凭借其卓越的性能和丰富的数据结构,广泛应用于缓存、消息队列、实时分析等多个领域。
1. Redis 概述
什么是 Redis
Redis(Remote Dictionary Server)是一个开源的、高性能的键值对(Key-Value)存储数据库,广泛用于数据库、缓存和消息代理。由 Salvatore Sanfilippo 于 2009 年创建,Redis 具备以下显著特点:
- 内存存储:所有数据存储在内存中,提供极高的读写速度。
 - 多种数据结构:支持字符串、列表、哈希、集合、有序集合等多种数据类型,满足不同的应用需求。
 - 持久化:提供 RDB 和 AOF 两种持久化机制,确保数据在服务器重启后不丢失。
 - 原子操作:所有操作都是原子性的,支持事务处理。
 - 丰富的功能:包括发布/订阅、Lua 脚本、主从复制、哨兵和集群模式,适应各种复杂应用场景。
 
Redis 应用场景
Redis 的高性能和多样的数据结构使其适用于多种场景,包括但不限于:
- 缓存:缓存数据库查询结果、会话数据等,提升系统性能。
 - 消息队列:通过列表或发布/订阅模式实现消息队列功能。
 - 排行榜和计数器:利用有序集合和计数器功能实现实时排行榜和计数器。
 - 实时分析:进行实时数据分析和统计,如网站访问量、在线用户数等。
 - 分布式锁:在分布式系统中实现锁机制,保证资源的安全访问。
 - 持久化存储:在需要高性能读写且数据量较小的场景下作为主数据存储。
 
2. 安装与启动
Redis 安装步骤
Redis 的安装方式多种多样,常见的有源代码安装和使用包管理器安装。以下以源代码安装和 Ubuntu 系统下的包管理器安装为例,详细介绍 Redis 的安装步骤。
源代码安装
-  
下载源码:
wget http://download.redis.io/redis-stable.tar.gz tar xzf redis-stable.tar.gz cd redis-stable -  
编译:
make make test # 可选,运行测试确保编译正确 sudo make install -  
配置:
Redis 默认配置文件为redis.conf,可以复制一份进行修改:cp redis.conf /etc/redis.conf # 以管理员身份登录 sudo -i cd /etc/redis/ #备份 cp redis.conf redis.conf.copy -  
启动 Redis:
redis-server /etc/redis.conf 
使用包管理器安装(以 Ubuntu 为例)
-  
更新包列表:
sudo apt update -  
安装 Redis:
sudo apt install redis-server -  
启动 Redis 服务:
sudo systemctl start redis sudo systemctl enable redis # 设置开机自启动 
编译与启动命令
编译 Redis 源代码的主要命令如下:
-  
编译:
make -  
运行测试(可选):
make test -  
安装:
sudo make install -  
配置:
sudo vim /etc/redis/redis.conf# 守护进程,修改为yes后即后台运行 daemonize yes # 监听的地址,默认127.0.0.1,会导致只能在本地访问,修改为0.0.0.0则可以在任意IP范文 bind 0.0.0.0 # 密码,设置后访问redis必须输入密码 requirepass 123456 # 监听端口号,默认6379 port 6379#重启 redis sudo service redis restart 
启动 Redis 服务器的命令:
redis-server /path/to/redis.conf
 
常用选项包括:
-  
后台运行:
在redis.conf中设置daemonize yes,或使用命令行参数--daemonize yes。 -  
指定配置文件:
redis-server /etc/redis/redis.conf 
停止 Redis 服务器:
redis-cli shutdown
 
编客户端连接
redis-cli [options] [commonds]
-h 指定要连接的redis节点的IP地址,默认是127.0.0.1
-p 指定要连接的redis节点的端口,默认是6379
-a 指定redis的访问密码 #例如
redis-cli -h 127.0.0.1 -a 123456
 
3. Redis 存储结构
Redis 支持多种数据结构,每种数据结构适用于不同的应用场景。以下是 Redis 的主要存储结构详解。
KV 存储结构
Redis 的基本数据模型是键值对(Key-Value)。每个键都是唯一的,可以关联不同类型的值。键通常是字符串,值可以是多种数据类型,包括字符串、列表、哈希、集合和有序集合。
 
数据结构类型
String(字符串)
- 描述:最基本的 Redis 数据类型,类似于键值对中的值。
 - 特点: 
- 可以包含任何类型的数据,如文本、数字、二进制数据。
 - 最大值为 512 MB。
 
 - 常用命令: 
SET key value:设置键的值。GET key:获取键的值。INCR key:将键的值递增。
 
示例:
SET name "Alice"
GET name  # 返回 "Alice"
 
List(列表)
- 描述:一个有序的字符串列表,可以从两端推入或弹出元素。
 - 特点: 
- 支持队列和栈操作。
 - 双端链表实现,适合频繁的头尾操作。
 
 - 常用命令: 
LPUSH key value:在列表左侧推入一个值。RPUSH key value:在列表右侧推入一个值。LPOP key:弹出左侧第一个值。RPOP key:弹出右侧第一个值。
 
示例:
LPUSH mylist "a"
RPUSH mylist "b"
LRANGE mylist 0 -1  # 返回 ["a", "b"]
 
Hash(哈希)
- 描述:键对应的值是一个键值对集合,类似于对象或字典。
 - 特点: 
- 适合存储对象的属性。
 - 内存占用较少。
 
 - 常用命令: 
HSET key field value:设置哈希字段的值。HGET key field:获取哈希字段的值。HGETALL key:获取哈希中所有字段和值。
 
示例:
HSET user:1000 name "Alice" age "30"
HGETALL user:1000  # 返回 {"name": "Alice", "age": "30"}
 
Set(集合)
- 描述:一个无序的字符串集合,所有元素都是唯一的。
 - 特点: 
- 支持集合间的交、并、差运算。
 - 适合存储标签、好友列表等。
 
 - 常用命令: 
SADD key member:向集合添加一个成员。SREM key member:从集合中移除一个成员。SMEMBERS key:获取集合中的所有成员。
 
示例:
SADD myset "a" "b" "c"
SMEMBERS myset  # 返回 ["a", "b", "c"]
 
Zset(有序集合)
- 描述:一个带有分数的有序集合,成员按分数排序。
 - 特点: 
- 支持按分数范围查询。
 - 适合实现排行榜、优先队列等。
 
 - 常用命令: 
ZADD key score member:向有序集合添加成员及其分数。ZRANGE key start stop [WITHSCORES]:按分数范围获取成员。ZREM key member:移除有序集合中的成员。
 
示例:
ZADD leaderboard 100 "Alice"
ZADD leaderboard 200 "Bob"
ZRANGE leaderboard 0 -1 WITHSCORES  # 返回 ["Alice", "100", "Bob", "200"]
 
4. 基础命令
Redis 提供了丰富的命令集来操作不同的数据结构。以下是各数据类型的一些常用基础命令。
String 相关命令
-  
SET:设置键的值。
SET key value -  
GET:获取键的值。
GET key -  
INCR:将键的值递增 1。
INCR key -  
DECR:将键的值递减 1。
DECR key -  
APPEND:向键的值追加字符串。
APPEND key value 
List 相关命令
-  
LPUSH:在列表左侧推入一个或多个值。
LPUSH key value1 [value2 ...] -  
RPUSH:在列表右侧推入一个或多个值。
RPUSH key value1 [value2 ...] -  
LPOP:弹出列表左侧第一个值。
LPOP key -  
RPOP:弹出列表右侧第一个值。
RPOP key -  
LRANGE:获取列表指定范围的值。
LRANGE key start stop 
Hash 相关命令
-  
HSET:设置哈希字段的值。
HSET key field value -  
HGET:获取哈希字段的值。
HGET key field -  
HDEL:删除哈希中的一个或多个字段。
HDEL key field1 [field2 ...] -  
HGETALL:获取哈希中所有字段和值。
HGETALL key -  
HEXISTS:检查哈希中是否存在某个字段。
HEXISTS key field 
Set 相关命令
-  
SADD:向集合添加一个或多个成员。
SADD key member1 [member2 ...] -  
SREM:从集合中移除一个或多个成员。
SREM key member1 [member2 ...] -  
SMEMBERS:获取集合中的所有成员。
SMEMBERS key -  
SISMEMBER:检查成员是否在集合中。
SISMEMBER key member -  
SCARD:获取集合的成员数量。
SCARD key 
Zset 相关命令
-  
ZADD:向有序集合添加一个或多个成员及其分数。
ZADD key score1 member1 [score2 member2 ...] -  
ZRANGE:按分数范围获取成员。
ZRANGE key start stop [WITHSCORES] -  
ZREM:移除有序集合中的一个或多个成员。
ZREM key member1 [member2 ...] -  
ZSCORE:获取成员的分数。
ZSCORE key member -  
ZCARD:获取有序集合的成员数量。
ZCARD key 
5. Redis 高级应用
Redis 不仅是一个简单的键值存储,还支持许多高级功能,适用于复杂的应用场景。以下是 Redis 的几种高级应用详解。
分布式锁
在分布式系统中,分布式锁用于确保多个进程或线程之间对共享资源的互斥访问。Redis 通过 SETNX 命令和过期时间来实现分布式锁。
实现步骤:
-  
尝试获取锁:
SET key value NX PX timeoutNX:只有在键不存在时才设置键。PX timeout:设置键的过期时间,防止死锁。
 -  
释放锁:
通过 Lua 脚本确保释放锁的原子性:if redis.call("GET", key) == value thenreturn redis.call("DEL", key) elsereturn 0 end 
示例:
SET mylock "unique_value" NX PX 30000  # 尝试获取锁,30秒过期
 
位运算
Redis 提供了对位(bit)的操作,通过 BITOP 和相关命令可以进行高效的位操作。
常用命令:
-  
SETBIT:设置位值。
SETBIT key offset value -  
GETBIT:获取位值。
GETBIT key offset -  
BITCOUNT:统计位为 1 的数量。
BITCOUNT key [start end] -  
BITOP:对多个键的位进行操作(AND, OR, XOR, NOT)。
BITOP operation destkey key1 [key2 ...] 
应用场景:
- 用户活跃度统计。
 - 布隆过滤器实现。
 - 权限控制。
 
累加器
累加器用于对数值进行累加操作,常用于统计和计数。
实现方式:
利用 Redis 的 INCR、INCRBY 等命令对键的值进行递增操作。
示例:
INCR page_views  # 将 page_views 键的值递增 1
INCRBY page_views 10  # 将 page_views 键的值递增 10
 
阻塞队列与异步消息队列
Redis 的列表可以用作阻塞队列,通过 BLPOP 和 BRPOP 命令实现。
 
阻塞队列:
生产者通过 RPUSH 将消息推入队列,消费者通过 BLPOP 从队列左侧阻塞获取消息。
示例:
# 生产者
RPUSH queue "message1"# 消费者
BLPOP queue 0  # 阻塞等待直到有消息
 
发布/订阅模式:
利用 Redis 的发布/订阅功能实现消息广播。
示例:
# 订阅者
SUBSCRIBE channel1# 发布者
PUBLISH channel1 "Hello, World!"
 
分布式定时器
分布式定时器用于在分布式系统中实现定时任务,可以利用 Redis 的有序集合和定时任务调度机制。
实现步骤:
-  
存储定时任务:
将定时任务存储在有序集合中,分数为执行时间戳。ZADD timers timestamp task_data -  
调度执行:
定期检查有序集合中分数小于等于当前时间的任务并执行。ZRANGEBYSCORE timers -inf current_timestamp -  
执行并移除任务:
执行任务后,将其从有序集合中移除。ZREM timers task_data 
6. Redis 使用场景
Redis 的高性能和多样化的数据结构使其适用于多种实际应用场景。以下是一些典型的使用案例。
朋友圈点赞与评论
在社交应用中,用户的点赞和评论操作需要高并发处理。Redis 的高性能读写能力可以有效应对这种场景。
实现方式:
-  
点赞计数:
使用字符串或哈希存储每条动态的点赞数量。INCR post:1000:likes -  
用户点赞记录:
使用集合记录用户对哪些动态进行了点赞,防止重复点赞。SADD user:1000:liked_posts 2000 -  
评论存储:
使用列表存储动态的评论。RPUSH post:1000:comments "Great post!" 
购物车实现
在电商平台中,购物车需要快速响应用户的添加、删除和更新操作。Redis 的哈希和列表结构非常适合此类需求。
实现方式:
-  
用户购物车:
使用哈希存储每个用户购物车中的商品及数量。HSET cart:user1000 item123 2 HSET cart:user1000 item456 1 -  
购物车列表:
使用列表记录购物车中的商品顺序,支持展示和排序。RPUSH cart:user1000:items "item123" "item456" 
抽奖应用
抽奖应用需要高效随机抽取中奖用户,Redis 的集合和有序集合提供了良好的支持。
实现方式:
-  
用户集合:
使用集合存储所有参与抽奖的用户。SADD lottery:participants user1 user2 user3 ... -  
随机抽取:
使用SRANDMEMBER命令随机抽取中奖用户。SRANDMEMBER lottery:participants 1 
时间窗口限流
为了防止系统被过多请求压垮,可以使用 Redis 实现基于时间窗口的限流。
实现方式:
-  
滑动时间窗口:
使用有序集合记录请求的时间戳,并在每次请求时清理过期记录,判断当前请求数是否超过限制。ZADD user:1000:requests timestamp ZREMRANGEBYSCORE user:1000:requests -inf (current_time - window_size) ZCARD user:1000:requests -  
固定时间窗口:
使用计数器在固定时间窗口内计数。INCR user:1000:count EXPIRE user:1000:count window_size 
百度热榜与延时队列
百度热榜:
 利用有序集合实现实时的热点榜单,根据关键词的热度(分数)排序展示。
实现方式:
ZINCRBY hotwords 1 "keyword1"
ZRANGE hotwords 0 -1 WITHSCORES
 
延时队列:
 使用有序集合和定时任务调度实现延时任务,如定时发送邮件、订单超时处理等。
实现方式:
ZADD delayed_tasks execute_timestamp "task_data"
 
定期检查并执行到期任务:
ZRANGEBYSCORE delayed_tasks -inf current_timestamp
 
参考
0voice · GitHub
