1. 字符串类型
1.1 常用API
SET key value //存入字符串键值对
MSET key value [key value ..].. //批量存储字符串键值对
SETNX key value //存入-个不存在的字符串键值对
GET key //获取一个字符串键值
MGET key [key ...] //批量获取字符串键值
DEL key [key ..] //删除一个键
EXPIRE key seconds //设置一个键的过期时间(秒)
INCR key //将key中储存的数字值加1
DECR key //将key中储存的数字值减1
INCRBY key increment //将key所储存的值加上increment
DECRBY key decrement //将key所储存的值减去decrement
1.2 应用场景
单值设置和获取不在过多赘述,相信大家都已经掌握哦
SET key value //单值缓存设置
GET key //单值缓存获取
对象缓存(以mysql数据表结构和内容为例)
id | name | balance |
---|---|---|
1 | xz | 122 |
2 | xm | 445 |
3 | xf | 32112 |
4 | xg | 44 |
5 | xb | 55656 |
SET user:1 value //value为json格式数据
MSET user:1:name xz user: 1:balance 122 //设置缓存内容
MGET user:1:name user:1:balance //获取缓存内容
存储上述mysql表中用户详情内容大家一般会用以上那种方法去操作?当然,了解hash数据结构的,以下方式都不太适合,这里只是拿SET和MSET做一个对比,方便大家理解记忆。
1. 使用json方式缓存,这样更新比较麻烦,每次更新都需要json序列化和反序列化等操作
2. 方式二更新就很简单了,直接设置用户单个属性字段即可
(以mysql数据表结构和内容为例)
分布式锁
SETNX product:10001 true //返回1代表获取锁成功,返回0代表获取锁失败
DEL product:10001 //执行完业务释放锁
SET product:10001 true ex 10 nx //防止程序意外终止导致死锁
计数器(我们经常会看到某篇文章被阅读了多少次之类的,就可以用下面API实现)
INCR article:readcount:{文章id}
GET article:readcount:{文章id}
其他
Web集群session共享
- spring session + redis实现session共享
分布式系统全局序列号
INCRBY orderld 1000 //redis批量生成序列号提升性能
2. Hash类型
2.1 常用API
HSET key field value //存储个哈希表key的键值 HSETNX key field value //存储一个不存在的哈希表key的键值 HMSET key field value [field value ..] //在一个哈希表key中存储多个键值对 HGET key field //获取哈希表key对应的field键值 HMGET key field [field ..] //批量获取哈希表key中多个field键值 HDEL key field [field .] //删除哈希表key中的field键值 HLEN key //返回哈希表key中field的数量 HGETALL key //返回哈希表key中所有的键值 HINCRBY key field increment //为哈希表key中field键的值加上增量increment
2.2 应用场景
对象缓存(以mysql数据表结构和内容为例)
id name balance 1 xz 122 2 xm 445 3 xf 32112 4 xg 44 5 xb 55656 HMSET user {userld}:name xz {userld}:balance 122 //格式 HMSET user 1:name xz 1:balance 122 //缓存设置 HMGET user 1:name 1:balance //缓存获取
以电商购物车商品用hash实现一下(如下图)
电商购物车
以用户id为key 商品id为field 商品数量为value
购物车操作
添加商品 hset cart:1001 10088 1 增加数量 hincrby cart:1001 10088 1 商品总数 hlen cart:1001 删除商品 hdel cart:1001 10088 获取购物车所有商品 hgetall cart:1001
当然,有了商品的id,其他数据均可以用ajax去动态获取即可,这里不再过多赘述
。字符串类型与hash类型对比
优点
- 同类数据归类整合储存,方便数据管理
- 相比string操作消耗内存与qpu更小
- 相比string储存更节省空间
缺点
- Redis集群架构下不适合大规模使用
- Redis集群架构下不适合大规模使用
3. list类型
3.1 常用API
LPUSH key value [value...] //将一个或多个值value插入到key列表的表头(最左边)
RPUSH key value [value...] //将一个或多个值value插入到key列表的表头(最右边)
LPOP key //移除并返回key列表的头元素
RPOP key //移除并返回key列表的尾元素
LRANGE key start stop //返回列表key中指定区间内的元素,区间以偏移量start和stop指定
BLPOP key [key ...] timeput //以key列表表头弹出一个元素,若列表中没有元素,阻塞等待,timeout秒如果timeout=0,一直阻塞等待
BRPOP key [key ...] timeout //Mkey列表表尾弹出一个元素,若列表中没有元素,阻塞等待,timeout秒如果timeout=0,一直阻塞等待
常用数据结构
Stack(栈) = LPUSH + LPOP //FILO 先进后出
Queue(队列) = LPUSH + RPOP //FIFO 先进先出
Blocking MQ(阻塞队列) = LPUSH + BRPOP
3.2 应用场景
以微信公共号推送文章给其粉丝为例(若小明(id=117)关注了"男港萌图"和"Java架构师编程"等公共号)
男港萌图 和 Java架构师编程分别给粉丝推送一篇文章。
LPUSH msg:117 10016 //男港萌图 发文章 ,消息ID为10016
LPUSH msg:117 10015 //Java架构师编程 发文章 ,消息ID为10015
LRANGE msg:117 0 5 // 查看最新微博消息
考虑一个问题,如果某大V粉丝特别多,用上述方法推送给其每个粉丝显然是不可取的,可能导致redis直接挂掉, 这时候我们可以将某大V消息推送到一个公用的队列,然后粉丝去拉去文章
4. list类型
4.1 常用API
4.11 SET常用操作
SADD key member [member ..] //往集合key中存入元素,元素存在则忽略,若key不存在则新建
SREM key member [member ..] //从集合key中删除元素
SMEMBERS key //获取集合key中所有元素
SCARD key //获取集合key的元素个数
SISMEMBER key member //判断member元素是否存在于集合key中
SRANDMEMBER key [count] //从集合key中选出count个元素,元素不从key中删除
SPOP key [count] //从集合key中选出count个元素,元素从key中删除
4.12 SET常用运算操作
SINTER key [key ...] //交集运算
SINTERSTORE destination key [key ...] //将交集结果存入新集合destination中
SUNION key [key .] //并集运算
SUNIONSTORE destination key [key ...] //将并集结果存入新集合destination中
SDIFF key [key ...] //差集运算
SDIFFSTORE destination key [key ...] //将差集结果存入新集合destination中
4.2 应用场景
4.2.1 微信抽奖小程序
SADD key {userId} //点击去抽奖加入集合
SMEMBERS key //查看参与抽奖所有用户
SRANDMEMBER key [count] //抽取count名中奖者(Srandmember则仅仅返回随机元素,而不对集合进行任何改动)
SPOP key [count] //抽取count名中奖者(将随机元素从集合中移除并返回)
4.2.2 微信点赞、收藏、标签
SADD like:{消息ID} {用户ID} //点赞
SREM like:{消息ID} {用户ID} //取消点赞
SISMEMBER like:{消息ID} {用户ID} //检查用户是否点过赞
SMEMBERS like:{消息ID} //获取点赞的用户列表
SCARD like:消息ID} //获取点赞用户数
4.2.3 集合操作
SINTER set1 set2 set3 //交集{c}
SUNION set1 set2 set3 //并集{a,b,c,d,e}
SDIFF set1 set2 set3 //差集{a},相当于set1和(set2与set2)的并集的差集
4.2.4 集合操作实现微博微信关注模型
{b,c,d} //aSet用户关注的人
{a,c,d,e} //bSet用户关注的人
{a,b,d,e,f} //cSet用户关注的人
SINTER aSet bSet //aSet用户和bSet用户共同关注{c,d}
//aSet用户关注的人bSet用户也关注了
SISMEMBER bSet b
SISMEMBER bSet c
SISMEMBER bSet d
SDIFF bSet aSet //我可能认识的人{e}
4.2.5 集合操作实现京东参数筛选
SADD screensize:>=78 RedmiMax98 Hisense85E7F TCL85Q6 KONKAT86 Huiwei87 //屏幕大于等于78寸的商品集合
SADD brand:huiwei Huiwei87
SADD brand:Hisense Hisense85E7F Hisense98E //海信品牌商品集合
SINTER brand:Hisense screensize:>=78 //交集商品Hisense85E7F
注意:
当然你可以直接把商品的ID直接存进来,我这里是为了便于理解,用品牌加型号代替啦
5. ZSET类型
5.1 常用API
5.11 ZSET常用操作
ZADD key score member [[score member]..] //往有序集合key中加入带分值元素
ZREM key member [member ..] //从有序集合key中删除元素
ZSCORE key member //返回有序集合key中元素member的分值
ZINCRBY key increment member //为有序集合key中元素member的分值加Eincrement
ZCARD key //返回有序集合key中元素个数
ZRANGE key start stop [WITHSCORES] //正序获取有序集合key从start下标到stop下标的元素,
其中成员的位置按分数值递增(从小到大)来排序,
下标参数start和stop都以0为底,也就是说,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推.
你也可以使用负数下标,以-1表示最后一个成员,-2表示倒数第二个成员,以此类推.
ZREVRANGE key start stop [WITHSCORES] //倒序获取有序集合key从start下标到stop下标的元素
5.12 ZSET常用运算操作
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] //并集计算,给定的一个或多个有序集的并集,
其中给定key的数量必须以numkeys参数指定,并将该并集(结果集)储存到 destination.
//并集计算
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] //交集计算,给定的一个或多个有序集的交集,
其中给定key的数量必须以numkeys参数指定,并将该交集(结果集)储存到destination.
5.2 应用场景
5.2.1 Zset集合操作实现排行榜
ZINCRBY hotNews:20201202 1 //点击新闻(这是2020中国青年的样子articleId 100)
ZREVRANGE hotNews:20201202 0 10 WITHSCORES //展示当日排行前十
ZUNIONSTORE hotNews:20201129-20201202 4 hotNews:20201129 hotNews:20201130... hotNews:20201202 //4日搜索榜单计算
ZREVRANGE hotNews:20190813-20190819 0 10 WITHSCORES //展示七日排行前十
Comment here is closed