• redis笔记-基础数据结构


    String

    i am a string
    • 单值缓存

    set key value

    get key

    mset key value key value key value  批量插入

    mget key,key   批量获取

    exist key

    del key  

    expire key second 设置超时时间

    setex   key second value 相当于set + expire 

    setnx key value  如果key不存在,就设置;如果存在就不设置

    • 对象缓存

    1) set user:1 value(json 数据格式)

    2)mset user:1:name zhangsan user:1:grade 100

      mget user:1:name user:1:grade 

    id name grade
    1 zhangsan 100
    • 分布式锁

    setnx product:1001 value //返回1表示取锁成功,返回0表示取锁失败

    //执行业务操作

    del product:1001  //释放锁

    set prduct:1001 true ex 10 nx //防止程序意外终止导致死锁

    • 计数器 公众号文章阅读数

    incr article:readcount:文章id

    get article:readcount:文章id

    原子计数器:incr key  。redis是单线程,可以使用原子计数器实现分布式锁:

    client1 incr lock   返回1

    client2 incr lock   返回2

    client3 incr lock   返回3

    谁获取到的结果为1代表谁拿到了锁,可以做业务操作,结束后再decr lock,把数据减1,这样其他的客户端可以再去获取了。

    • Web集群session共享

    spring session + redis  实现session共享

    • 分布式系统全局序列号

    incrby orderid 1000 //redis批量生成序列号提高性能

    hash 

    field1 value1
    field2 value2

     相当于java的hashMap,数组+链表二维结构,第一维hash的数组位置发生碰撞时,将碰撞的元素使用链表串接起来。但一般redis会进行rehash.

    • 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

    • 对象缓存:

    hmset user {userId}:name zhangsan  {userId}:grade 100

    hmset user:1:name zhangsan user:1:grade 100  

    hmget user:1:name user:1:grade 

    • 电商购物车

    以用户Id为key,商品id为field,商品数量为value

    添加商品-> hset cart:1001 1008 1 

    增加数量 -> hincrby cart:1001 1008 1

    商品总数-> hlen cart:1001

    删除商品 -> hdel cart:1001 1008

    获取购物车的所有商品 -> hgetall cart:1001

    • 优点

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

    2)相比String 操消耗内存比cpu更小

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

    • 缺点

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

    2)redis集群架构下不适合大规模使用。原因:redis是根据key进行数据分片的,hash不适合于做大规模的应用,可能会造成分片不均匀。

    List

    相当于java中的linkedList,是链表而不是数组。插入和删除复杂度为o(1),索引定位为o(n)。

    常用于做异步队列使用,将需要延后处理的数据序列化成字符串存入redis列表中,另一个线程从列表中轮询数据进行处理。

    • 常用操作
    a b c
    lpush key value [value ...]   //将一个或多个值 value 插入到列表 key 的表头
    rpush key value [value ...]
    lpop key
    rpop key
    lrange key start stop
    blpop key [key ...] timeout
    brpop key [key ...] timeout
     
    • 常用数据结构
    Stack(栈) = lpush + lpop -FILO
    Queue(队列) = lpush + rpop
    Blocking MQ(阻塞队列) = lpush + brpop
    • 应用场景:
    微博和微信公众号的消息流:适合于粉丝量小的情况。redis单机qps将近10万
    zhangsan关注importJava、36kr等大v
    1)importJava发微博,消息id为1001
    lpush msg:{zhangsan:id} 1001
    2) 36kr发微博,消息id为1002
    lpush msg:{zhangsan:id} 1002
    3)查看最新微博消息
    lrange msg:{zhangsan:id} 0 5

    Set

    相当于java中的hashSet,键值对是无序的唯一的。

    常用操作

    sadd key value

    smembers key  #顺序与插入可能不一致,无序的

    sismember key  value  查询某个value是否存在

    scard key  获取长度,count()

    spop key   弹出元素(先进先出)

    运算操作

    sinter key [key ...]   //交集运算
    sinterstore destination key [key ...]   //将交集结果存入新集合destination
    sunion key [key ...]   //并集运算
    sunionstore destination key [key ...] 
    sdiff key [key ...]   //差集   别的集合中有而该集合(最后一个key)中没有的元素

    应用

    微信抽奖小程序

    1)点击参与抽奖加入集合
    sadd key {userid}
    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}
     

    集合操作实现微博微信关注模型

    1)zhangsan关注的人:
    zhangsanSet ->{lisi,wangwu,zhaoliu}
    2)lisi关注的人:
    lisiSet ->{zhaoliu,qianqi,sunba}
    3)zhaoliu关注的人:
    zhaoliuSet->{wangwu,qianqi,sunba,zhoujiu}
    4) zhangsan 和 lisi 共同关注的人
    sinter zhangsanSet lisiSet  --> {zhaoliu}
    5)zhangsan 关注的人也关注了他(lisi)
    sismember zhaoliuSet lisi
    sismember qianqiSet lisi
    6)zhangsan 可能认识的人
    sdiff lisiSet  zhaoliuSet zhangsanSet  -->{qianqi,sunba,zhoujiu}
     

    zset

    类似于java的sortedSet和hashMap的结合体,set保证了内部value的唯一性,又可以为value赋予一个score,表示权重。

    • 常用操作

    zadd  key score value

    zrange key 0 -1  按score升序列出

    zrevrange key 0 -1 按score降序列出

    zcard key 相当于count()

    zscore key value 获取指定value的score

    zrank key  value 获取value的排名,从0开始

    zrangebyscore key 0 n   根据分值区间0-n遍历zset

    zrangebyscore key -inf n withscores   根据分值区间(-无穷,n] 遍历zset,同时返回分值

    zrem key value 删除value

    • 集合操作
    ZUNIONSTORE destkey numkeys key  [key ...]  //并集计算
    ZINTERSTORE destkey numkeys key  [key ...]  //交集计算
    应用
    • 实现微博排行榜
    1)点击新闻
    zincrby hotnews:20200221 1 武汉加油
    2)展示当日排行前十
    zrevrank hotnews:20200221 0 9 withscores
    3) 七日搜索榜单计算
    ZUNIONSTORE hotnews:20200221-20200227 7
    hotnews:20200222 hotnews:20200223 ... hotnews:20200227
    4)展示七日排行前十
    zrevrange hotnews:20200221-20200227 0 9 withscores
     

     其他高级命令

     keys 

    全量遍历键。列出所有满足正则表达式和键,不建议使用

    keys 正则表达式

    scan

    渐进式遍历键。类似于分页查找,redis存储的是hash表,乱序,返回的游标不是有序增长的,最终拿到的游标是0表示已遍历完整个数据集。

    scan cursor游标 match key正则表达式 count limitint

    info 

    查看服务器运行情况

  • 相关阅读:
    EMV/PBOC解析(三) TLV格式解析(C#)
    写自己的WPF样式
    EMV/PBOC 解析(二) 卡片数据读取
    FLEX 图片拷贝
    重学浏览器(2)-进程间的交互
    重学浏览器(1)-多进程多线程的浏览器
    实现财务自由-《富爸爸穷爸爸》读书语句摘抄
    mini-css-extract-plugin简介
    egg.js路由的优雅改造
    node中异步IO的理解
  • 原文地址:https://www.cnblogs.com/hongyedeboke/p/12663726.html
Copyright © 2020-2023  润新知