目录
概览
Redis 数据库支持五种数据类型。
- 字符串(string)
- 哈希(hash)
- 列表(list)
- 集合(set)
- 有序集合(sorted set)zset
结构类型 | 结构存储的值 | 结构的读写能力 |
STRING | 可以是字符串、整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行操作;对整数和浮点数进行自增(increment)或者自减(decrement)操作 |
LIST | 一个链表,链表上的每个节点都包含了一个字符串 | 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值查找或者移除元素 |
SET | 包含字符串的无序收集器(unordered collection),并且被包含的每个字符串都是独一无二、各不相同的 | 添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素 |
HASH | 包含键值对的无序散列表 | 添加、获取、移除单个键值对;获取所有键值对 |
ZSET(有序集合) | 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 | 添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素 |
一、string类型
1、基本方法
set <key> <value> | 添加键值对 |
get <key> | 查询对应键值 |
append <key> <value> | 将给定的<value>添加到原值的末尾 |
strlen <key> | 获得值的长度 |
setnx <key> <value> | 只有在key不存在时设置key的值 |
incr <key> | 将key中储存的数字值增1;只能对数字值操作,如果为空,新增值为1 |
decr <key> | 将key中储存的数字值减1;只能对数字值操作,如果为空,新增值为-1 |
incrby / decrby <key> <步长> | 将key中存储的数字值增减。自定义步长 |
mset <key1> <value1> <key2> <value2> ... | 同时设置一个或多个key-value对 |
mget <key1> <key2> <key3> ... | 同时获取一个或多个value |
msetnx <key1> <value1> <key2> <value2> ... | 同时设置一个或多个key-value对。当且仅当所有给定的key都不存在 |
getrange <key> <起始位置> <结束位置> | 获得值的范围,类似java中的substring |
setrange <key> <起始位置> <value> | 用<value>覆写<key>所存储的字符串值, 从<起始位置>开始 |
setex <key> <过期时间> <value> | 设置键值的同时,设置过期时间,单位秒 |
getset <key> <value> | 以新换旧,设置了新值同时获得旧值 |
del <key> [key.....] | 删除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 <key> <value1> <value2> ... | 从左边/右边插入一个或多个值 |
lpop/rpop <key> | 从左边/右边吐出一个值。值在键在,值亡键亡 |
rpoplpush <key1> <key2> 从<key1> | 列表右边吐出一个值,插到<key2>列表左边 |
lrange <key> <start> <stop> | 按照索引下标获得元素(从左到右) |
lindex <key> <index> | 按照索引下标获得元素(从左到右) |
llen <key> | 获得列表长度 |
linsert <key> before <value> <newvalue> | 在<value>的前面插入<newvalue> |
lrem <key> <n> <value> | 从左边删除n个value(从左到右) |
blpop/brpop <key> [key...] timeout | 从key列表左边/右边弹出一个元素,若列表中没有元素,阻塞等待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 <key> <value1> <value2> ... | 将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略 |
smembers <key> | 取出该集合的所有值 |
sismember <key> <value> | 判断集合<key>是否为含有该<value>值,有返回1,没有返回0 |
scard <key> | 返回该集合的元素个数 |
srem <key> <value1> <value2> | 删除集合中的某个元素 |
spop <key> <n> | 随机从该集合中吐出一个或多个值 |
srandmember <key> <n> | 随机从该集合中取出n个值。不会从集合中删除 |
sinter <key1> <key2> | 返回两个集合的交集元素 |
sunion <key1> <key2> | 返回两个集合的并集元素 |
sdiff <key1> <key2> | 返回两个集合的差集元素 |
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 <key> <field> <value> | 给<key>集合中的<field>键赋值<value> |
hget <key> <field> | 从<key>集合<field>取出value |
hmset <key> <field1> <value1> <field2> <value2> ... | 批量设置hash的值 |
hexists <key> <field> | 查看哈希表key中,给定域field是否存在 |
hkeys <key> | 列出该hash集合中的所有field |
hvals <key> | 列出该hash集合中的所有value |
hincrby <key> <field> <increment> | 为哈希表key中的域field的值加上增量increment |
hsetnx <key> <field> <value> | 将哈希表key中的域field的值设置为value,当且仅当域field不存在 |
hmget <key> <field1> <field2>... | 列出该hash集合对应field的value值 |
hdel <key> <field1> <field2>... | 删除hash表中field值 |
hlen <key> | 返回hash表中field的数量 |
hgetall <key> | 返回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
3、 优缺点
优点:
同类数据归类整合存储,方便数据管理
相比string操作消耗内存与cpu更小
相比string存储更节省空间
缺点:
过期功能不能使用在field上,只能用在key上
redis集群架构下不适合大规模使用
五、zset类型
1、基本方法
zadd <key> <score1> <member> <score2> <member> ... | 将一个或多个member元素及其score值加入到有序集key当中 |
zrange <key> <start> <stop> [WITHSCORES] | 正序返回有序集key中,下标在<start> <stop>之间的元素。带WITHSCORES,可以让分数一起和值返回到结果集 |
zrangebyscore key min max [withscores] [limit offset count] | 返回有序集key中,所有score值介于min和max之间(包括等于min或max)的成员。有序集成员按score值递增(从小到大)次序排列 |
zrevrangebyscore key max min [withscores] [limit offset count] | 同上,改为从大到小排列 |
zincrby <key> <increment> <member> | 为元素的score加上增量 |
zrem <key> <member> | 删除该集合下,指定值的元素 |
zcount <key> <min> <max> | 统计该集合,分数区间内的元素个数 |
zrank <key> <member> | 返回该值在集合中的排名,从0开始 |
zscore <key> <member> | 返回有序集合key中元素member的分值 |
zrevrange <key> <start> <stop> [WITHSCORES] | 倒序返回有序集key中,下标在<start> <stop>之间的元素。带WITHSCORES,可以让分数一起和值返回到结果集 |
zunionstore destkey numkeys key [key...] | 并集运算 |
zinterstore destkey numkeys key [key...] | 交集运算 |
2、应用场景
(1) 实现排行榜
- 点击新闻 zincrby hotNews:20210819 1
- 展示当日排行前十 zrevrange hotNews:20210819 0 9 withscores