一、Redis的数据结构
二、String 数据结构
2.1 字符串常用操作
//存入字符串键值对
SET key value
//批量存储字符串键值对
MSET key value [key value ...]
//存入一个不存在的字符串键值对
SETNX key value
//获取一个字符串键值
GET key
//批量获取字符串键值
MGET key [key ...]
//删除一个键
DEL key [key ...]
//设置一个键的过期时间(秒)
EXPIRE key seconds
原子加减
INCR key //将key中储存的数字值加1
DECR key //将key中储存的数字值减1
INCRBY key increment //将key所储存的值加上increment
DECRBY key decrement //将key所储存的值减去decrement
单值存储
SET key value
GET key
对象缓存
SET user:1 value(json格式数据)
MSET user:1:name zhuge user:1:balance 1888
MGET user:1:name user:1:balance
2.2 应用场景
分布式锁
SETNX product:10001 true //返回1代表获取锁成功
SETNX product:10001 true //返回0代表获取锁失败
。。。执行业务操作
DEL product:10001 //执行完业务释放锁
SET product:10001 true ex 10 nx //防止程序意外终止导致死锁
文章阅读量
INCR article:readcount:{文章id}
GET article:readcount:{文章id}
通过计数器方式实现某个文章的阅读数
存在的问题
注意:万级以上的QPS,会导致一瞬间CPU 100%
三、Hash 数据结构
3.1 Hash常用操作
存储一个哈希表key的键值
HSET key field value
如何哈希表中key的键值 不存在
,则执行set
HSETNX key field value
在一个哈希表key中存储 多个
键值对
HMSET key field value [field value ...]
获取哈希表key对应的field键值
HGET key field
批量获取哈希表key中多个field键值
HMGET key field [field ...]
删除哈希表key中的field键值
HDEL key field [field ...]
返回哈希表key中field的数量
HLEN key
返回哈希表key中所有的键值
HGETALL key
为哈希表key中field键的值加上 增量
increment
HINCRBY key field increment
对象缓存
HMSET user {userId}:name zhuge {userId}:balance 1888
HMSET user 1:name zhuge 1:balance 1888
HMGET user 1:name 1:balance
3.2 HASH应用场景
HSET key field value;
电商购物车
- 以用户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
四、List数据结构
4.1 List常用操作
将一个或多个值value插入到key列表的表头(最左边)
LPUSH key value [value ...]
将一个或多个值value插入到key列表的表尾(最右边)
RPUSH key value [value ...]
移除并返回key列表的头元素
LPOP key
移除并返回key列表的尾元素
RPOP key
返回列表key中指定区间内的元素,区间以偏移量start和stop指定
LRANGE key start stop
从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
BLPOP key [key ...] timeout
从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
BRPOP key [key ...] timeout
4.2 用List可以实现的数据结构
Stack(栈) = LPUSH + LPOP
Queue(队列)= LPUSH + RPOP
Blocking MQ(阻塞队列)= LPUSH + BRPOP
4.3 List 应用场景
微博消息和微信公号消息
数据量小场景
诸葛老师关注了MacTalk,备胎说车等大V
1)MacTalk发微博,消息ID为10018
LPUSH msg:{诸葛老师-ID} 10018
2)备胎说车发微博,消息ID为10086
LPUSH msg:{诸葛老师-ID} 10086
3)查看最新微博消息
LRANGE msg:{诸葛老师-ID} 0 4