基本命令
# key相关
keys * :查看当前数据库中 所有的key的名字 开发中一般不用 效率低
注意:redis中默认有16个数据库 数据库的下标默认是 0-15 默认数据是存放到0号数据库中的
如何进行数据库的切换呢?
select 下标
del key:删除某一个key 这个命令可以用在缓存的同步中 1表示成功0表示删除失败
exists key:判断一个key在Redis中是否存在 (场景:判断缓存是否存在、做用户身份校验 判断token是否存在)
expire key 时间(默认是秒):给这个key设置过期时间 场景(用户登陆成功 给token设置个过期时间) 大量数据同时过期雪崩效应
ttl key :获取一个key还剩余的过期的时间 查看一个key过期时间
move key 数据库的下标:这个表示的意思是:将这个key-value移动到另外一个数据库
randomkey : 随机获取一个key (场景:这个经常用来做抽奖用)
2
3
4
5
6
7
8
9
10
# String类型相关
set key value :给数据库添加一个键值对
get key :获取一个key的值
getset key value:先获取这个key的值 然后再给这个key设置值 (没找到过场景)
mset key value key value :一次性设置多个值
mget key key :一次性 获取多个值
setnx key 值 :如果这个key不存在 那么就设置值 否则不设(如果key存在就不设置值)
2
3
4
5
6
# Set存对象问题
-- 怎么将这个数据库的数据 存储到 Redis中呢?
-- 存储数据
set user:1:userName oooo
set user:1:password oooooo
-- 这个语句可以做一个改良
mset user:1:userName oooo user:1:password oooooo
mget user:1:userName user:1:password
2
3
4
5
6
7
# setnx的适用场景
# incr和incrby适用场景
这个场景使用incr这个命令怎么来设计呢?
set weixin:dz:微信的这一条信息的id 0
incr weixin:dz:微信的这一条信息的id
set weixin:pl:count:微信这一条信息的id 0
incr weixin:pl:count:微信这一条信息的id
取消点赞
decr weixin:dz:微信的这一条信息的id
如果是批处理 那么 取消几个就可以了 decrby key step
# Hash结构命令相关
hset 名字 key value :给这个hash结构设置一个键值对
hget 名字 key :获取某一个key的值
hlen 名字 :获取这个集合中数据的条目数
hgetall 名字 :获取这个集合中 所有的数据
hincrby 名字 键 step :让某一个数据自增(步长就是自增的数据)
hvals 名字 :获取这个集合中 所有的value
2
3
4
5
6
# hset/hget的适用场景
hset user 1:userName oooo hset user 1:password oooo hget user 1:userName hmset user 1:userName oooo 1:password oooo hmget user 1:userName 1:password (获取多条指定的数据)
# 综合的应用场景
# 添加购物车的数据
hset cards:用户的id 商品的id 商品的数量 -------> hset card:100 70 1
hincrby card:100 70 1---------------------->点击了这里的+号
hdecrby card:100 70 1--------------------->表示的是点击了-号
hdel card:100 70 --------------------------> 点击了商品后面的删除按钮
hgetall card:100 --------------------------->这个就表示的是点击了全选
hlen card:100 ----------------------------->这个就表示的是 选中了多少件商品
2
3
4
5
6
# List结构相关命令
lpush 名字 值
lpop 名字
rpush 名字 值
rpop 名字
lrange 名字 开始位置 结束位置 :获取开始位置 到结束位置的值 位置是下标(正向索引和反向索引)
blpop 名字 从左边位置弹出一个数据 如果左边位置没有数据 那么将处于等待状态(还可以给一个等待时间)
brpop 名字 将从最右边的位置 弹出一条数据 如果最右边没有数据 那么将处于等待状态
2
3
4
5
6
7
# 适用场景
现在某人关注了 mobtech 和 微博开放平台
你想这样一个问题:微博上 咋们如果关注了这两个平台 那么是不是我们只是接受我们关注的平台的数据
假设你是这个程序设计人员 你在发送消息的时候你只是 发送给 关注了 mobtech以及 微博公众平台的这些用户
lpush weibo-develop:msg:用户id 消息id ---------> lpush wiebo-develop:msg:100(用户id) 890(消息id)
打开微博页面 显示20条数据
lrange wiebo-develop:msg:100(用户id) 0 20 只显示最新的20条数据
lpush + brpop 可以构成阻塞队列
# Set结构相关命令
sadd 名字 值、值 :向这个集合中添加值
srem 名字 值:删除一个指定值的数据
sismember 名字 值:判断一个值 是否存在于这个集合中
srandmember 名字 抽取多少数据 :这个表示的是 从一个集合中 抽取多少个数据 数据不删除
spop 名字 抽取的数量 :从集合中取出指定个数的数据 而且数据还要删除
sinter 集合1 集合2 :求两个集合的交集
sinterstore 目的集合 集合1 集合2 :将集合1和集合2求交集 并且放到目的集合中
sunion 集合1 集合2 :求两个集合的并集
sunionstore 目的集合 集合1 集合2 :将集合1和集合2求并集集 并且放到目的集合中
sdiff 集合1 集合2 :在集合1中将集合2中拥有的元素给排除(求差集)将集合1中和集合2一样的元素给排除
scard 集合1 :计算当前集合中 拥有的元素的个数
2
3
4
5
6
7
8
9
10
11
假设我们要使用 set集合来进行存储
你们觉得要怎么设计才对?
sadd weixin:msg:用户id:消息id 关注的人的id
sadd weixinLmsg:101:77 100
scard weixinLmsg:101:7
研究下 如果要存储消息
hset weixin:msg:发送消息的人的id 消息的id: 评论的人的id 消息内容
场景
xx:关注了 xxSet = { liulei dashixing} liulei :关注了 liuleiSet = { xx dashixing yangjianhui hehanyu} yjh: 关注了 yjhSet = {dashixing xx liulei chengjunbo} dsx {liulei yjh xx}
问题来了: xx 和 yjh 共同关注的人 xx 关注的人 也关注了他( liulei ) xx 可能认识的人
# sorted set相关的命令
zadd 集合的名字 打分 key的名字 :表示的是向咋们的这个 集合中添加数据
zincrby 集合的名字 增加的分值 key的值 :给这个键 增加多少分
zrange 集合的名字 开始的区间(下标) 结束的区间(下标)
zrevrank 集合的名字 key的名字
zscore 集合的名字 key的名字 :获取这个key的值(分值)
zcount 集合的名字 分值的开始区间 分值的结束区间 统计一个分值区间内的人数的个数
2
3
4
5
6
场景:
科普:最热商品(表示的是点击数最多 或者 购买数最多的这个商品 就是咋们的最热商品)
第一次卖出一个商品
zadd hotest:goods 10 商品的id
第二次 或者 第n次卖出这个商品 (这个表示的是每卖出一次增加10分的分值)
zincrby hotest:goods 10 商品的id
如果前端页面 要获取 这个罪人商品的前20条信息
zrange hotest:goods 0 20
直播间小姐姐的热度:
主播接受的不同的礼物的分值之和+直播时间的长短+直播间粉丝的活跃度+粉丝量的问题
现在小姐姐 需要查看自己的排名:
zrevrank 集合的名字 key的名字 :查询当前的key在集合中的排名
平台认为小时榜中 热度在20000-40000是全球最强打野主播 40000-60000是地表最强的打野主播
是不是就要用到统计
zcount 集合的名字 分值的开始区间 分值的结束区间 这个就可以统计在这个区间内的人数
主播不播了 主播不播了 ------ 那么这个主播的热度全部都需要清空
# 发布订阅模型
相关的命令(不会用 会用MQ等去代替他)
进入客户端,一个发送,一个接收
subscribe 频道的名字 订阅一个频道
publish 频道的名字 发送的消息 :向某一个频道发送一个消息
# 事务问题(不能保持原子性)
multi----开启事务
exec-----执行事务
2
# 实现计数器
对于Redis的Key本身来说,有
INCRBY指令,实现某个值的递增递减。比如以下场景:统计某个帖子的点赞数;存放某个话题的关注数;存放某个标签的粉丝数;存储一个大体的评论数;某个帖子热度;红点消息数;点赞、喜欢、收藏数等。
- 像微博这样容易出现热点的业务,传统的数据库,肯定是撑不住的,就要借助于内存数据库。由于Redis的速度非常快,就不用再采用传统DB非常慢的
count操作,所有这种递增操作都是毫秒级别的,而且效果都是实时的。