Redis复习篇

1.Redis(简单的,高效的,分布式,基于内存的缓存机制)

1.1 性能极高:

  • 读 110000次/s
  • 写 81000次/s

1.2 丰富的数据类型:

  • String,List,Hash,Set,Ordered Set

1.3 Redis操作都是具有原子性的

1.4 Redis单个Key能存入512M大小

2.Redis 数据类型

2.1 String

2.1.1 String类型常用命令:

  • 赋值语法:
    set key value:设置Key的值,如果key已经存在则覆盖。
    ++setnx key value:只有key不存在时设置key的值(解决分布式锁方案之一)。++

  • 取值语法:
    get key : 获取key对应的值,如果key不存在则返回nil。
    getrange key start end :对获取key对应的值进行截取。
    getbit key offset :对key所存储的字符串值,获取指定偏量上的位(bit)。
    mget [key1,key2…] : 获取给定一个或多个key的值。
    getset key value : 该语法用于设定key的值并返回旧值。
    strlen key :返回key存储字符串的长度。

  • 删除语法:
    del key : 删除指定的key,如果存在返回数字类型。

  • 自增自减:
    incr key : incr命令将key的值增一。如果key不存在,那么key的值先被初始化为0,然后在执行incr操作+1。
    decr key : decr命令将key的值减一。如果key不存在,那么key的值先被初始化为0,然后在执行incr操作-1。

incrby ken 增加量 : incrby命令将key中存储的数字加上指定的增加量。
decrby key 减少量 : decrby命令将key中存储的数字减去指定的减加量。

  • 字符串拼接:
    append key value :append命令用于指定key追加至末尾,如果不存在就为其赋值。

2.1.2 String类型应用场景:

  • String常用于保存单个字符串或者json字符串数据。
  • 因为String时二进制安全的,所以你完全可以把一个图片文件内容作为字符串存储。
  • 计数器(常规的key——value缓存应用常用计数,微博中粉丝数):
    incr等指令本身就具有原子性操作的特征,因此我们可以利用redis的incr,incrby,decr,decrby等指令实现原子计数的效果。

2.2 哈希(Hash)

2.2.1 简介

Redis hash 是一个sting类型的filed和value的映射表,hash非常适合存储对象。Redis中hash可以存储 2的32次方-1 键值对(40多亿)可以看成具有key和value的MAP容器。该类型占用很少的磁盘空间(相比于json)

2.2.2 Hash 命令

  • 赋值语法 :
    hset key field value : 为指定的key设置 k/v(域/值)。
    hmset key field value [field,value]… : 同时将多个field-value对设置到哈希表key中。
  • 取值语法
    hget key field : 获取存储在hash中的值,根据field得到value。
    hmget key field [field1…] : 获取key给定所有field字段的值。
    hgetall key : 返回hash表中该key存储所有的字段和值。
  • 删除语法
    hdel key field1 [field2] : 删除一个或多个hash表字段。
  • 其他语法
    hsetnx key field value : 只有字段field不存在时,设置哈希表字段的值。
    hincrby key field increment : 为哈希表key中指定的字段的整数增加上增量increment。
    hincrbyfloat key field increment : 为哈希表key中指定的字段的浮点数增加上增量increment。
    hexists key field : 查看hash表key中指定的字段是否存在。

2.3 List类型

2.3.1 简介

Redis列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列的头部(左边)或者尾部(右边)类似于java中的LinkedList

2.3.2 命令

  • 赋值语法:
    lpush key value1 [value2] : 将一个或多个值插入到列表头部(从左侧添加)。
    rpush key value1 [value2] : 在列表中添加一个或多个值(从右侧添加)。
    lpushx key value : 将一个值插入到也存在的列表头部。如果列表不存在,操作失效。
    rpushx key value : 一个值插入也存在的列表尾部(最右边)。如果列表不存在,操作无效。
  • 取值语法:
    llen key : 获取列表长度。
    lindex key index : 通过索引获取列表中的元素。
    lrange key start stop : 获取指定列表范围内的元素。

描述: 返回类表中指定区间内的元素,区间以偏移量start 和stop指定。其中0表示列表的第一个元素,1表示列表的第二个元素,以此类推。也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。

  • 删除语法:
    lpop key : 移除并获取列表的第一个元素(从左侧删除)。
    rpop key : 移除列表的最后一个元素,返回值为移除的元素(从头测删除)。
    blpop key1 [key2] timeout : 移除并获取列表的第一个元素,如果列表没有元素会阻塞列表值到等待超时或发现可弹出元素为止。
    brpop key1 [key2] timeout : 移除并获取列表的最后一个元素,如果列表中没有元素,会阻塞列表直到等待超时或发现可弹出元素为止。
    ltrim key start stop : 对一个列表进行修建(trim),就是说让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
  • 修改语法:
    lset key index value : 通过索引设置列表元素的值。
    linsert key before/after word value : 在列表的元素之前或者后插入元素(将值value插入到列表key当中位于值world之前或之后)。
  • 高级语法
    brpoplpush source destination timeout : 从列表中弹出一个值,将谈粗的元素插入到另外一个列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
    rpoplpush source destination : 移除列表的最后一个元素,并将该元素添加到另一个列表并返回

示例描述:
rpoplpush a1 a2 : a1的最后一个元素添加到另一个列表并返回。
rpoplpush a1 a1 : 循环列表,将最后一个元素移到最左侧。

2.3.3 List类型应用场景

  • 对数据量大的集合数据删减
    列表数据显示,关注列表,粉丝列表,留言评论等…分页,热点新闻等。
    利用lrange还可以很方便的实现分页的功能, 评论也可以存入一个单独的list中。
  • 任务队列
    list通常用来实现一个消息队列,而且可以确保先后顺序,不必像mysql那样还需要通过order by 来进行排序

2.4 Set类型

2.4.1 Set类型简介

  • Redis的Set是String类型的无须集合。集合成员是唯一的, 这就意味着集合中不能出现重复的数据。Redis中集合对象Set的底层存储结构特别神奇,底层使用了intset和hashtable两种数据结构存储的,intset我们可以理解为数组,hashtable就是普通的哈希表(key为set的值,value为null)。intset内部其实就是一个数组(int8_t conentents[]数组),而且存储数据的时候是有序的,因为在查找数据的时候是通过二分查找来实现的。

2.4.2 Set命令

  • 赋值语法:
    sadd key member1 [member2] : 向集合添加一个或者多个成员。
  • 取值语法:
    scard key : 获取集合的成员数量。
    smembers key : 返回集合中的所有成员。
    sismember key member : 判断member元素是否是集合key的成员(开发中:验证是否存在的判断)
    srandmember key [count] : 返回集合中一个或者多个随机数
  • 删除语法:
    srem key member1 [member2] : 移除集合中一个或者多个成员。
    spop key [cont] : 移除并返回集合中的一个随机元素。
    smove source destination member : 将member元素从source集合移动到destination集合。
  • 差集语法:
    sdiff key1 [key2] : 返回给定所有集合的差集(左侧为准);
    sdiffstore destination key1 [key2] : 返回给定所有集合的差集并存储在destination中。
  • 交集语法:
    sinter key1 [key2] : 返回给定所有集合的交集(共有数据);
    sinterstore destination key1 [key2] : 返回给定所有集合的交集并存储在destination中;
  • 并集语法:
    sunion key1 [key2] : 返回所有给定集合的并集;
    sunionstore destination key1 [key2] : 所有给定集合的并集存储在destination 集合中

2.4.3 Set类型应用场景

  • 常用于对两个集合间的数据计算进行交集,并集, 差集运算
  • 以非常方便的实现如同共同关注,共同喜好,二度好友等功能。对上面的所有集合操作,你还可以使用不同的命令 选择将结果返回给客户端还是存到一个新的集合中。
  • 利用唯一性,可以统计访问网站的独立IP。

2.5 ZSET(有序集合)

2.5.1 简介

  • Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
  • 不同的是灭个元素都会关联一个double类型的分数,Redis正是通过分数来为集合中的成员进行从大到小的排序。
  • 有序集合的成员是唯一的,但分数却可以重复。
  • 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是0。集合中嘴的成员数为2的23次方-1 (4294967295,每个集合可存储40多亿个成员)。
  • Redis的ZSet是有序,且不重复(很多时候,我们都将redis中的有序集合叫做zsets,这是因为在Redis中,有序集合相关的操作指令都死以z开头的);

2.5.2 命令

  • 赋值语法:
    zadd key score1 number1 [scoure2 member2] : 向有序集添加一个或者多个成员,或者更新已存在成员的分数
  • 取值语法:
    zcard key : 获取有序集合的成员数;
    zcount key min max : 计算在有集合中指定区间分数的成员数;
    zrank key member : 返回有序集合中指定成员的索引;
    zrange key start stop [winthscores] : 通过索引区间返回有序集合指定区间内的成员(由高到低);
    zrevrange key start stop [winthscores] : 返回有序集合中指定区间内的成员,通过索引,分数由高到低;
  • 删除语法:
    del key : 移除集合;
    zrem key member [member…] : 移除有序集合中的一个或者多个成员。
    zremrangebyrank key start stop : 移除有序集合中给定的排名区间的所有成员(第一名是0);
    zremrangebyscore key min max : 移除有序几个中给定的分数区间的所有成员。

2.5.3 ZSET应用场景

常用于排行榜

  • 比如twitter 的public timeline 可以用代表时间作为scoure作为存储,这样获取时就是自动按时间排好序的。
  • 比如一个存储全班同学成绩的Sorted Set ,其集合value 可以是同学的学号,而score就可以是其考试的分,这样在数据插入集合的时候,就已经进行了天然的排序。
  • 还可以用Sorted Set 来做带权重的队列,比如普通消息的score为1 ,重要消息的score为2,这样工作线程就可以选择按score的倒叙来获取工作任务,让重要的任务优先执行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值