一,5种基础数据结构
1,String(字符串)
介绍
像java中HashMap一样使用,设置key - value,通过key获取value。
常用用命令
命令 | 介绍 |
---|---|
set key value | 设置指定key值 |
setnx key value | key不存在时才成功设置key值 |
mset key1 value1 key2 vaule2 | 批量设置key值 |
get key | 获取key值 |
mget key1 key2 | 批量获取key值 |
incr key | key值增加1 |
incrby key increment | key值增加 increment |
decr key | key值减1 |
decrby key increment | key值减 increment |
del key | 删除key |
expire key seconds | 为key设置过期时间 |
exists key | 判断key是否存在 |
基本操作
// 测试 set setnx mset
127.0.0.1:6379> set zs 10
OK
127.0.0.1:6379> get zs
"10"
127.0.0.1:6379> mset li 20 ww 30
OK
127.0.0.1:6379> mget li ww
1) "20"
2) "30"
127.0.0.1:6379> setnx zs 10
(integer) 0
127.0.0.1:6379> setnx zl 10
(integer) 1
// 测试 incr decr incrby decrby
127.0.0.1:6379> get zs
"10"
127.0.0.1:6379> incr zs
(integer) 11
127.0.0.1:6379> decr zs
(integer) 10
127.0.0.1:6379> incrby zs 10
(integer) 20
127.0.0.1:6379> decrby zs 20
(integer) 0
// 测试 del expire
127.0.0.1:6379> get ls
"20"
127.0.0.1:6379> del ls
(integer) 1
127.0.0.1:6379> get ls
(nil)
127.0.0.1:6379> set ls 10
OK
127.0.0.1:6379> expire ls 30
(integer) 1
127.0.0.1:6379> get ls
"10"
127.0.0.1:6379> get ls // 30s后
(nil)
应用场景
缓存:如缓存session,token,查询信息等。
计数器:如文章阅读量, incr bookId:id
分布式锁: 可以通过 setnx key 的返回结果,判断是否获得锁成功。
2,Hash(哈希)
介绍
Hash相对于String类型,但是value也是以key-value形式存储。即 key field value。
可以理解为通过key找到指定的hashmap,在通过field找到hashmap中的key。
常用用命令
命令 | 介绍 |
---|---|
hset key field value | 设置指定哈希表中指定字段的值 |
hsetnx key field value | 只有指定字段不存在时设置指定字段的值 |
hmset key field1 value1 field2 value2 | 同时将一个或多个 field-value (域-值)对设置到指定哈希表中 |
hget key field | 获取指定哈希表中指定字段的值 |
hmget key field1 field2.. | 获取指定哈希表中一个或者多个指定字段的值 |
hgetall key | 获取指h定哈希表中所有的键值对 |
hexists key field | 查看指定哈希表中指定的字段是否存在 |
hdel key field | 删除一个或多个哈希表字段 |
hlen key | 获取指定哈希表中字段的数量 |
hincrby key field increment | 指定哈希表中指定字段加 increment |
基本操作
// 测试 hset hsetnx hmset hget hmget
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> hset user name zs
(integer) 1
127.0.0.1:6379> hsetnx user name zs
(integer) 0
127.0.0.1:6379> hmset user age 3 address shanghai
OK
127.0.0.1:6379> hget user name
"zs"
127.0.0.1:6379> hmget user name age address
1) "zs"
2) "3"
3) "shanghai"
// 测试 hgetall
127.0.0.1:6379> hgetall user
1) "name"
2) "zs"
3) "age"
4) "3"
5) "address"
6) "shanghai"
// 测试 hexists hlen hincrby 注意:hincr 这个命令是没有的
127.0.0.1:6379> hexists user name
(integer) 1
127.0.0.1:6379> hlen user
(integer) 3
127.0.0.1:6379> hincrby user age 10
(integer) 13
应用场景
对象数据存储:用户信息,商品信息,购物车信息
3,List(队列)
介绍
List 就是一个双端队列,队列两边都可以进行放和取。
常用用命令
命令 | 介绍 |
---|---|
lpush key value1 value2 | 在指定列表的尾部(左边)添加一个或多个元素 |
rpush key value1 value2 | 在指定列表的尾部(右边)添加一个或多个元素 |
lset key index value | 将指定列表索引 index 位置的值设置为 value |
lpop key | 移除并获取指定列表的第一个元素(最左边) |
rpop key | 移除并获取指定列表的第一个元素(最右边) |
llen key | 获取列表元素数量 |
lrange key start end | 获取列表 start 和 end 之间 的元素 |
blpop key timeout | 从key列表左边弹出一个元素,若列表中没有元素, 阻塞等待timeout秒,如果timeout=0,一直阻塞等待 |
基础操作
// 测试 lpush rpush lrange
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> lpush user zs li ww
(integer) 3
127.0.0.1:6379> lrange user 0 4
1) "ww"
2) "li"
3) "zs"
127.0.0.1:6379> rpush user zl
(integer) 4
127.0.0.1:6379> lrange user 0 4
1) "ww"
2) "li"
3) "zs"
4) "zl"
// 测试 lpop rpop
127.0.0.1:6379> lpop user
"ww"
127.0.0.1:6379> rpop user
"zl"
应用场景
消息流展示:如最新消息,最新动态。
例如:发布消息就往队列放数据,Lpush,而拉消息就从同一侧取数据,LPop,这样拉出来的就是最新消息列表。
消息队列:只能做简单的消息队列,有很多缺陷。
例如发布订阅,我们订阅了一个公众号或微博,有两种实现方式,一种是发布者有消息推送就放在推送队列中,而所有订阅者记住这个队列,每次从里面取。另外一种是,发布者记住每个订阅者的队列,每次发消息都将消息放入所有队列中,订阅者可以直接从里面取。这两种方式,可以根据不同场景去使用。
4,Set(集合)
介绍
类型java中HashSet集合,将所有数据都放到里面。
常用用命令
命令 | 介绍 |
---|---|
sadd key value | 向指定集合添加一个或多个元素 |
srem key value | 删除指定元素 |
smembers key | 查询集合所有元素 |
sismember key value | 判断所有元素是否存在 |
scard key | 集合元素数量 |
srandmember key count | 集合中随机抽取count个元素,且元素还在集合 |
spop key count | 集合中随机抽取count个元素,且集合移除选中元素 |
sinter key1 key2 | 交集运算 |
sinterstore key key1 key2 | 交集运算后放到key集合中 |
sunion key1 key2 | 并集运算 |
sunionstore key key1 key2 | 并集运算后放到key集合中 |
sdiff key1 key2 | 差集运算 |
sdiffstore key key1 key2 | 差集运算后放到key集合中 |
基础操作
// 测试 sadd smembers srem scrad
keys *
(empty list or set)
127.0.0.1:6379> sadd list1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> smembers list1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> srem list1 1 2
(integer) 2
127.0.0.1:6379> smembers list1
1) "3"
2) "4"
3) "5"
127.0.0.1:6379> sismember list1 4
(integer) 1
127.0.0.1:6379> scard list1
(integer) 3
// 测试 srandmember
127.0.0.1:6379> srandmember list1 2
1) "4"
2) "3"
127.0.0.1:6379> srandmember list1 2
1) "3"
2) "5"
127.0.0.1:6379> spop list1 1
1) "5"
127.0.0.1:6379> scard list1
(integer) 2
127.0.0.1:6379> smembers list1
1) "3"
2) "4"
应用场景
存放的数据不能重复的场景
如文章点赞,动态点赞
(1)点赞
sadd like:{文章id} {用户id}
(2)取消点赞
srem like:{文章id} {用户id}
(3)点赞总数
scard like:{文章id}
(4)用户是否点赞
sismember like:{文章id} {用户id}
(5)点赞用户列表
smembers like:{文章id}
集合交,并,差使用的场景
如关注的人,共同好友等。
(1)共同好友
你的好友:sadd zs {uId1} {uId2} ...
你朋友的好友:sadd ls {uId1} {uId2} ...
共同好友:两个集合做交集 sinter zs ls
(2)关注的人
所有关注 JavaGuide 的用户: sadd jg {uId1} {uId2} ...
你的所有朋友:sadd zs {uId1} {uId2} ...
多少个朋友关注:即两个集合做交集 sinter jg zs
随机抽取的场景
(1)将所有参与抽奖的用户都放入到集合中
SADD key {userlD}
(2)随机抽取
SRANDMEMBER key [count] 或者 SPOP key [count]
5,ZSet(有序集合)
介绍
类似set,但是多了一个score字段,是得 zset 集合是有序的。
常用用命令
命令 | 介绍 |
---|---|
zadd key score member | 往有序集合key中加入带分值元素 |
zrem key member | 从有序集合key中删除元素 |
zscore key member | 返回有序集合key中元素member的分值 |
zincrby key increment member | 为有序集合key中元素member的分值加上increment |
zcrad key | 返回有序集合key中元素个数 |
zrange key start stop | 正序获取有序集合key从start下标到stop下标的元素 |
zreverange key start stop | 倒序获取有序集合key从start下标到stop下标的元素 |
zrevrank key member | 获取指定有序集合中指定元素的排名(score 从大到小排序) |
zinterstore destination numkeys key1 key2 | 将给定所有有序集合的交集存储在 destination 中,对相同元素 对应的 score 值进行 SUM 聚合操作,numkeys 为集 合数量 |
zunionstore destination numkeys key1 key2 | 求并集,其它和 zinterstore类似 |
zdiffstore destination numkeys key1 key2 | 求差集,其它和 zinterstore类似 |
基本操作
// 测试 zadd zrange zrevrange
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> zadd student 10 zs 20 li 15 ww 60 zl
(integer) 4
127.0.0.1:6379> zrange sutdent 0 10
(empty list or set)
127.0.0.1:6379> zrange student 0 10
1) "zs"
2) "ww"
3) "li"
4) "zl"
127.0.0.1:6379> zrevrange student 0 10
1) "zl"
2) "li"
3) "ww"
4) "zs"
// 测试 zrem zscore zcard
127.0.0.1:6379> zrem student zs
(integer) 1
127.0.0.1:6379> zscore student ww
"15"
127.0.0.1:6379> zcard student
(integer) 3
127.0.0.1:6379>
// 测试交集
127.0.0.1:6379> zrange stu1 0 10
1) "zs"
2) "li"
3) "zl"
127.0.0.1:6379> zrange stu2 0 10
1) "ww"
2) "zl"
127.0.0.1:6379> zinterstore st 2 stu1 stu2
(integer) 1
127.0.0.1:6379> zrange st 0 10
1) "zl"
127.0.0.1:6379> zscore st zl
"60"
应用场景
微博热搜排行榜
(1)点击新闻
zincrby hotNews:20190819 1 守护香港
(2)当日排行前十
zrevrange hotNews:20190819 0 9 withscores
(3)展示7日排行前十
统计7日榜单
zunionstore hotNews:20190813-20190819 7 hotNews:20180813 ......
展示7日排行前十
zrevrange hotNews:20190813-20190819 0 9 withscores