zoukankan      html  css  js  c++  java
  • Redis常用命令和数据结构的使用场景

    Redis的通用命令

    keys *	                遍历所有的key	O(n)
    keys [pattern]	        遍历符合条件的key。例如keys he*,将匹配以he开头的键;keys he[h-l]*将匹配以he开头并且第三个字母在h-lq区间的键;keys ph前两位是ph的key。	 
    dbsize	                计算key的总数	O(1)
    exists key	        key是否存在	O(1)
    del key	                删除对应key-value	        O(1)
    expire key seconds	key在指定秒数后过期。	        O(1)
    ttl key  	        查看剩余过期时间	                O(1)
    type key	        返回key的类型	                O(1)
    
    注意:keys 命令不建议在生产环境使用,因为它是o(n)命令,生产环境通常来说键值对很多,因为Redis的单线程特性可能会阻塞其他命令。
    热备从节点:从节点可以重复复制主节点的数据。一般来说从节点不在生产环境使用,所有可以使用些重命令。2、scan命令
    

    字符串

    key都是字符串,value可以是五种数据类型。本质上value都是二进制字符串,最大大小512MB,但因为有其他开销通常更低。
    
    使用场景:缓存、计数器、分布式锁
    
    get key	           获取对应键的值	O(1)
    set key value	   设置对应键的值	O(1)
    del key	           删除对应键值	O(1)
    incr key	   指定键的值自增1,
    如果Key不存在,     自增后get(key)=1  O(1)
    decr key	   指定键的值自减1,
    如果Key不存在,     自减后get(key)=-1 O(1)
    setnx key value	   key不存在时,才生效	O(1)
    set key value xx	key存在时,才生效	O(1)
    mset k1 v1 k2 v2...kn vn	设置多个键值对	O(n)
    getset key newValue	设置对应Key为newValue,同时返回旧的value	O(1)
    append key value	将value追加到旧的value	O(1)
    strlen key	        返回字符串的长度(注意中文)	O(1)
    incrbyfloat key 3.5	key对应的值加3.5	O(1)
    getrange key start end	获取字符串指定下标所有的值(下标从0开始)	O(1)
    setrange key index value	设定指定下标所对应的值	O(1)
    
    实战场景:
    记录网站每个用户个人主页的访问量:incr userid:pageview(键名)(单线程:无竞争。不会出错)
    缓存视频的基本信息(数据源在MySQL中)
    分布式id生成器:三个应用,我们希望三个应用每次获取的Id自增:incr
    

    哈希

    key为字符串,值分为两部分field和value,视为属性和值。可以把key当作一张表的一行,Key就代表一个id,每个属性可以看作关系型数据库的一个字段。fields不能相同,value可以。
    hget key field          获取hash key对应的field的value
    hset key field value    设置hash key对应field的value 
    hdel key field          删除hash key对应field的value
    hexists key field       判断hash key是否有field
    hgetall key             返回所有field。小心该命令,很多key的情况下可能造成阻塞。
    hlen key                获取hash key field的数量  O(n)
    hmget key field1 field2... field n    批量获取hash key的一批值    O(n)
    hmset set f1 v1 f2 v2...    批量设置值  O(n)
    hvals key           返回hash key对应所有field的value   O(n)
    hkeys key           返回hash key对应所有field     O(n)
    hsetnx key field value     设置Hash key对应的field的value(如果field存在,则失效)。
    hincrby key field intCounter value     自增intCounter
    hincrbyfloat      自增小数	 
    
    实战场景:
    记录网站每个用户个人主页的访问量:hincrby user:1:info pageviewcount
    缓存视频的基本信息(数据源在Mysql中)
    

    列表

    key是字符串,value是一个有序的list。特点是有序、可以重复。
    rpush key v1 v2 v3 ...vn       从列表右端插入值      o(1~n)
    lpush                          从列表左端插入,和列表右端用法一致o(1~n)                           
    linsert key before|after value newValue             在list指定的值前后插入newValueo(n)
    lpop key                   从左弹出一个item    o(n)
    lrem key count value       根据count的值,从列表中删除所有value相等的项:
    count>0,                  从左到右,删除最多count个value相等的值
    count<0,                  从右到左,删除最多Math.abs(count)个v相等的值 
    count=0,                  删除所有v相等的项
    lrim key start end         按照索引范围修剪列表 
    lrange key start end       获取列表指定索引范围所有item
    lindex key index           获取列表指定索引item
    llen key                   获取列表长度
    lset key index newValue    设置列表指定索引值为newV o(n)
    blpop                      b代表阻塞的概念。 blpop key timeout 是lpop的阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞。
    brpop                      跟blpop一样,只不过从右边获取	 
    实战场景:
    微博时间轴功能,微博从新到旧的顺序排列。每一个微博是一个对象,例如hash或字符串。然后你的微博Id作为key,你可以lrange获取0~10条微博然后mset获取所有内容,再序列化做出接口。
    
    Tips:
    
    LRUSH + LPOP = Stack
    LUSH + RPOP = Queue
    LPUSH + LTRIM = Capped Collection
    LPUSH + BRPOP = Message Quene
    

    集合

    values无序的、不重复的。可以想到数学里集合的概念。交集、并集和差集分别对应方法: sinter, sunion, sdiff。
    
    sadd key element           向集合Key添加element,若存在则失败 
    srem key element           将集合key中的element移除掉
    scard key                  计算集合大小,也就是element的数量 
    sismenber key element      判断element是否在集合中 
    srandmember key count      在集合中随机挑count个元素,该方法对比spop不会破坏集合。
    spop key                   从集合中随机弹出一个元素
    smembers key               获取集合所有元素。返回结果无序,如果member多,注意阻塞
    sinter/sunion/sdiff key1 key2	 
    sinter/sunion/sdiff + store destkey    将差集、交集和并集结果保存在destkey中
    
    实战场景:
    微博转发抽奖平台,can be spop
    点赞 踩
    标签tag 给用户添加标签: sadd user:1:tags tag1 tag2 给标签添加用户:略  可以将这两个操作放在同一个事务内。
    共同关注
    
    TIPS
    
    sadd = Tagging
    spop/srandmember = random item
    sadd + sinter = social graph 社交相关应用
    

    有序集合

    相对于集合:同样无重复元素、有序、element + score
    相对于列表: 无重复元素
    zadd key score element(可以是多对)  添加score和element    O(logN)
    zrem key element                     删除                  O(1)
    zscore key element                   返回元素的分数         O(1)
    zincrby key increScore element       增加或减少元素的分数    O(1)
    zcard key                            返回元素的总个数        O(1)
    zrank key value                      返回对应值的排名
    zrange key 0 -1 withscores           0-1是值所有范围,返回指定索引范围内的升序元素                   o(log(n) + m) n指元素个数,m索引范围内的个数
    zrangebyscore key minScore maxScore [withscore]           返回指定分数范围内的升序元素              o(log(n) + m) n指元素个数,m索引范围内的个数
    zcount key minScore maxScore                              返回有序集合内在指定分数范围内的个数       o(log(n) + m) n指元素个数,m索引范围内的个数
    zremrangebyrank                      删除指定排名内的升序元素                                       o(log(n) + m) n指元素个数,m索引范围内的个数
    zremrangebyscore                     删除指定分数内的升序元素                                       o(log(n) + m) n指元素个数,m索引范围内的个数
    zrevrank	 
    zrevrange	 
    zrervrangebyscore	 
    zinterscore	 
    zunionstore
     	 
    实战
    
    排行榜:分数添加更新,等等 score: timeStamp saleCount followCount
    

    Redis两种持久化方式的区别

    RDB方式是通过快照方式完成的 持久化
    定时生成 RDB 快照非常便于进行数据库备份  建议使用 为了安全两种都要使用
    RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集
    AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
    对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
    

    Redis的高可用方案

    互联网应用特征:高可用、高性能、高并发。
    redis作为中间缓存层一般高可用的设计方案为
    1:keepalived 通过keepalived提供的虚拟IP,提供主从的统一访问,当主出现问题时,通过keepalived运行脚本将从提升为主,待主恢复以后,从和主先进行同步,然后已经恢复的主自动变为主,该方案好处是,主从切换时,应用程序不需要知道变化了(因为使用了虚拟ip).缺点是有些情况下会由于切换丢失数据,而且增加了部署的复杂性。
    2: zookeeper 通过zookeeper来监控主从实例,维护最新的有效的ip,应用通过zookeeper订阅获取ip,然后对redis进行访问和操作,zookeeper解决单点故障的,服务注册和发现的。
    3: sentinel:哨兵模式,相当于zookeeper,官方推荐。
    
  • 相关阅读:
    事件对象
    事件
    父元素高度为auto,子元素使用top:-50%没有效果的问题
    Window.open 实现导航与打开窗口,导航到一个特定链接地址,也可以打开一个新的浏览器窗体
    8.0 BOM对象
    7.4 私有变量
    006_函数填充_计算列
    004_005_数据区域读取_填充数字
    003_行_列_单元格
    002_读写文件
  • 原文地址:https://www.cnblogs.com/yjp372928571/p/12759008.html
Copyright © 2011-2022 走看看