1. 缓存
String类型, 也支持gzcompress
(PHP压缩函数)之后的二进制数据
例如: 热点数据的缓存, 对象serialize或json_encode之后的缓存, 全页缓存等.
2. 数据共享分布式
可以在多个应用之间共享数据.
例如: 多台AP服务器负载均衡之后的session共享.
3. 分布式锁
String类型的set
方法 只有key不存在时才添加成功且包括有效期.
SET key value [EX seconds] [PX milliseconds] [NX|XX]
比如: SET key_with_expire 1 EX 10 NX
表示这个key不存在时设置其值为1,有效期10秒.
不建议使用 setnx + setex 两步走的方法, 要保证操作的原子性比较麻烦
4. 全局ID
int类型, incrby
, 利用redis操作的单线程特性.
incrby userno 1000
比如一次性申请1000个工号给某部门使用.
mysql在批量插入时, 如果需要自增id, 也会批量申请一批id, 避免单次申请造成低效率
5. 计数器
int类型, incr
方法(每次加1, 也可以使用incrby
每次增加指定值)
例如: 文章的阅读/浏览数量, 点赞数量, 可以先写入redis再定时同步到数据库
6. 限流
int类型, incr
方法
以访问者的ip或其他信息作为key, (也可以再加上时间段限制, 比如一小时内, 一天内), 访问一次增加一次计数,, 超过次数则拦截请求
7. 位统计
Stirng类型的Bitmap应用. 可以参考Redis中bitmap的使用及在PHP中的应用
使用bitmap可以极大的节省数据存储的空间.
例如: 统计在线用户信息
8. 购物车
String或Hash. 所有String可以做的Hash都可以做.
存储与用户的商品信息, 数量, 价格等
9. 用户消息时间线 timeline
list, 双向链表, 直接作为timeline就好了, 插入有序.
10. 消息队列
list提供了两个阻塞的弹出操作: blpop, brpop, 且可以设置超时时间
- blpop:
blpop key timeout
移除并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止. - brpo:
brpop key timeout
移除并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
11. 抽奖
set类型, pop
方法, 自带一个随机获得值.
SPOP key
移除并返回集合中的一个随机元素.
- 127.0.0.1:6379> sadd db mysql
- (integer) 1
- 127.0.0.1:6379> sadd db sqlserver
- (integer) 1
- 127.0.0.1:6379> sadd db oracle
- (integer) 1
- 127.0.0.1:6379> smembers
- 1) "mysql"
- 2) "oracle"
- 3) "sqlserver"
- 127.0.0.1:6379> spop db
- "sqlserver"
- 127.0.0.1:6379> spop db
- "oracle"
- 127.0.0.1:6379> spop db
- "mysql"
- 127.0.0.1:6379> spop db
- (nil)
12. 点赞、签到、打卡
set类型. (也可以用string的bitmap)
假如一个微博ID是 t1001,用户ID是 u3001
用 like:t1001 来维护 t1001 这条微博的所有点赞用户
- 点赞了这条微博:sadd like:t1001 u3001
- 取消点赞:srem like:t1001 u3001
- 是否点赞:sismember like:t1001 u3001
- 点赞的所有用户:smembers like:t1001
- 点赞数:scard like:t1001
这个用bitmap其实更好, 只是数据类型差异比较大.
13. 商品标签
set类型.
用 goods:tags:1001 来维护商品所有的标签。下面每行数据的最后一个是tagid
- sadd goods:tags:1001 101
- sadd goods:tags:1001 138
- sadd goods:tags:1001 239
14. 商品筛选
set类型.
我们把手机品牌/屏幕尺寸/屏幕类型和产品id关联一下:
- 127.0.0.1:6379> sadd brand:iphone 1001 1003 1872
- (integer) 3
- 127.0.0.1:6379> sadd screensize:5.5-6.0 1003 1872
- (integer) 2
- 127.0.0.1:6379> sadd screentype:led 1001 1003
- (integer) 2
查询手机品牌是"iphone", 屏幕尺寸是"5.5-6.0"的所有产品id:
- 127.0.0.1:6379> sinter brand:iphone screensize:5.5-6.0
- 1) "1003"
- 2) "1872"
15. 用户关注, 推荐模型.
set类型(也可以使用string的bitmap)
比如: 关注 follow, 粉丝 fans
用户1关注的人: 2, 3, 5
- 127.0.0.1:6379> sadd user:1:follow 2 3 5
- (integer) 3
用户1的粉丝: 3, 5
- 127.0.0.1:6379> sadd user:1:fans 3 5
- (integer) 2
用户2关注的人: 1, 3
- 127.0.0.1:6379> sadd user:2:follow 1 3
- (integer) 2
用户2的粉丝: 1, 5
- 127.0.0.1:6379> sadd user:2:fans 1 5
- (integer) 2
用户1关注的人也关注了用户2(是用户2的粉丝): 取交集
- 127.0.0.1:6379> sinter user:1:follow user:2:fans
- 1) "5"
用户1可能认识的人: 取差集
- 127.0.0.1:6379> sdiff user:2:follow user:1:follow
- 1) "1"
用户2可能认识的人:取差集
- 127.0.0.1:6379> sdiff user:1:follow user:2:follow
- 1) "2"
- 2) "5"
16. 排行榜
zset类型.
例如: 获取今天点击最多的n条新闻.
- 127.0.0.1:6379> zincrby hotnews:20210909 1 1001
- "1"
- 127.0.0.1:6379> zincrby hotnews:20210909 1 1001
- "2"
- 127.0.0.1:6379> zincrby hotnews:20210909 1 1010
- "1"
- 127.0.0.1:6379> zincrby hotnews:20210909 1 1001
- "3"
- 127.0.0.1:6379> zincrby hotnews:20210909 1 1002
- "1"
- 127.0.0.1:6379> zincrby hotnews:20210909 1 1002
- "2"
- 127.0.0.1:6379> zincrby hotnews:20210909 1 1002
- "3"
- 127.0.0.1:6379> zincrby hotnews:20210909 1 1002
- "4"
- 127.0.0.1:6379> zincrby hotnews:20210909 1 1002
- "5"
- 127.0.0.1:6379> zincrby hotnews:20210909 1 1010
- "2"
- 127.0.0.1:6379> zincrby hotnews:20210909 1 1010
- "3"
- 127.0.0.1:6379> zincrby hotnews:20210909 1 1010
- "4"
- 127.0.0.1:6379> zincrby hotnews:20210909 1 1010
上面代码演示的是每次增加点击量一个(最后一个值是新闻id). 那查询今天点击最多的0-15条新闻的信息:
- 127.0.0.1:6379> zrevrange hotnews:20210909 0 15 withscores
- 1) "1010"
- 2) "5"
- 3) "1002"
- 4) "5"
- 5) "1001"
- 6) "3"
返回的数据是: 新闻id, 次数(分数), 新闻id, 次数(分数),.....