Redis概述
Redis命令大全http://doc.redisfans.com/
Redis是一个内存数据库,用作高性能的缓存、数据库、消息中间件。
特点
- 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用;
持久化是指Redis服务器重启时,利用预先配置好的持久化机制(RDB或AOF)将磁盘中的数据备份加载到内存中,以恢复重启前的数据状态,确保了Redis崩溃或重启后数据的完成性和一致性。
- 除了
key-value类型的数据,还提供了list、set、zset、hash等数据结构的存储‘ - 支持数据的备份,即
master-slave模式的备份;
优势
- 高性能:
Redis能读的速度是110000次/s,写的速度是81000次/s; - 丰富的数据类型:支持
String、List、Hash、Set等数据类型操作; - 原子型操作:
Redis所有操作都是原子性的(要么完全执行,要么不执行,不会被其他线程干扰,也不会被中断); - 丰富的特性:
Redis支持publish/subscribe通知key过期等操作。
Redis支持的八种数据类型
String(字符串)
String类型在Redis中存储方式为一个key对应一个value,String类型是二进制安全的。Redis的String可以包含任何数据,比如jpg图片或者序列化的对象;String类型的一个键最大能存储512MB数据。
set key value; //新增数据
get key; //获取数据
del key; //删除数据Hash(哈希)
Hash是一个键值对集合,类似java的Map,适合存储对象如服务器基本信息对象等。
hset ket field value; //插入数据
hget key field; //获取数据
hgetall key; //获取所有数据
hdel key field [field ...]; //删除数据List(列表)
有序的字符串集合,支持从头/尾部插入/删除元素(类似于堆/栈);使用场景:消息对接,最新消息排行,历史记录等。
lpush key value //从头部插入元素
rpush key value //从尾部插入元素
lpop key //从头部弹出元素
rpop key //从尾部弹出元素
lrange key start stop //获取列表范围的数据
del key //删除数据Set(集合)
无序且唯一的字符串集合,支持交集、并集、差集的运算。使用场景:标签系统、去重;
sadd key member //向集合添加元素
smembers key //获取所有集合元素
SISMEMBER key member //检查元素是否在集合中。
SINTER key1 key2 //求集合的交集Sorted Set(有序集合/ZSet)
带权重的有序集合,每个元素都关联一个分数score,按score排序。 使用场景:排行榜,延迟队列,范围查询。
ZADD key score member:添加元素并设置分数。
ZRANGE key start stop [WITHSCORES]:按分数升序获取元素。
ZREVRANGE key start stop [WITHSCORES]:按分数降序获取元素。
ZSCORE key member:获取元素的分数。Bitmaps(位图)
- 基于 String 的二进制位操作,每个 bit 可以表示 0 或 1。
- 常用命令:
SETBIT key offset value:设置某一位的值。GETBIT key offset:获取某一位的值。BITCOUNT key:统计 bit 中 1 的个数。BITOP op destkey key1 [key2 ...]:位运算(AND/OR/XOR/NOT)。
- 适用场景:
- 用户签到(如统计某月签到情况)。
- 布隆过滤器(Bloom Filter)。
- 统计 UV(独立访客数)。
HyperLogLog(基数统计)
- 用于统计唯一值数量(如 UV 统计),占用内存极小。
- 常用命令:
PFADD key element:添加元素。PFCOUNT key:统计唯一值数量。PFMERGE destkey sourcekey [sourcekey ...]:合并多个 HyperLogLog。
- 适用场景:
- 统计 UV(独立访客数)。
- 去重计数(如文章阅读量去重)。
Geospatial(地理空间)
- 存储地理位置信息,支持计算距离、范围查询等。
- 常用命令:
GEOADD key longitude latitude member:添加地理位置。GEODIST key member1 member2 [unit]:计算两个位置的距离。GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]:查询范围内的位置。
- 适用场景:
- 附近的人(如社交 App 的附近用户)。
- 位置搜索(如外卖 App 的附近商家)。
总结
| 数据类型 | 特点 | 适用场景 |
|---|---|---|
| String | 简单键值存储 | 缓存、计数器、分布式锁 |
| Hash | 键值对的集合 | 用户信息、商品详情 |
| List | 有序列表 | 消息队列、历史记录 |
| Set | 无序唯一集合 | 标签系统、好友关系 |
| Sorted Set | 带权重的有序集合 | 排行榜、延迟队列 |
| Bitmaps | 二进制位操作 | 用户签到、UV 统计 |
| HyperLogLog | 基数统计 | UV 统计、去重计数 |
| Geospatial | 地理位置存储 | 附近的人、位置搜索 |
Redis 发布/订阅
概念:
Redis的发布(Publish)/订阅(Subscribe) 是一种消息通信模式,允许发送者(发布者)向频道(Channel)发送消息,而接受者(订阅者)可以监听频道并接受消息。使用于实时通知、聊天系统、事件驱动等场景。
- 发布者(Publisher): 向指定频道发送消息;
- 订阅者(Subscribe):订阅一个活多个频道,接受消息;
- 频道(Channel): 消息传递的通道(字符串名称)。
- 特点:
- 消息是即使的,订阅者只能收到订阅后的消息(无历史消息);
- 消息是广播式的,所有订阅同一频道打得客户端都会收到消息;
- 不需要预先创建频道,直接发放和订阅即可。
使用:
1. 订阅频道
# 订阅单个频道(阻塞并等待消息)
SUBSCRIBE new1
# 订阅多个频道
SUBSCRIBE new1 new22. 发布消息
# 向频道发布消息
PUBLISH news "Hello"3. 取消订阅
# 取消所有订阅
UNSUBSCRIBE
# 取消指定频道
UNSUBSCRIBE new4. 模式匹配订阅
# 订阅所有以“str_”开头的频道
PSUBSCRIBE str_*
# 发布消息到匹配的频道
PUBLISH str_123 "hello"使用场景:
- 实时通知:用户行为触发事件;
- 聊天应用:加入频道,订阅消息;
- 日志监控:服务器将日志发送到指定频道,监控服务订阅频道;
- 微服务通信:微服务间用发布/订阅通信。
Redis事务
概述:
Redis事务与Mysql事务类似,将一组命令进行统一处理,这一组命令会按顺序执行,在事务的执行中不会被其他客户端发送的请求打断。
- 原子性:要么全都执行,要么全都不执行;
- 隔离性:事务在执行的过程中不会被其他客户端请求打断;
- 无回滚:Redis的事务不支持回滚操作;
- 批量执行:所有命令提交后一次性执行。
使用:
1. 事务的使用
multi # 开启事务
set zhang san
set li si
exec # 提交事务2. 命令入队错误
MULTI
SET key1 "value1"
INCR key1 # key1是字符串,不能INCR,执行时会报错
SET key2 "value2"
EXEC # 其他正确命令仍会执行3. WATCH 命令实现乐观锁
WATCH balance # 监视balance键
balance = GET balance
MULTI
SET balance $(balance - 100) # 假设扣除100
EXEC # 如果balance在WATCH后到EXEC前被修改,事务会失败4. 常用命令
| 命令 | 描述 |
|---|---|
| DISCARD | 取消事务,放弃执行事务块内的所有命令 |
| EXEC | 执行所有事务块内的命令 |
| MULTI | 标记一个事务块的开始 |
| UNWATCH | 取消 WATCH 命令对所有 key 的监视 |
| WATCH | 监视一个(或多个) key |
使用场景
- 批量操作:需要原子性执行多个命令;
- 乐观锁控制:配合WATCHSH实现并发控制;
- 复杂操作:Lua脚本实现更为复杂的逻辑。
Redis Script(Lua脚本)
概述:
在Redis中为了解决复杂的原子操作,引入了Lua脚本。
使用:
1. 基本使用
1.1 EVAL 命令
# 基本语法
EVAL "脚本内容" numkeys key [key ...] arg [arg ...]
# 示例:简单返回
EVAL "return 'Hello, Redis!'" 0
# 示例:带参数的脚本
EVAL "return {KEYS[1], ARGV[1]}" 1 mykey myvalue