本章讲解的是redis的常用API和常见的场景,如下图所示
一、string
1.字符串(值的基本操作)
1.set(NX|XX)方法
- 默认 有key覆盖,没key就创建
NX Only set the key if it does not already exist. -只能新建 - XX Only set the key if it already exist. -只能更新
2.mset和mget
msetnx(原子性操作)
3.append
4.setrange和getrange
-
正反向索引
setrange中如果set的value值长度大于原来的值,会改变key长度并添加
5.strlen
2.数值
1.redis的优化机制
(1) type
对于每个key都有一个type
命令是哪个分组的,set之后的value就是哪个类型的
(2)encoding
随着不同的api操作encoding会改变
1.int
这里的set进去的string类型的k2的encoding是int类型,因为它的value是一个数值99,所以通过判断encoding类型我们还可以进行数值对应的api操作
2.embstr
3.raw
(3)原子性操作
mgetset原子性操作,通过一个命令进行一次通信,减少了一次通信该过程,减少了IO
(4)二进制安全
流分为字节流和字符流.
redis传输走的是字节流,只要双方有一致的编解码,数据就不会破坏,不会影响数据的存储
set k1 99
那么它会事先判断能否数字计算,如果能encoding就是int类型
下次调用加减的时候就可以少进行一次判断,提高性能,但他底层还是二进制进行加减的
如下图,分别在k2和k3中存入了UTF8和GBK格式的’中’,启动客户端不加–raw的话就默认为asscii码,加了就是本地的编码
2.APi
(1).incr,incrby和incrbyfloat
(2).decr,decrby
3.bitmap(重要)
bitmap算得上redis的核心了,常见场景如下图所示:
1.常见场景
-
场景一:有用户系统,统计用户登录天数,且窗口随机(在某个范围内统计用户登录的天数)
解决方式1 : 通过mysql存表查询获取
解决方式2 : 通过redis操作解决(计算速度快,节省磁盘空间)
指令: 1.设置天数 setbit sean 1 1 setbit sean 7 1 setbit sean 364 1 strlen sean // 长度 2.统计某个范围的天数(一个字节代表能表示8天) bitcount sean -2 -1 通过上述设置可得到结果在redis存储 日期(第几天): 1 2 3 4 5 6 7 8 9 10 ... jack 0 1 0 1 0 1 0 1 0 1 ... tom 1 1 0 1 0 1 1 0 0 0 ...
-
场景二:618做活动送礼物,大库备货多少礼物?假设有2亿用户
账号存在僵尸用户(冷热用户/忠诚用户)
步骤:
-
统计活跃用户(随机窗口)
比如统计 2-3号都登陆的, 连续登录要去重
key为天数,bit每一位代表一个用户,做或预算之后在统计
-
2.API
1.setbit
基于redis的二进制安全,进行的二进制位图操作
2.bitpos
3.bitcount
4.bittop
可以进行位操作
二、list
1.结构设计
key上面有head和tail指针,可以通过key进行快速的访问
相当于一个双向链表可以实现栈,队列等命令
2.API
1.lpush和rpush
2.lpop和rpop
3.lrange和rrange(array)
这里的l是指的list的意思,相当于是查找list指定索引的数据(redis有正反索引所以查找更快速)
4.lindex和lset(array)
单个索引获取元素
5.lrem和linsert
删除k3中后面两个a:
6.llen和ltrim
7.blpop,brpop,brpoplpush
阻塞的单播队列:
client1:
blpop key1 0
之后就会一直阻塞知道获取到key(可自定义超时时间)
client2:
blpop key1 0
client3:
blpush key1 1 ->执行之后client1获取到
blpush key1 1 ->执行之后client2获取到
三、hash
- hash的引入原因:
1.常用场景
- 点赞,收藏,详情页(对filed进行数值的计算)
2.API
1.hset和hget
2.hkeys,hvals,hgetall
3.hincrby,hincrbyfloat
四、set
1.特性
- 无序
- 随机
- 去重
- 放入的多少不同,元素存储的顺序不同
2.常用场景
-
场景1:随机抽10个奖品?
- 用户数量是否小于奖品数量
- 用户中奖是否重复
-
解决
srandmember key count
-
正数:取出一个去重的结果集(不能超过已有集,也就是一个人最多中一件礼物)
-
负数:取出一个带重复的结果集,一定要满足你要的数量(一个人可以中多件礼物)
-
0:不返回
-
3.API
1.sadd(去重),srem,smembers
2.sinter,sinterstore(交集)
3.sunion,sunionstore(并集且去重)
4.sdiff,sdiffstore(差集)
以第一个为基准,没有左右之分
5.srandmember,spop
-
srandmember
整数-随机不重复
负数-随机重复
-
spop
随机弹出
五、sorted_set
1.概念
可以自定义进行排序,redis通过score来进行判断如何排序,
默认是左小右大顺序维护,且是实时的
也存在正反索引,都为1 则按照字典序来排列
2.问题
排序是怎么实现的,增删改查的速度怎么样?
skip list (跳跃表)
-
类平衡树
-
平均值相对最优
-
插入步骤
比如我们插入一个x33
3.API
1.zadd,zrange
2.zrangebyscore,zrevrange
从小到大取出前两个: zrange k1 0 1
从大到小取出前两额: zrevrange k1 0 1
3.zsocre,zrank
4.zincrby
-
场景
歌曲排行榜,实时榜单,倒序
5.zunionstore
- 如果不加权重和聚合函数,默认走的是权重都为1,且聚合函数为sum求和
-
如果加上权重,不加聚合,相当于走默认的求和,权重相当于是对于原值的比例