string字符串类型
string适合做单值缓存,对象缓存,分布式锁等
命令名称 | 命令格式 | 命令描述 |
---|---|---|
set | set key value | 赋值 |
get | get key | 取值 |
getset | getset key value | 取值并赋值 |
setnx | setnx key value | 当value不存在时采用赋值 set key value NX PX 3000 原子操作,px 设置毫秒数 |
append | append key value | 向尾部追加值 |
strlen | strlen key | 获取字符串长度 |
incr | incr key | 递增数字 |
incrby | incrby key increment | 增加指定的整数 |
decr | decr key | 递减数字 |
decrby | decrby key decrement | 减少指定的整数 |
mset | mset key value key value | 批量赋值 |
mget | mget key key | 批量取值 |
接下来,我们执行以下Redis的这些命令
set命令:
127.0.0.1:6379> set name liuxixi
OK
get命令:
127.0.0.1:6379> set name liuxixi
OK
127.0.0.1:6379> get name
"liuxixi"
getset命令:
127.0.0.1:6379> getset name lixixi
"liuxixi"
127.0.0.1:6379> get name
"lixixi"
setnx命令:
127.0.0.1:6379> setnx age 12
(integer) 1 //第一次返回1代表设置成功
127.0.0.1:6379> setnx age 13
(integer) 0 //第二次返回0代表没有设置成功
append命令:
127.0.0.1:6379> append name xi
(integer) 8 //返回的8是value的长度
127.0.0.1:6379> get name
"lixixixi"
复制代码
strlen命令:
127.0.0.1:6379> strlen name
(integer) 8
incr命令:
127.0.0.1:6379> incr age //可以用来做点赞功能
(integer) 14
127.0.0.1:6379> get age
"14"
incrby命令:
127.0.0.1:6379> incrby age 3
(integer) 17
127.0.0.1:6379> get age
"17"
复制代码
decr命令:
127.0.0.1:6379> decr age
(integer) 16
127.0.0.1:6379> get age
"16"
decrby命令:
127.0.0.1:6379> decrby age 3
(integer) 13
127.0.0.1:6379> get age
"13"码
hash散列类型
命令名称 | 命令格式 | 命令描述 |
---|---|---|
hset | hset key field value | 赋值,不区别新增或修改 |
hmset | hmset field1 value1 field2 value2 | 批量赋值 |
hsetnx | hsetnx key field value | 赋值,如果filed存在则不操作 |
hexists | hexists key filed | 查看某个field是否存在 |
hget | hget key field | 获取一个字段值 |
hmget | hmget key field1 field2 … | 获取多个字段值 |
hgetall | hgetall key | |
hdel | hdel key field1 field2.. | 删除指定字段 |
hincrby | hincrby key field increment | 指定字段自增increment |
hlen | hlen key | 获得字段数量 |
应用场景:可以做电商购物车
电商购物车:
- 以用户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结构的优缺点
优点
list列表类型
list列表类型可以存储有序,可重复的元素
获取头部或尾部附近的记录是极快的
list的元素个数最多为2^31-1个(20亿)
常见操作命令如下:
命令名称 | 命令格式 | 命令描述 |
---|---|---|
lpush | lpush key v1 v2 v3 … | 从左侧插入列表 |
lpop | lpop key | 从列表左侧取出 |
rpush | rpush key v1 v2 v3 … | 从右侧插入列表 |
rpop | rpop key | 从列表右侧取出 |
lpushx | lpushx key value | 将值插入到列表头部 |
rpushx | rpushx key value | 将值插入到列表尾部 |
blpop | blpop key timeout | 从列表左侧取出,当列表为空时阻塞,可以设置最大阻塞时 间,单位为秒 |
brpop | blpop key timeout | 从列表右侧取出,当列表为空时阻塞,可以设置最大阻塞时 间,单位为秒 |
llen | llen key | 获得列表中元素个数 |
lindex | lindex key index | 获得列表中下标为index的元素 index从0开始 |
lrange | lrange key start end | 返回列表中指定区间的元素,区间通过start和end指定 |
lrem | lrem key count value | 删除列表中与value相等的元素 当count>0时, lrem会从列表左边开始删除;当count<0时, lrem会从列表后边开始删除;当count=0时, lrem删除所有值 为value的元素 |
lset | lset key index value | 将列表index位置的元素设置成value的值 |
ltrim | ltrim key start end | 对列表进行修剪,只保留start到end区间 |
rpoplpush | rpoplpush key1 key2 | 从key1列表右侧弹出并插入到key2列表左侧 |
brpoplpush | brpoplpush key1 key2 | 从key1列表右侧弹出并插入到key2列表左侧,会阻塞 |
linsert | linsert key BEFORE/AFTER pivot value | 将value插入到列表,且位于值pivot之前或之后 |
常用数据结构
Stack(栈)=LPUSH+LPOP
Queue(队列)=LPUSH+RPOP
BlockingMQ(阻塞队列)=LPUSH+BRPOP
set集合类型
set:无序,唯一元素
集合中最大的成员数为2^32-1(40亿)
常见操作命令如下表:
命令名称 | 命令格式 | 命令描述 |
---|---|---|
sadd | sadd key mem1 mem2 …. | 为集合添加新成员 |
srem | srem key mem1 mem2 …. | 删除集合中指定成员 |
smembers | smembers key | 获得集合中所有元素 |
spop | spop key | 返回集合中一个随机元素,并将该元素删除 |
srandmember | srandmember key | 返回集合中一个随机元素,不会删除该元素 |
scard | scard key | 获得集合中元素的数量 |
sismember | sismember key member | 判断元素是否在集合内 |
sinter | sinter key1 key2 key3 | 求多集合的交集 |
sdiff | sdiff key1 key2 key3 | 求多集合的差集 |
sunion | sunion key1 key2 key3 | 求多集合的并集 |
应用场景:
适用于不能重复的且不需要顺序的数据结构
比如:关注的用户,还可以通过spop进行随即抽奖
微信抽奖小程序:
- 点击参与抽奖加入集合
SADD key {userId} - 查看参与抽奖所有用户
SMEMBERS key - 抽取count名中奖者
SRANDMEMBER key [count] / SPOP key [count]
微信微博点赞,收藏,标签
- 点赞
SADD like:{消息ID} {用户ID} - 取消点赞
SREM like:{消息ID} {用户ID} - 检查用户是否点过赞
SISMEMBMR like:{消息ID} {用户ID} - 获取点赞的用户列表
SMEMBERS like:{消息ID} - 获取点赞用户数
SCARD like:{消息ID}
集合操作实现微博微信关注模型
- 你关注的人
xx -> {x , xxx} - 我关注的人
Ll -> {xx , xxx} - 我和你关注的人
SINTER xx LI -> {xxx} - 我关注的人也关注他:
SISMEMBER xx LI - 我可能认识的人:
SDIFF xx LI -> {xx}
zset有序集合类型
元素本身是无序不重复的,每一个元素关联一个分数(score)可按分数排序,分数可重复
常见操作命令如下表:
命令名称 | 命令格式 | 命令描述 |
---|---|---|
zadd | zadd key score1 member1 score2 member2 … | 为有序集合添加新成员 |
zrem | zrem key mem1 mem2 …. | 删除有序集合中指定成员 |
zcard | zcard key | 获得有序集合中的元素数量 |
zcount | zcount key min max | 返回集合中score值在[min,max]区间 的元素数量 |
zincrby | zincrby key increment member | 在集合的member分值上加increment |
zscore | zscore key member | 获得集合中member的分值 |
zrank | zrank key member | 获得集合中member的排名(按分值从 小到大) |
zrevrank | zrevrank key member | 获得集合中member的排名(按分值从大到小) |
zrange | zrange key start end | 获得集合中指定区间成员,按分数递增 排序 |
zrevrange | zrevrange key start end | 获得集合中指定区间成员,按分数递减 排序 |
应用场景:
由于可以按照分值排序,所以适用于各种排行榜。比如:点赞排行榜,销量排行榜,关注排行榜等。
举例:
127.0.0.1:6379> zadd hit:1 100 item1 20 item2 45 item3
(integer) 3
127.0.0.1:6379> zcard hit:1
(integer) 3
127.0.0.1:6379> zscore hit:1 item3
"45"
127.0.0.1:6379> zrevrange hit:1 0 -1
1) "item1"
2) "item3"
3) "item2"
127.0.0.1:6379>
复制代码
zset集合操作实现排行榜
- 点击新闻
ZINCRBY hotNews:20190819 1 守护香港 - 展示当日排行前十
ZREVRANGE hotNews:20190819 0 9 WITHSCORES - 七日搜索榜单计算
ZUNIONSTORE hotNews:20190813-20190819 7
hotNews:20190813 hotNews:20190814… hotNews:20190819 - 展示七日排行前十
ZREVRANGE hotNews:20190813-201908109 0 9 WITHSCORES