string类型被广泛使用,这是初级redis使用者最常用的类型,其实string类型还可以表示int和bitmap,这两种在大型复杂应用中也会被大量使用,下面分别说明:
(1)redis实现文章“阅读量”统计,类似的还有“点击量”等场景。
INCR article:readcount:101 --计数加1
GET article:readcount:101 --查看总数量
(2)web集群的session共享,基于string类型存储session。
(3)分布式系统全局序列号,典型的场景是基于redis实现递增的序列号。
INCRBY orderId 1000 --每次取1000个id,有效减少交互次数。
(4)基于bitmap操作,可以实现多种常见的场景
指令简单介绍:
setbit k1 1 1 --将k1值 第一位设置为1,此时k1共8位
get k1 --获取bit的asci码值
bitcount k1 0 -1 --统计第一个字节到最后一个字节的1的个数
bitop and k3 k1 k2 --将k1和k2的值与运算,bit位运算是bitmap使用场景的基石。
get k3 --获取k3的值
应用场景:
hash在代码中被频繁使用,基于redis的hash结构也同样被大量使用,可以将redis看作为项目中的全局变量,因此在涉及到交互的场景中,可以用redis的hash存储缓存数据,比如电商场景中的购物车,或者是游戏场景中的玩家属性。
(1)实现用户购物车功能
hset card:10001 10088 1 --添加商品
hincrby card:1001 10088 1 --增加数量
hlen card:1001 --商品总数
hdel card:1001 10088 --删除商品
hgetall card:1001 --获取所有商品
缺点:
a: 过期功能不能在field上,只能在key上。
b: redis集群架构下不适合大规模使用。
c:使用hash要避免出现bigkey。
list的底层是双向链表,基于我们平时都list理解,很容易想到基于list可以构建其他几个常见的结构:stack、queue等,有了这些数据结构,可以方便的解决一些典型的问题,比如:排队系统、消息流等。
(1)基于list实现常用的数据结构,可用于排队系统。
Stack = LPUSH+ LPOP -> FILO
Queue = LPUSH + RPOP
Blocking MQ = LPUSH + BRPOP
(2)微信和微博公众号的消息流: pull和push模型
a:将公众号的消息内容以list的形式存在redis中,可以快速的访问。
b:实现过程:Mac发布微博,消息为10018
LPUSH msg:{id-监听} 10018
LRANGE msg:{id-监听} 0 4
如果粉丝数少可以用push方式,粉丝数多的时候可以主动获取。
set是一个无序集合,在互联网中也被大量使用,比如:抽奖集合、点赞集合等。
(1)微信抽奖小程序
a:点击参与到抽奖集合
SADD key {userId}
b:查看抽奖的所有用户
SMEMBERS key
c:抽取count名中奖者
SRANDMEMBER key [count] --不会删除
SPOP key [count] --会删除
(2)微信微博的点赞,收藏,标签
a:点赞
SADD like:{消息id} {用户id}
b:取消点赞
SREM like:{消息id} {用户id}
c:检查用户是否点过赞
SISMEMBER like:{消息id} {用户id}
d:获取点赞的用户列表
SMEMBERS like:{消息id}
e:获取点赞用户数
SCARD like:{消息id}
(3)集合间操作
命令简单介绍:
SINTER set1 set2 set3 -> {c} 取集合1,2,3的交集。
SUNION set1 set2 set3 -> {a,b,c,d} 取集合1,2,3的交集
SDIFF set1 set2 set3 -> {a} 在集合1中且不再集合2,3中
集合操作的使用场景广泛,比如社交系统中可能认识的人,电商中可能感兴趣的商品。
ZSet是一个有序的集合,典型的使用场景是排行榜。
(1)ZSet实现排行榜
a:点击新闻
ZINCRBY hotNews:20240131 1 --守护hokon
b:展示当前排行榜前十
ZREVRANGE hotNews:20210215 0 9 WITHSCORES
c:七日搜索榜单
ZUNIONSTORE hotNews:20210215-20210221 7 hotNews:20210215 hotNews:20210216 ... hotNews:20210221
d:展示七日排行前十
ZREVRANGE hotNews:20210215-20210221 0 9 WITHSCORES