目录
redis单线程操作,挨个操作,有一个慢,会导致阻塞
String应用场景
单个缓存 | 对象缓存 | 分布式缓存 |
set key value | set user:1 value(json格式数据) | 线程1:setnx product:10001 true //返回1代表获取锁成功 线程2:setnx product:10001 false//返回0代表获取锁失败 ---执行业务操作 del product:10001 //执行完业务释放锁 set product:10001 true ex 10 nx //防止程序意外终止导致死锁 |
get key | mset user:1 name:ceshi mget user:1 name:ceshi | |
改其中一个,用户的json转对象,改后再转json放redis | 改其中一个对象的数据,直接mset一个字段 |
计数器
incr
对象存储
挨个操作,有一个慢,会导致阻塞 解决方式:大的数据分段存储,取模操作
hash
电商场景:购物车 1)以用户id作为key 2)商品id作为field 3)数量作为value
1添加商品
1添加商品 | hset cart:1001 10081 1 | ||
2增加数量 | hincrby cart:1001 10081 1 | ||
3商品总数 | hlen cart:1001 | ||
4删除商品 | hdel cart:1001 10081 | ||
5获取购物车所有商品 | hgetall cart:1001 |
redis集群架构 数据分片存储
没有对数据做合理分段
list使用场景
微博消息和微信公众号消息
lpush key value
常用数据结构 | |||
Stack | 栈 | lpush+lpop | 先进后出 |
Queue | 队列 | lpush+rpop | 先进先出 |
Blocking MQ | 阻塞队列 | lpush+brpop |
redis发一条消息,执行几百条命令,几百毫秒,可以放在管道里面
微博消息和微信公众号消息 --> 推模式 数量少
A(id为16666)关注了Mk,飞天等大V
1)Mk发微博,消息Id为10018 lpush msg:16666 10018
2)飞天发微博,消息id为10020 lpush msg:16666 10020
3)查看最新微博消息 lrange msg:16666 0 5
[root@iZ2ze2n8lmniujpxvsfuceZ redis]# cd redis
[root@iZ2ze2n8lmniujpxvsfuceZ redis]# redis-cli //进入redis客户端
127.0.0.1:6379>
127.0.0.1:6379> auth "123456" //输入密码
OK
127.0.0.1:6379> lpush msg:16666 10018
(integer) 1
127.0.0.1:6379> lpush msg:16666 10020
(integer) 2
127.0.0.1:6379> lrange 16666 0 5
(empty array)
127.0.0.1:6379> lrange msg:16666 0 5 //后发的消息在前面
1) "10020"
2) "10018"
127.0.0.1:6379>
Set使用
微信抽奖小程序
1)点击参与抽奖加入集合 sadd act:101 1888
2)查看参与抽奖所有用户 smembers act:101
3)抽取count名中奖者srandmember act:101 2 (不删除之前抽取的) spop act:101 3(删除之前抽取的)
[root@iZ2ze2n8lmniujpxvsfuceZ ~]# redis-cli
127.0.0.1:6379> auth "123456"
OK
127.0.0.1:6379> sadd act:101 1888
(integer) 1
127.0.0.1:6379> sadd act:101 1889
(integer) 1
127.0.0.1:6379> sadd act:101 1890
(integer) 1
127.0.0.1:6379> sadd act:101 1890
(integer) 0
127.0.0.1:6379> sadd act:101 1891
(integer) 1
127.0.0.1:6379> sadd act:101 1892
(integer) 1
127.0.0.1:6379> sadd act:101 1893
(integer) 1
127.0.0.1:6379> sadd act:101 1894
127.0.0.1:6379> smembers act:101
1) "1888"
2) "1889"
3) "1890"
4) "1891"
5) "1892"
6) "1893"
7) "1894"
127.0.0.1:6379> srandmember act:101 2
1) "1894"
2) "1893"
127.0.0.1:6379> srandmember act:101 2
1) "1891"
2) "1889"
127.0.0.1:6379> spop act:101 3
1) "1894"
2) "1892"
3) "1891"
127.0.0.1:6379> smembers act:101
1) "1888"
2) "1889"
3) "1890"
4) "1893"
微信微博点赞,收藏,标签
1)点赞 sadd like:{消息id} {用户id}
2)取消点赞 srem like:{消息id} {用户id}
3)检查用户是否点过赞 sismember like:{消息id} {用户id}
4)获取点赞的用户列表 smembers like:{消息id}
5)获取点赞用户数 scard like:{消息id}
集合
SDIFF:以第一个集合为基准,减去后面所有集合的并集(合集);
关注模型:
作用:推荐系统
ZSet 有序集合
有索引下标
实现排行榜,微博热搜
拉模式 list
推模式(见上)大v发消息,推给粉丝 。-->粉丝少
大V发一条消息到队列,用户拉取信息,本地展示; 几千万,上亿的有专门服务器
拉的模式,拉取下比对,再根据时间排序,展示列表
消息流