五种数据结构
String 结构
字符串的常用操作
命令 | 说明 |
---|---|
SET key value | 存入字符串键值对 |
MSET key value [key value…] | 批量存储字符串键值对 |
SETNX key value | 存入一个不存在的字符串键值对 |
GET key | 获取一个字符串键值对 |
MGET key [key…] | 批量获取字符串键值对 |
DEL key[key…] | 删除一个键值对 |
EXPIRE key seconds | 设置一个键的过期时间(单位:秒) |
SET key value ex seconds | 设置一个带过期时间的key 单位:秒 |
原子加减操作
命令 | 说明 |
---|---|
INCR key | 将key中存储的数字值加1 |
DECR key | 将key中存储的数字值减1 |
INCRBY key increment | 将key所存储的值加上increment |
DECRBY | 将key所存储的值减去decrement |
String 应用场景
场景1:单值缓存
- 当更新或者获取某个字段时可以存放单个字符串
- SET key value
- GET key
场景2:对象缓存
- 如果不定更新对象中的某个字段时(比如:余额、名称),可以存放json对象
- SET user:1 value(json格式数据)
- MSET user:1:name juli user:1balance 1888
- MGET user:1:name user:1:balance
场景3:分布式锁
//返回1代表获取锁成功
1、SETNX product:10001 juli
//返回0代表获取锁失败
2、SETNX product:10001 juli
3、执行业务操作。。。。
4、执行完业务操作释放锁
DEL product:10001
//防止程序意外终止导致死锁
SET product:10001 juli ex 10 nx
场景4:计数器
- INCR article:readcount:{文章ID}
GET article:readcount:{文章ID}
场景5:Web集群session共享
spring session + redis实现session共享
场景5:分布式系统全局序列号 生成序号的方法很多,只举例redis
INCRBY orderId 1000 //可以从redis批量生成序列号提升性能,一次取1000个序号缓存到本地,用完再批量从redis中取
Hash结构
Hash常用操作
命令 | 说明 |
---|---|
HSET key field valie | 存储一个哈希表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 |
Hash应用场景
场景1:对象缓存
- HMSET user {userId:name} juli {userId}:balance 1000
- HMSET user 1:name juli 1:balance 1000
- HMGET user 1:name 1:balance
场景2:电商购物车
- 以用户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
hash结构优缺点
优点
- 同类数据归类整合存储,方便数据管理
- 相比string操作消耗内存与CPU更小
- 相比string存储更节省空间
缺点
- 过期功能不能使用使用在field上,只能用在key上
- 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中指定区间内的元素,区间以偏移量start和stop指定 |
BLPOP key [key…] timeout | 从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout = 0 ,一直阻塞等待 |
BRPOP key [key…] timeout | 从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout= 0 ,一直阻塞等待 |
常用数据结构
Stack(栈) = LPUSH + LPOP
Queue(队列) = LPUSH + RPOP
Blocking MQ(阻塞队列) = LPUSH + BRPOP
List应用场景
场景1:微博和微信公众号消息流
- 比如居里关注了MacTalk,备胎说车等大V
- MacTalk发微博,消息Id为100018
- LPUSH msg:{居里-ID} 10018
- 备胎说车发微博,消息id为10089
1)LPUSH msg:{居里-ID}:10089- 查看最新微博消息
1)LRANGE mag:{居里-ID}0,4
SET结构
SET常用操作
命令 | 说明 |
---|---|
SADD key member [member] | 往集合key中存入元素,若元素存在则忽略,若key不存在则新建 |
SREM key menber [menber] | 从集合key中删除元素 |
SMEMBERS key | 获取集合key中所有元素 |
SCARD key | 获取集合key的元素个数 |
SISMEMBRE key member | 判断member元素是否存在于集合key中 |
SRANDMEMBER key [count] | 从集合key中选出count个元素,元素不从key中删除 |
SPOP key [count] | 从集合key中选出count元素,元素从key中删除 |
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中 |
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)检查用户是否点过赞
- SISMEMNER like:{消息ID}{用户ID}
4)获取点赞的用户列表
- SMEMBERS like:{消息ID}
5)获取点赞用户数
- SCARD like:{消息ID}
集合的操作
SINTER set1 set2 set3 ——>{c}
SUNION set1 ste2 set3 ——>{a.b.c.d.e}
SDIFF set1 set2 set3 ——>{a}
场景1:集合操作实现微博、微信关注模型
1)居里关注的人:
居里Set ->{司马懿,曹操}
2)司马懿关注的人
司马懿Set ->{居里,项羽,司马昭,宋江}
3)司马昭关注的人
司马昭Set ->{居里,项羽,李逵}
4)我和司马懿共同关注的人:
SINTER 居里Set 司马懿Set —>{司马昭}
5)我关注的人也关注了他(项羽)
SISMEMBER 司马懿Set 项羽
SISMEMBER 曹操Set 项羽
6)我可能认识的人
SDIFF 司马懿Set,司马昭Set —>宋江、李逵
场景2:集合操作实现电商商品筛选
SADD brand:hawei P40
SADD brand:xiaomi mi-10
SADD brand:iphone ipgone12
SADD os:android P40 mi-10
SADD cpu:brand:intel P40 mi-10
SADD ram:8G P40 mi-10 iphone12
SINTER os:android cpu:brand:initel ram:8G —>{P40,mi-10}
ZSet有序集合结构
ZSet常用操作
命令 | 说明 |
---|---|
ZADD key score member [[score member]…] | 往有序集合key中加入带分值元素 |
ZREM key member [member…] | 从有序集合key中删除元素 |
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 destkey numkeys key [key…] | 并集运算 |
ZINTERSTORE destkey numkeys key [key] | 交集运算 |
ZSet应用场景
场景1:ZSet集合操作实现排行耪
1)点击新闻
- ZINCRBY hotNews:20210629 1 守护香港
2)展示当日排行前十
- ZREVRANGE hotNews:20210629 0 9 WITHSSCORES
3)七日搜索榜单计算
- ZUNIONSTORE hotNews:20210622-20210629 7
hotNews:20210622 hotNews:20210623。。。20210629
4)展示七日排行前十
- ZREVRANGE hotNews:20210530-20210629 0 9 WITHSCORES