redis核心数据结构以及他的应用场景

142 阅读4分钟

文章目录

redis核心数据结构

1.string字符串

1.1应用场景

单值缓存

  • key,value键值对,一个key对应一个value
  • SETt kv存值 GET k取值
    对象缓存
  • 第一种也是kv结构只是v是一个json串,和单值缓存一样的使用方法
  • 第二种是批量读取写入,例如 MSET user:1:name zhangsan user:1:age 18 MGET user:1:name user:1:age
    分布式锁
  • SETNX命令是指我写入一个key那么其他线程就不可以再次写入这个key,就可以保证只有一个线程能执行。
  • SETNX user:1 1执行该命令如果返回1就代表获取锁成功,如果返回0则代表获取锁失败
  • DEL user:1删除该key也就是释放锁
  • 防止程序错误导致死锁可以设置key的超时时间SET user:1 1 ex 10 nx其中nx参数表示是setnx命令、ex 10超时时间为10秒
    计数器
    INCR String这条命令执行会让计数器+1从0开始计数,可以做访问量
    session共享
    spring session + redis可以实现session共享

2.hash哈希

2.1应用场景

对象缓存
这种方式更像是java中的Map<String,Map<String,String>>
HMSET user 1:name zhangsan 1:age 18
HMGET user 1:name 1:age
购物车
以用户id为key 商品id为field 商品数量为value

  • 添加商品 HSET key field value
  • 增加商品数量 HINCRBY key field value
  • 商品总数 hlen key
  • 删除商品 hdel key field
  • 获取购物车中的全部商品 hgetall key

2.2优缺点

优点

  • 相比string节省内存和cpu资源节省存储空间
  • 同类的数据归类整合存储方便管理逻辑性更强
    缺点
  • 过期功能只能做用在key上,粒度比较大
  • 集群环境下不适合大规模使用,分片存储负载均衡不均衡

3.list数组列表

3.1应用场景

轻松实现栈、队列、阻塞队列
api支持从左或从右拿元素还可以启动监听
新浪微博消息流
LPUSH 消息列表id 消息内容//添加
LPUSH 消息列表id 消息内容2
LRANGE 消息列表id 0 4 //查询从左查询分页的0-4条数据

4.set集合

4.1应用场景

抽奖程序
SADD 抽奖活动id 用户id1//添加
SADD 抽奖活动id 用户id2
SADD 抽奖活动id 用户id3
SMEMBERS 抽奖活动id //查看用户集合
SRNDMEBER 抽奖活动id 抽奖个数 //直接随机抽取固定个数的用户
SPOP 抽奖活动id 抽奖个数 //抽出固定个数的用户并将用户从集合中删除
点赞、收藏
SADD 文章id 用户id//点赞或收藏
SREM 文章id 用户id//取消
SISMEMBER 文章id 用户id// 检查是否已经点赞或收藏
SMEMBERS 文章id//获取点赞或收藏列表
SCARD 文章id//获取点赞用户总数
新浪微博关注模型

  • 共同关注的人
    SINTER 集合key1 集合key2 集合key3 //交集,三个集合中相同的数据集合
  • 分析这个群体可能喜欢的人
    SUNION 集合key1 集合key2 集合key3 //并集,三个集合合并去重
  • 我可能认识的人
    SDIFF 集合key1 集合key2 集合key3 //差集运算第一个集合之中后边没有的
  • 我关注的人也关注了它
    SISMEMBER 文章id 用户id// 检查是否已经关注

5.zset有序集合

新浪微博热搜
ZINCRBY 热搜集合key 1 文章id //点击新闻计数+1
ZREVRANGE 热搜集合key 0 9//排行版前十
ZREVRANGE 热搜集合key 0 9 WITHSCORES//排行版前十和阅读量
ZUNIONSTORE 集合key 个数 集合名称//并集计算并存储,新集合可以筛选相同的热搜存储指定的热搜集合并将阅读量进行相加
ZINTERSTORE 集合key 个数 集合名称//交集计算并存储,新集合可以合并存储指定的热搜集合并将阅读量进行相加

参考文章

java Jedis API

tool.oschina.net/uploads/api…