zoukankan      html  css  js  c++  java
  • redis 数据类型

    愉快的周末又要来临了,对于极度热爱工作的我来说。。美滋滋。为了让大家有一个愉快的周末,今天来说点基础的东西,当做睡前催眠小文章。

    redis 数据类型

    redis 包含5种数据类型,相对于其他繁多的数据类型,只有5个可以说是非常有良心了。分别是 string(字符串),hash(哈希),list(列表),set(集合)及 zset(sorted set:有序集合)。

    下面我们来分别介绍及其使用场景。

    string 字符串

    - 最常见的数据类型,一个 key 对应一个 value,理论上来讲 value 可以存储任何数据。一个键最大能存储 512M。

    - 操作

      set key value  设置键值

      get key  获取指定key value

      incr key  指定 key value 自增1,value 值需为整数

      incrby key num  指定 key value 自增 num

      decr/decrby  递减

      incrbyfloat key num  增加指定浮点数

      append key value  指定键值尾部追加值

      strlen key  获取指定键值长度

      mset key1 value1 key2 value2  同时设置多个键值

      mget key1 key2  同时获取多个键值

    - 使用场景:复杂的计数功能的缓存、避免重复提交锁。

    Hash 散列

    - 键值对合集,string 类型的 field 和 value 的映射表。每个 hash 可以存储 232 - 1 键值对(40多亿)。

      注:redis 所有数据类型的值都不支持数据类型嵌套。散列的 value 值只能是字符串,集合的元素只能为字符串,不能为集合或者散列表。

    - 操作

      hset key field value  设置 key 下 field 字段的 value 值

      hget key field  获取 key 下 field 字段的 value 值

      hmset key field1 value1 field2 value2  批量设置

      hmget key field1 field2  批量获取

      hgetall key  获取该 key 下的所有字段值

      hexists key field  判断字段是否存在

      hsetnx key field value  字段不存在赋值

      hincrby key field num  设置字段 field 自增 num,字段不存在会默认创建且值为0

      hdel key field [field2...]  删除一个或多个字段

      hkeys key  只获取字段名

      hvals key  只获取字段值

      hlen key  获取字段数量

    - 使用场景:存储用户信息(姓名、年龄、性别等),方便读取。

    - 补充

      对比 mysql 表结构,更加灵活。比如存储用户信息,必要信息为 姓名、年龄、性别,非必要信息为 职能、爱好。

      即使个别用户不存在非必要信息,mysql 表结构也需要设置这两个字段,而 hash 则可以省去这两个字段。 

     

    List 列表

    - 字符串列表,按照插入顺序排序。也就是说列表数据是有序的。列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。双向链表实现。

    - 操作

      lpush/rpush key value [value2...]  向列表左/右边增加元素,返回增加元素后的列表长度。

      lpop/rpop key  从列表左/右边弹出元素,返回被弹出元素。

      注:结合以上命令,可以分别将列表当成栈或者队列来操作。

      llen key  返回列表中元素个数。

      lrange key start  end  获取列表片段,start、end 为列表索引起始值。

      ltrim key start end  只保留索引片段

      lrem key count value  删除前 count 个值为 value 的元素,返回删除个数。count 为0时,删除所有值为 value 的元素。

      lindex key index  获得指定索引元素值。若 index 为负数,则从右边开始计算索引,右边第一个索引值为 -1.

      lset key index value  设置指定索引元素值

      linsert key before | after pivot value  向指定元素 pivot 前后插入指定元素 value。返回插入后的列表元素个数。

    - 使用场景:

      1、利用其有序特性,可以做简单的消息队列功能。

      2、获取中间元素慢,两边元素快。实现 新鲜事、日志类似功能。

    Set 集合

    - string 类型的无序集合。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

      集合类似列表,但是有本质区别。  

    - 操作

      sadd key member [member2...]  向集合中增加元素。已存在的自动忽略,返回增加成功元素个数(不统计忽略元素)。

      srem key member  [member2...]  删除元素

      smembers key  获取集合中所有元素

      sismember key member  判断元素是否在数组中

      sdiff keyA keyB  差集,支持多个数组,按顺序取差集。

      sinter keyA keyB  交集

      sunion keyA keyB  并集

      scard key  获取集合元素个数

      sdiffstore destination key [key2...]  数组运算并将结果存储

      srandmember key [count]  随机获取数组中元素

      spop key  随机弹出元素

    - 使用场景:交集,并集,差集

    zset 有序集合

    - zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个分数用来做排序。既然是集合,自然集合的所有特性它都有,比如插入、删除和判断元素是否存在集合中;当然,关联了分数且是有序的,自然也会有自己的特性,比如通过分数获取前N个元素、获得指定范围的元素等。

    - 和列表相比,有什么相同或者不同呢?

      相同点

      1、有序

      2、都可以获得范围内元素

      不同点

      1、列表通过链表实现,获取数据时,两端快中间慢。

      2、有序集合通过散列表和跳跃表实现,即使读取中间部分数据也很快。

      3、有序集合比列表更耗费内存。

    - 操作

      zadd key  score menber [score1 member1...]   添加元素到集合,元素在集合中存在则更新对应score。

      zscore key member  获取元素分数

      zrange key start stop [withscores]  获取排名从小到大在某个范围的元素列表(先按照分数优先排序,排序后会分配索引)

      zrevrange key start stop [withscores]  从大到小

      zrangebyscore key min max [withscore] [limit offset count]  获取指定分数范围的元素

      zrevrangebyscore key max min  从大到小取值,如小于100分的元素

      zincrby key increment member  增加元素分数

      zcard key  获取集合中元素数量

      zcount key min max  指定分数范围内元素个数

      zrem key member [member1...]  删除元素

      zremrangebyrank key start stop  按照排名删除元素

      zremrangebyscore key min max  按照分数范围删除元素

      zrank key member  获得元素排名,从小到大顺序

      zrevrank key member  从大到小顺序

    - 使用场景:排行榜 、带权重的消息队列

    参考文章:

    https://www.w3cschool.cn/redis/redis-data-types.html

    https://www.cnblogs.com/jasonZh/p/9513948.html

  • 相关阅读:
    学习认识Spring原理
    JavaScript
    JSP----九大内置对象
    人到底可以有怎样的意志力,人到底可能有怎样的发挥潜力? ----问自己
    将web项目打成war包部署在tomcat步骤
    微信企业公众号开发之回调模式
    eclipse/myeclipse 中的一些常用的快捷键
    mycelipse中关于编码的配置
    Ext学习系列(1)初识Ext
    AngularJs编写指令
  • 原文地址:https://www.cnblogs.com/suojian/p/13328713.html
Copyright © 2011-2022 走看看