redis五种数据结构
- 字符串常用操作
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 increment //将key中存储的数值减上increment
String应用场景:
1.单值缓存 SET velue GET value (例如商品库存)
2.对象缓存 SET user:1:name value1(json格式数据) user:1:age value2
GET user:1:name user:1:age(针对于某个字段进行操作)
3.分布式锁
SETNX product:1001 true // 返回1代表获取锁成功
SETNX product:1001 false// 返回0代表获取锁失败
DEL product:1001 //执行完业务释放锁
SET product:1001 true ex 10 nx //防止程序意外终止导致死锁
4.计数器
INCR number:read:{文章id}
GET number:read:{文章id}
5.Web集群session共享
6.分布式系统全局序列号
INCRBY orderid 1000
- Hash常用操作
HSET key field value //存储一个哈希表key的键值
HSETNX key field value // 存储一个不存在的哈希表key的键值
HMSET key field value[field value...] // 在一个哈希表key中存储多个键值对
HMGET 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
Hash应用场景
1.对象缓存
HMSET user {userId}:name xiaohao {userId}:banlace 1888
2.电商购物车
添加商品: hset cart:1001 10008 1
增加数量:hincrby cart:1001 10008 1
商品总数:hlen cart:1001
删除商品:hdel cart:1001 10008
获取购物车所有商品:hgetall cart:1001
- Hash结构优缺点
优点
1)同类数据归类整合存储, 方便数据管理
2)相比string操作消耗内存与cpu更小
3)相比string存储更节省空间
缺点
1)过期功能不能使用在field上,只能用在key上
2)redis集群架构下不适合大规模使用
- List列表常用操作
LPUSH key value[value...] // 将一个或多个值value插入到key列表的表头(最左边)
RPUSH key value[value...] // 将一个或多个值value插入到key列表的表头(最右边)
LPOP key // 移除并返回key列表的头元素
RPOP key // 移除并返回key列表的尾元素
LRANGE key start stop// 返回指定列表key所指定的区间内元素
BLPOP key [key...] timeout// 从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
BRPOP key [key...] timeout// 从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
List应用场景
常用数据结构
Stack(栈) = LPUSH + LPOP -> FILO
Queue(队列) = LPUSH + RPOP
Blocking MQ(阻塞队列) = LPUSH + BRPOP
微博和微信公众号消息流
- Set集合
Set常用操作
SADD key member [member...] //往集合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中删除
SET运算操作
SINTER key [key...] // 交集运算
SINTERSTORE destination key [key...] // 将交集结果存入新集合destinction
SUNION key [key...] // 并集运算
SUNIONSTORE destination key [key...] // 将并集结果存入新集合destinction
SDIFF key [key...] //差集运算
SDIFFSTORE destination key [key...] // 将差集结果存入新集合destinction
Set应用场景
1.微信抽奖小程序
1)点击参与抽奖加入集合
SADD key {userID}
2)查看参与抽奖所有用户
SMEMBERS key
3)抽取count名中奖者
SRANDMEMBER key [count] 或 SPOP key [count]
2.微信微博点赞,收藏,标签
1)点赞
SADD like:{消息id} {用户id}
2)取消点赞
SREM like:{消息id} {用户id}
3)检查用户是否点过赞
SISMEMBER like:{消息id} {用户id}
4)获取点赞的用户列表
SMEMBERS like:{消息id}
5)获取点赞用户数
SCARD like:{消息id}
3.集合实现微信微博关注模型
- ZSet有序集合结构
ZSet常用操作
ZADD key score member [[score member...]] //往有序集合key中加入带分值元素
ZREM key member[member...] //从有序集合中删除元素
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 destination numkeys key[key...] //并集计算
ZINTERSTORE destination numkeys key[key...] //交集计算
ZSet使用场景
1.ZSet集合操作实现排行榜
1)点击新闻
ZINCRBY hostNews:20201206 1 小豪无敌
2)展示当日排行榜前10
ZREVRANGE hostNews:20201206 0 9 WITHSCORES
3)七日搜索榜单计算
ZUNIONSTORE hostNews:20201206-20201212 7 hostNews:20201206 hostNews:20201207 … hostNews:202012012
4)展示七日排行榜前10
ZREVRANGE hostNews:20201206-20201212 0 9 WITHSCORES