redis学习2-- API命令

1 通用命令

  keys *,和dbsize

  flushdb/flushall,清除当前数据库/清除所有数据库

   dbsize不会遍历所有键,时间复杂度是O(1) ,只是查询了redis内置key长度计算器

   keys *会去遍历所有键,时间复杂度是O(n),线上禁止使用这个命令

  exists key(检查键是否存在),

  del key...(删除键),

  expire key seconds(键过期),ttl 命令可以查看剩余时间,返回 大于 0的整数代表剩余的时间,-1 键未设置过期时间,-2键不存在

  type key 获取键的类型 返回5种对外的键类型,其实内部是有自己的编码的,

2 单线程架构

  redis是单线程的,假设我们三个客户端向redis服务端发送命令,服务端是将这三个命令加入到一个队列里面,然后挨个执行,是串行执行的,所以不会有并发问题。redis高速的原因主要是纯内存访问,内存反应速度快,另外避免了多线程切换所带来的消耗,其次是非阻塞IO,epoll多路复用IO模型的实现。

3 字符串类型  String

  首先,所有的键都是字符串类型的,字符串作为值时,既可以是简单字符串,也可以是JSON字符串,XML字符串,数字(以字符串存储,但是可以做算术运算如:incr命令),

  set,  setnx,  setxx  

  set 命令很简单,就是设置一个值,设置之前key存在就更新,不存在就添加,

  setnx 键不存在才可以设置,用于添加场景,可实现分布式锁,具体查看 http://redis.io/topics/dislocak

  setxx 键存在才可以设置,用于更新场景, 

  

  mset:mset a 1 b 2 c 3

  mget:mget a b c  如果不存在,会在相应位置返回空

  

  普通get时间 = n次网络时间+n次命令时间

  批量get = 1 次网络时间+n次命令时间

  批量get ,有助于提高效率

  append:追加命令,用于在字符串尾部追加值.

  getset:设置并返回原来的值

   字符串类型典型使用场景

  1 缓存

    用户请求先从redis缓存中查找。如果找到则直接返回,如果未找到,则从数据库找, 并且将结果设置到redis中

  2 计数

    使用incr自增计数,可以实现高效计数

  3 session共享

    将用户登录信息存入redis,集中管理,保证redis高可用即可,解决了服务器集群session不共享的问题

  4 限速

    比如实现对手机号码进行 一分钟之内只能发5次验证码的限制。

    setex 135********:limit  60 1 设置手机号一分钟内发送的次数,

    setex 135***06557 60*5 123456 设置手机号(5分钟内有效)

    这样就对手机号设置了一分钟内访问5次的限制

4 哈希 hash

  

  注意一下hash和字符串的结构区别,

  hset key1 name '张三'  hset key1 name '张三' age 18 或者 hmset key1 name '张三' age 18

  hget key1 name   hmget key1 name  age

  命令和String 很相似,其他不再赘述。

  hash的使用场景

  

  关系型数据库和hash数据结构的比较,可以看出关系型数据库的数据是结构化的,hash是比较松散的,前者添加新的列的时候,所有列都要设值,hash则更加灵活。但是hash做复杂查询困难。

5 列表 list

  

  列表(list)是用于存储多个有序的字符串的数据结构,可以从当栈和队列,有限集合,消息队列等场景

  列表的两个特点:

    1 有序,

    2 可重复

  linsert key before|after privot value  从左边开始查找第一个为privot的元素,并在其之前|之后插入value值

  lrange key statrt end ,列表索引有两个特点 1:end 是包含自身的,2: 下表从左到右依次是0到N-1,从右到左依次是-1到-N。

            lrange key 0 -1 可以查看列表所有元素

  列表的阻塞操作..

   阻塞式弹出,blpop key... timeout    , brpop  key... timeout 

  我们这里以brpop  命令为例,

  brpop  key... timeout ,key 可以是一个列表的键,也可以是多个列表的键,

    当一个key时,假如列表里面无数据,timeout >0时,客户端会等三秒再返回

    当一个key时,假如列表里面无数据,timeout =0时,客户端会一直阻塞下去

    当多个key(key1,key2,key3)时,brpop会从左到右,遍历键,一旦有一个键有元素能弹出,客户端立即返回,命令结束,这个命令不是每个列表都弹出元素才返回。

    如果多个客户端(c1,c2,c3)对同一个键执行brpop(timeout 0),假设最开始时列表是无元素的, 那么这三个客户端都处于阻塞状态,假设这时c4客户端执行push操作,那么c1 将会获取到元素,c1客户端返回。c2,c3将继续阻塞,因为c1最先执行brpop.

   列表list的使用场景

  lpush+lpop = stack ,栈

  lpush+rpop = queue,  队列

  lpush+ltrem = capped Collection ,有限的集合

  lpush+brpop = message queue ,阻塞式消息队列:生产者客户端在队列左侧插入元素,多个消费者客户端命令抢队列尾部数据,多个消费者保证了客户端的负载均衡及高可用性。

集合 set

  集合是无序(这里的无序与java里面的HashSet无序不是一个概念,java里面的是按照自己的规则,是相对的无序;这里是绝对的无序)不可重复的,不能通过索引来获取元素

  sadd key element... 添加元素

  srandmember key [count] 随机返回指定个数的元素,spop key [count],也是可以随机返回元素,但是前者不会删除元素,后者会删除元素

  sinter 交集,sunion 并集,sdiff 差集,

  sinterstore/sunionstore /sdiffstore  destination key 将交并差集合的结果保存

  集合使用场景

  维护标签--用户之间的关系

  得到拥有同一兴趣的用户 交集sinter 

  获取喜欢某个兴趣的用户集合

有序集合zset

  有序集合,不可重复的特性,但是是有序的,通过分数来保证有序,分数是可以重复的。

  zadd key score member   添加成员并指定分数

  zrank key member,  zrevrank key member 正反向获取成员的排名

  zset 也有交并差集的运算,具体可以翻看文档

  有序集合使用场景

  榜单系统,赞的数量等等。

  

 

posted on 2018-09-04 17:10  Advance_Man  阅读(235)  评论(0编辑  收藏  举报

导航