目录
概览
一、string类型
1、基本方法
2、应用场景
二、list类型
1、基本方法
2、 应用场景
三、set 类型
1、基本方法
2、 应用场景
四、hash类型
1、基本方法
2、 应用场景
3、 优缺点
五、zset类型
1、基本方法
2、应用场景
概览
Redis 数据库支持五种数据类型。
- 字符串(string)
- 哈希(hash)
- 列表(list)
- 集合(set)
- 有序集合(sorted set)zset
结构类型 | 结构存储的值 | 结构的读写能力 |
STRING | 可以是字符串、整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行 *** 作;对整数和浮点数进行自增(increment)或者自减(decrement) *** 作 |
LIST | 一个链表,链表上的每个节点都包含了一个字符串 | 从链表的两端推入或者d出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值查找或者移除元素 |
SET | 包含字符串的无序收集器(unordered collection),并且被包含的每个字符串都是独一无二、各不相同的 | 添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素 |
HASH | 包含键值对的无序散列表 | 添加、获取、移除单个键值对;获取所有键值对 |
ZSET(有序集合) | 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 | 添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素 |
set | 添加键值对 |
get | 查询对应键值 |
append | 将给定的 |
strlen | 获得值的长度 |
setnx | 只有在key不存在时设置key的值 |
incr | 将key中储存的数字值增1;只能对数字值 *** 作,如果为空,新增值为1 |
decr | 将key中储存的数字值减1;只能对数字值 *** 作,如果为空,新增值为-1 |
incrby / decrby | 将key中存储的数字值增减。自定义步长 |
mset | 同时设置一个或多个key-value对 |
mget | 同时获取一个或多个value |
msetnx | 同时设置一个或多个key-value对。当且仅当所有给定的key都不存在 |
getrange | 获得值的范围,类似java中的substring |
setrange | 用 |
setex | 设置键值的同时,设置过期时间,单位秒 |
getset | 以新换旧,设置了新值同时获得旧值 |
del | 删除key |
expire key seconds | 设置key的过期时间 |
更多
2、应用场景(1) 单值缓存
set key value
get key
(2) 对象缓存
set user:1 value(json格式数据)
mset user:1:name zhuge user:1:balance 1888
mget user:1:name user:1:balance
(3) 分布式锁
setnx product:10001 true // 返回1代表获取锁成功
setnx product:10001 true // 返回0代表获取锁失败
.... 执行业务 *** 作
del product:10001 // 执行完业务释放锁
set product:10001 true ex 10 nx // 防止程序意外终止导致死锁
(4) 计数器
incr article:readcount:{文章id}
get article:readcount:{文章id}
(5) Web集群session共享
spring session + redis实现session共享
(6) 分布式系统全局序列号
incrby orderId 1000 // redis批量生成序列号提升性能
二、list类型 1、基本方法lpush/rpush | 从左边/右边插入一个或多个值 |
lpop/rpop | 从左边/右边吐出一个值。值在键在,值亡键亡 |
rpoplpush | 列表右边吐出一个值,插到 |
lrange | 按照索引下标获得元素(从左到右) |
lindex | 按照索引下标获得元素(从左到右) |
llen | 获得列表长度 |
linsert | 在 |
lrem | 从左边删除n个value(从左到右) |
blpop/brpop | 从key列表左边/右边d出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待 |
更多
2、 应用场景(1) 常用的数据结构
Stack = LPUSH + LPOP
Queue = LPUSH + RPOP
Blocking MQ(阻塞队列) = LPUSH + BRPOP
(2) 微信公众号消息流
xxx关注了MacTalk,刘备说车等大V
MacTalk发消息,消息Id为10018
LPUSH msg:{xxx-ID} 10018
刘备说车发消息,消息Id为10086
LPUSH msg:{xxx-ID} 10086
xx查看最新消息
LRANGE msg:{xxx-ID} 0 4
三、set 类型 1、基本方法
sadd | 将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略 |
smembers | 取出该集合的所有值 |
sismember | 判断集合 |
scard | 返回该集合的元素个数 |
srem | 删除集合中的某个元素 |
spop | 随机从该集合中吐出一个或多个值 |
srandmember | 随机从该集合中取出n个值。不会从集合中删除 |
sinter | 返回两个集合的交集元素 |
sunion | 返回两个集合的并集元素 |
sdiff | 返回两个集合的差集元素 |
sinterstore destination key [key...] | 将交集结果存入新集合destination中 |
sunionstore destination key [key...] | 将并集结果存入新集合destination中 |
sdiffstore destination key [key...] | 将差集结果存入新集合destination中 |
更多
2、 应用场景(1) 微信抽奖小程序
- 点击参与抽奖加入集合 sadd key {userID}
- 查看参与抽奖所有用户 smembers key
- 抽取count名中奖者 srandmember key [count] 抽中不移除 / spop key [count] 抽中并移除
(2) 微信微博点赞,收藏,标签
- 点赞sadd like:{消息ID} {用户ID}
- 取消点赞 srem like:{消息ID} {用户ID}
- 检查用户是否点过赞 sismember like:{消息ID} {用户ID}
- 获取点赞的用户列表 smembers like:{消息ID}
- 获取点赞用户数 scard like:{消息ID}
(3) 集合 *** 作
sinter set1 set2 set3 -> {c}
sunion set1 set2 set3 -> {a, b, c, d, e}
sdiff set1 set2 set3 -> {a}
(4) 集合 *** 作实现微博微信关注模型
- eg. 诸葛老师关注的人:zhugeSet -> {guojia, xushu}
杨过老师关注的人: yangguoSet -> {zhuge, baiqi, guojia, xushu}
郭嘉老师关注的人: guojiaSet -> {zhuge, yangguo, baiqi, xushu, xunyu}
- 诸葛老师和杨过老师共同关注的人:sinter zhugeSet yangguoSet
- 诸葛老师关注的人也关注杨过老师:sismember guojiaSet yangguo
- 诸葛老师可能认识的人 sdiff yangguoSet zhuguSet
(5) 集合 *** 作实现电商商品筛选
sadd brand:huawei p40sadd brand:xiaomi mi-10
sadd brand:iphone iphone12
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:intel ram:8G -> {p40, mi-10}
四、hash类型 1、基本方法hset | 给 |
hget | 从 |
hmset | 批量设置hash的值 |
hexists | 查看哈希表key中,给定域field是否存在 |
hkeys | 列出该hash集合中的所有field |
hvals | 列出该hash集合中的所有value |
hincrby | 为哈希表key中的域field的值加上增量increment |
hsetnx | 将哈希表key中的域field的值设置为value,当且仅当域field不存在 |
hmget | 列出该hash集合对应field的value值 |
hdel | 删除hash表中field值 |
hlen | 返回hash表中field的数量 |
hgetall | 返回hash表中所有的键值 |
更多
2、 应用场景(1) 对象缓存
hmset user {userId}:name zhuge {userId}:balance 1888
hmset user 1:name zhuge 1:balance 1888
hmget user 1:name 1:balance
(2) 电商购物车
- eg. 以用户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
优点:
同类数据归类整合存储,方便数据管理
相比string *** 作消耗内存与cpu更小
相比string存储更节省空间
缺点:
过期功能不能使用在field上,只能用在key上
redis集群架构下不适合大规模使用
五、zset类型 1、基本方法zadd | 将一个或多个member元素及其score值加入到有序集key当中 |
zrange | 正序返回有序集key中,下标在 |
zrangebyscore key min max [withscores] [limit offset count] | 返回有序集key中,所有score值介于min和max之间(包括等于min或max)的成员。有序集成员按score值递增(从小到大)次序排列 |
zrevrangebyscore key max min [withscores] [limit offset count] | 同上,改为从大到小排列 |
zincrby | 为元素的score加上增量 |
zrem | 删除该集合下,指定值的元素 |
zcount | 统计该集合,分数区间内的元素个数 |
zrank | 返回该值在集合中的排名,从0开始 |
zscore | 返回有序集合key中元素member的分值 |
zrevrange | 倒序返回有序集key中,下标在 |
zunionstore destkey numkeys key [key...] | 并集运算 |
zinterstore destkey numkeys key [key...] | 交集运算 |
更多
2、应用场景(1) 实现排行榜
- 点击新闻 zincrby hotNews:20210819 1
- 展示当日排行前十 zrevrange hotNews:20210819 0 9 withscores
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)