redis这一块预计
- 介绍一下五种数据类型的使用,redis事务,发布订阅,持久化,主从,哨兵,高可用集群等等...具体写多少文章写多详细就看心情吧
redis 数据类型 操作命令参考
- 这里我使用的是docker安装的...省劲儿,几行命令就搞定了.弊端就是不熟悉redis的人针对于它的必要配置还是不熟悉 安装好之后
进入redis
docker exec -it redis-test(容器名) /bin/bash
启动
redis-cli -p 6379
想搜哪些命令可以 help @...
例子 help @stirng
所以命令这一块就不多说了,想搜什么官网也行 redis里面也有
String应用场景
- 单值缓存 set key value get key
- 对象缓存
这里拿user对象举例,看场景使用
相信大部分小伙伴使用这种方式
1. set user:1 value(json格式数据)
也可以用批量存储(用于经常修改用户某一两个字段,分KEY存储)
2. mset user:1:name 张三 user:1:sex 男
mget user:1:name user:1:sex
- 分布式锁(入门级别)
setnx product:101 true //返回1代表获取锁成功
setnx product:101 true //返回0代表获取锁失败
..业务
del product:10001 //执行完业务释放锁
set product:10001 true ex 10 nx //防止程序以外终止导致死锁
- 计数器
文章阅读量,比如说微信文章阅读量
incr article:readcount:{文章id}
get article:readcount:{文章id}
- web集群session共享
这里我记得 spring session有多种实现(比如说mysql,zookeeper,mongodb) redis只是一种
spring session + redis实现session共享
- 分布式系统全局序列号
incrby orderid 100 //批量生成序列号 提升性能
目的: 为减少和redis的交互,在内存中进行++, 最后和redis进行交互
场景: 自己看着来...比如说同时需要生成的量比较大,数据库进行了分库分表不能使用自增id
hash应用常见
hash结构: key value -> vlue里面也是 key value,简单来说就是map套map
- 对象缓存
user举例(批量)
hmset user {userId}:name 张三 {userId}:sex 男
hmset user 1:name 张三 1:sex 男
hmget user 1:name 1:balance
弊端:
如果用户太多....会出现bigkey问题(毕竟是单线程的东西,会出现延迟,导致阻塞.) 这时候需要分段存储
- 购物车(常用)
1. 添加商品 hset cart:{用户id} {商品id} {数量}
hset cart:1 111 1
hset cart:1 222 1
2. 增加商品数量 hincrby cart:1 111 1
3. 商品总数 hlen cart:1
4. 删除商品 hdel car:1 111
5. 获取购物车所有商品 hgetall cart:1
- 相对string 比较:
优势:
1.同类数据归类整合储存,方便数据管理 (一个key 管理多个用户)
2.相比string操作小号内存与cpu更小 (2和3 底层数据结构的原因)
3.相比string储存更节省空间
劣势:
1.过期功能不能使用再field上,只能用在key 上
2.redis集群架构下不适合大规模使用(不能平均分配(也可以解决))
list
因为用的少,所以提一下操作 一个key对应过个值
- 常用操作
lpush key value[...] 从左边放
lpush 张三 李四
lpush 王五 赵六
rpush ... 从右边放
lpop key 移除并返回key别表的头元素 (从左边拿元素并移除)
rpop key 移除并返回key列表的尾元素
lrange key start stop //返回列表key中指定区间内的元素,区间以偏移量start和stop指定
blpop key [key..] timeout 从列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout = 0 ,一直阻塞等待
brpop key [key...] timeout 从列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout = 0 ,一直阻塞等待
- 常用数据结构
stack(栈) = lpush + lpop 先进后出(first int last out )
queue(队列) = lpush + rpop 先进先出
blocking mq(阻塞队列) = lpush+brpop
- 微信朋友圈
后发消息 先展示
张三 的好友 李四 王五
1. lpush msg:{张三的Id} {李四先发的朋友圈}
2. lpush msg:{张三的id} {王五后发的朋友圈}
3.张三查看朋友圈
lrange msg:{张三的id} 0 4 从左边开始拿数据,索引从0拿到4
set
一个key 对应一个集合
- 常用操作
sadd key member[member...] 往集合key中存入元素,元素存在则忽略
srem key member [member ...] 删除元素
smembers key 获取所有元素
scard key 获取元素个数
sismember key member 判断member元素是否存在于集合key中
srandmember key [count] 选count个元素,元素不删除
spop key [count] 选count个元素,并从key中删除
- 运算操作
sinter key [key...] 交集运算
(多个集合相交的数据)
sinterstore destination key [key...] 将交集结果存入新集合destination中
sunion key[key] 并集运算
(多个集合不同的值)
sunionstore destination key [key...] 将并集结果存入新集合destination中
sdiff key [key.,..] 差集运算(
重点,第一个集合减去 后面集合的并集,然后只看第一个集合还剩下的)
sdiffstore destination key [key...] 将差集结果存入新集合destination中
- 微信点赞
1. 点赞
sadd like:{消息id} {用户id}
2. 取消点赞
srem like:{消息id} {用户id}
3. 检查用户是否点过赞
sismember like:{消息id}
(自己进入的可以看,但是其他人能看的时候就不行了,这时候就涉及到交集了)
4. 获取点赞用户
scard like:{消息id}
- 集合操作实现微信关注模型
1. 张三关注的人:
zhangsanSet ->{王五,王昭君,安其拉}
2. 李四关注的人
liseSet ->{张三,王昭君,安其拉,典韦,墨子}
3. 王五关注的人
wangwuSet ->{张三,李四,典韦,赵云}
4.张三he李四共同关注
sinter zhangsanSet lisiSet ={王昭君}
5. 张三关注的人也关注了李四
sismember wangwuSet 李四
sismember wangzhaojunSet 李四
sismember anqilaSet 李四
6. 张三可能认识的人
sdiff lisiSet zhangsanSet = {张三,典韦,墨子}
- 实现电商筛选
sadd brand:huawei huaweiMate40 p40
sadd os:ios iphone100 iphone101
sadd ram:16G iphone100 huaweiMate40
sinter brand:huawei ram:16G = {huaweiMate40}
zset
- zset 常用操作
zadd key score member [[score member]...] 往有序集合key中加入带分值元素
zrem key member [member...] 从有序集合key中删除元素
zscore key member 返回有序集合key中元素member的分值
zincrby key increment member 为有序集合key中元素member的分值加上increment
zcard key 返回有序集合key中元素个数
zrange key start stop [withscores] 正序获取有序集合key从start下表到stop下表的元素
zrevrange key start stop [withscores] 倒叙获取有序集合key从start下表到stop下标的元素
- zset 集合操作
zunionstore destkey numkeys key[key ...] 并集操作
zinterstore destkey numkeys key[key....] 交集操作
- zset 集合操作实现排行榜
1. 点击新闻(点一次加1)
zincrby hotNews:20210619 1 国际庄每逢高考就下雨
2. 展示当日排行前十
zrevrange hotNews:20200220 0 9 withscores
3. 七日搜索榜单计算
zunionstore hotNews:20200602-20200608 7
hotNews:20200602 hotNews:20200603 ...hotNews:20200608
4. 展示七日排行榜前十
zrevrange hotNews:20200601-20200610 0 9 withscores