重学Redis:Redis有几种数据类型?5种还是8种?

开课吧格桑2021-12-02 15:43

  redis有5种基本数据结构,它们是String(string)、列表(list)、hash(字典)、set(集合)和zset(有序集合),redis的所有数据结构都使用惟一的key字符串作为名称,接着,根据这个惟一的key值得到对应的值,不同的数据结构的差异就在于value的数据结构的差异

  Redis基本数据类型

  String

  字符串常用操作

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

  String应用场景

  单值缓存

SET key value   
GET key
SET user:1 value(json格式数据)
MSET user:1:name A user:1:age 18
MGET user:1:name user:1:age

  分布式锁

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}

  Web集群session共享

spring session + redis实现session共享

  分布式系统全局序列号

INCRBY orderId 1000    //redis批量生成序列号提升性能

  List

  List常用操作

LPUSH key value [value ...]   //将一个或多个值value插入到key列表的表头(最左边)
RPUSH key value [value ...]     //将一个或多个值value插入到key列表的表尾(最右边)
LPOP key      //移除并返回key列表的头元素
RPOP key      //移除并返回key列表的尾元素
LRANGE key start stop    //返回列表key中指定区间内的元素,区间以偏移量start和stop指定
BLPOP key [key ...] timeout  //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
BRPOP key [key ...] timeout   //从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞

重学Redis:Redis有几种数据类型?5种还是8种?

  List应用场景

  常用数据结构

  Stack(栈) = LPUSH + LPOP

  Queue(队列)= LPUSH + RPOP

  Blocking MQ(阻塞队列)= LPUSH + BRPOP

  微博消息和微信公众号消息

A关注了B,C
1)B发微博,消息ID为10001
LPUSH msg:{A-ID} 10001
2)C发微博,消息ID为10002
LPUSH msg:{A-ID} 10002
3)A查看最新微博消息
LRANGE msg:{A-ID} 0 4

  Hash

  常用操作

HSET key field value       //存储一个哈希表key的键值
HSETNX key field value     //存储一个不存在的哈希表key的键值
HMSET key field value [field value ...]   //在一个哈希表key中存储多个键值对
HGET key field         //获取哈希表key对应的field键值
HMGET key field [field ...]     //批量获取哈希表key中多个field键值
HDEL key field [field ...]     //删除哈希表key中的field键值
HLEN key        //返回哈希表key中field的数量
HGETALL key        //返回哈希表key中所有的键值
HINCRBY key field increment     //为哈希表key中field键的值加上增量increment

  Hash应用场景

  对象缓存

HMSET user {userId}:name A {userId}:age 18
HMSET user 1:name A 1:age 18
HMGET user 1:name 1:age

  电商购物车

//以用户id为key,商品id为field,商品数量为value
//添加商品
//cart代表购物车,1001代表用户id,cart:1001代表用户1001的购物车
//10088代表他的购物车有一件id为10088的商品,1代表购物车的商品数量为1
hset cart:1001 10088 1
//增加数量
hincrby cart:1001 10088 1
//商品总数
hlen cart:1001
//删除商品
hdel cart:1001 10088
//获取购物车所有商品
hgetall cart:1001

  Hash结构优缺点

  优点

  1)同类数据归类整合储存,方便数据管理

  2)相比string操作消耗内存与cpu更小

  3)相比string储存更节省空间

  缺点

  1)过期功能不能使用在field上,只能用在key上

  2)Redis集群架构下不适合大规模使用

  Set

  Set常用操作

SADD key member [member ...]      //往集合key中存入元素,元素存在则忽略,若key不存在则新建
SREM key member [member ...]      //从集合key中删除元素
SMEMBERS key          //获取集合key中所有元素
SCARD key          //获取集合key的元素个数
SISMEMBER key member      //判断member元素是否存在于集合key中
SRANDMEMBER key [count]      //从集合key中选出count个元素,元素不从key中删除
SPOP key [count]        //从集合key中选出count个元素,元素从key中删除

  Set运算操作

SINTER key [key ...]         //交集运算
SINTERSTORE destination key [key ..]    //将交集结果存入新集合destination中
SUNION key [key ..]         //并集运算
SUNIONSTORE destination key [key ...]    //将并集结果存入新集合destination中
SDIFF key [key ...]         //差集运算
SDIFFSTORE destination key [key ...]    //将差集结果存入新集合destination中

  Set应用场景

  微信抽奖小程序

1)点击参与抽奖加入集合
SADD key {userlD}
2)查看参与抽奖所有用户
SMEMBERS key    
3)抽取count名中奖者
SRANDMEMBER key [count] / SPOP key [count]

  微信微博点赞,收藏,标签

1) 点赞
SADD like:{消息ID} {用户ID}
2) 取消点赞
SREM like:{消息ID} {用户ID}
3) 检查用户是否点过赞
SISMEMBER like:{消息ID} {用户ID}
4) 获取点赞的用户列表
SMEMBERS like:{消息ID}
5) 获取点赞用户数
SCARD like:{消息ID}

  集合操作

SINTER set1 set2 set3  //{ c }
SUNION set1 set2 set3  //{ a,b,c,d,e }
SDIFF set1 set2 set3    //{ a }