Redis概述

Redis命令大全http://doc.redisfans.com/ Redis是一个内存数据库,用作高性能的缓存、数据库、消息中间件

特点

  1. 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用;

持久化是指Redis服务器重启时,利用预先配置好的持久化机制(RDB或AOF)将磁盘中的数据备份加载到内存中,以恢复重启前的数据状态,确保了Redis崩溃或重启后数据的完成性和一致性。

  1. 除了key-value类型的数据,还提供了list、set、zset、hash等数据结构的存储‘
  2. 支持数据的备份,即master-slave模式的备份;

优势

  1. 高性能Redis能读的速度是110000次/s,写的速度是81000次/s;
  2. 丰富的数据类型:支持String、List、Hash、Set等数据类型操作;
  3. 原子型操作Redis所有操作都是原子性的(要么完全执行,要么不执行,不会被其他线程干扰,也不会被中断);
  4. 丰富的特性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)发送消息,而接受者(订阅者)可以监听频道并接受消息。使用于实时通知、聊天系统、事件驱动等场景。

  1. 发布者(Publisher): 向指定频道发送消息;
  2. 订阅者(Subscribe):订阅一个活多个频道,接受消息;
  3. 频道(Channel): 消息传递的通道(字符串名称)。
  4. 特点:
    • 消息是即使的,订阅者只能收到订阅后的消息(无历史消息);
    • 消息是广播式的,所有订阅同一频道打得客户端都会收到消息;
    • 不需要预先创建频道,直接发放和订阅即可。

使用:

1. 订阅频道

# 订阅单个频道(阻塞并等待消息)
SUBSCRIBE new1
 
# 订阅多个频道
SUBSCRIBE new1 new2

2. 发布消息

# 向频道发布消息
PUBLISH news "Hello"

3. 取消订阅

# 取消所有订阅
UNSUBSCRIBE
 
# 取消指定频道
UNSUBSCRIBE new

4. 模式匹配订阅

# 订阅所有以“str_”开头的频道
PSUBSCRIBE str_*
 
# 发布消息到匹配的频道
PUBLISH str_123 "hello"

使用场景:

  1. 实时通知:用户行为触发事件;
  2. 聊天应用:加入频道,订阅消息;
  3. 日志监控:服务器将日志发送到指定频道,监控服务订阅频道;
  4. 微服务通信:微服务间用发布/订阅通信。

Redis事务

概述:

Redis事务与Mysql事务类似,将一组命令进行统一处理,这一组命令会按顺序执行,在事务的执行中不会被其他客户端发送的请求打断。

  1. 原子性:要么全都执行,要么全都不执行;
  2. 隔离性:事务在执行的过程中不会被其他客户端请求打断;
  3. 无回滚:Redis的事务不支持回滚操作;
  4. 批量执行:所有命令提交后一次性执行。

使用:

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

使用场景

  1. 批量操作:需要原子性执行多个命令;
  2. 乐观锁控制:配合WATCHSH实现并发控制;
  3. 复杂操作: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