• Redis(三)数据类型


    之前的文章中说了Redis的常见应用场景和特性,在特性章节中也大致说了数据结构契合场景。因为我想在更深入、更全面的学习Redis之前,了解场景和特性,才能在学习时更加全面且理解更透彻:

    • redis的什么特性支持这些应用场景?
    • 为什么这些场景下使用redis会带来好处?

    数据类型

    Redis数据结构大体上是一种key-value形式,根据value的不同数据类型,将其分为以下几种。其中Bitmap并不是一种新的数据类型,它其实是将String类型的每一位限制成0或1实现,详见Bitmaps文档。

    数据类型 描述 操作命令 应用场景
    String value是String set、get、incr、incrby、setnx、 setex、 k-v分布式缓存、分布式锁、 过期值、分布式session
    List value是List列表 lpush、lpop、lrange、 rpush、rpop、 lindex、llen、lrem、 brpop 任务队列、消息队列、最新信息
    Hash value是Hash映射表 hset、hget、hdel、 hexists、hgetall、 hincby、hkeys、hlen、 hmset 对象缓存
    Set value是无序的Set集合 sadd、smembers、sismembers、 scard、sinter、sdiff、sunion、 spop、srem 文章tag
    Sorted Set value是有序的Set集合 zadd、zcard、zcount、zincrby、 zrange、zrangebylex、 zrangebyscore、zrank、 zrem、zrevrange 排行榜
    Bitmap value是0/1 setbit、getbit、bitcount、 bittop 用户状态、用户在线时间

    除了以上几种,Redis还支持hyperloglogs和geospatial类型,由于不是很常用,这里不做介绍。具体可以参考方Introduction to Redis文档。

    每种数据类型除了各自相应的读写删命令,这些数据类型还有共性命令。为何共性,因为这些共性命令是作用在key上,上面也说到了,redis的数据结构大体上是key-value结构。

    exists命令

    1.语法:

    exists key [key...]

    2.用途:
    用于检测指定key是否存在

    del命令

    1.语法

    del key [key...]

    2.用途
    删除指定key

    expire和pexpire命令

    1.语法

    expire key seconds
    pexpire key millseconds

    2.用途
    expire用于设置key的过期时间,单位秒。pexpire也是用于设置key的过期时间,单位毫秒

    keys命令

    1.语法

    keys pattern

    2.用途
    用于查找指定模式的key,支持glob-style pattern。详情参考KEYS pattern文档

    简单的命令操作

    Redis提供了操作的命令行redis-cli,在下载的redis包中的bin目录下。在启动了redis-server的前提下,直接运行redis-cli即可进入redis命令行:

    $ redis-cli
    127.0.0.1:6379> 
    127.0.0.1:6379> 
    

    下面通过redis-cli命令行来认识下redis中的常用数据类型

    1.String类型

    // set命令设置k-v
    127.0.0.1:6379> set key value
    OK
    
    // get命令获取指定key的值
    127.0.0.1:6379> get key
    "value"
    
    //setnx如果key存在则不设置,否则设置
    127.0.0.1:6379> setnx key value
    (integer) 0
    127.0.0.1:6379> setnx key1 value1
    (integer) 1
    
    //setex设置k-v和过期时间
    127.0.0.1:6379> setex key2 60 value2
    OK
    127.0.0.1:6379> ttl key2
    (integer) 56
    127.0.0.1:6379> ttl key2
    (integer) 54
    
    //incr指定key的值自增长
    127.0.0.1:6379> set key3 5
    OK
    127.0.0.1:6379> incr key3
    (integer) 6
    
    //incrby指定key的值增长幅度
    127.0.0.1:6379> incrby key3 100
    (integer) 106
    

    2.List类型

    //lpush从左边推入value至list中
    127.0.0.1:6379> lpush list value1 value2 value3
    (integer) 3
    
    //lrange按范围获取list中的value,
    //第一个表示起始索引,第二个表示结束索引。-1表示所用
    127.0.0.1:6379> lrange list 0 -1
    1) "value3"
    2) "value2"
    3) "value1"
    
    //rpop表示从右边弹出一个value
    127.0.0.1:6379> rpop list
    "value1"
    
    //lindex获取指定位置的vlaue
    127.0.0.1:6379> lindex list 0
    "value3"
    
    //llen获取list的大小
    127.0.0.1:6379> llen list2
    (integer) 8
    
    //brpop阻塞从右边弹出元素。参数5指定阻塞超时时间,0表示永久
    127.0.0.1:6379> brpop list2 5
    (nil)
    (5.04s)
    

    3.Hash类型

    //hset设置映射表的k-v
    127.0.0.1:6379> hset map name lxy
    (integer) 1
    
    //hmset同时设置多个映射表的k-v
    127.0.0.1:6379> hmset map age 11 sex male
    OK
    
    //hgetall获取映射表的所有k-v
    127.0.0.1:6379> hgetall map
    1) "name"
    2) "lxy"
    3) "age"
    4) "11"
    5) "sex"
    6) "male"
    
    //hget获取映射表的指定k的v
    127.0.0.1:6379> hget map age
    "11"
    
    //hlen获取映射表的大小
    127.0.0.1:6379> hlen map
    (integer) 3
    
    //hexists探测映射表的指定k是否存在
    127.0.0.1:6379> hexists map address
    (integer) 0
    
    //hdel删除映射表指定k-v
    127.0.0.1:6379> hdel map name
    (integer) 1
    
    //hincrby幅度增长映射表指定k的v
    127.0.0.1:6379> hincrby map age 20
    (integer) 31
    
    

    4.Set类型

    //sadd向set中添加v,无重复
    127.0.0.1:6379> sadd set v1 v2 v3 v4 v4 v5
    (integer) 5
    
    //scard探测set元素个数
    127.0.0.1:6379> scard set
    (integer) 5
    
    //smembers获取set所用元素
    127.0.0.1:6379> smembers set
    1) "v4"
    2) "v1"
    3) "v2"
    4) "v3"
    5) "v5"
    
    //探测指定set是否存在某个元素
    127.0.0.1:6379> sismember set v8
    (integer) 0
    
    //sinter计算多个set的交集
    127.0.0.1:6379> sinter set set1
    1) "v3"
    2) "v5"
    
    //sunion计算多个set的并集
    127.0.0.1:6379> sunion set set1
    1) "v6"
    2) "v2"
    3) "v3"
    4) "v9"
    5) "v4"
    6) "v1"
    7) "v7"
    8) "v5"
    9) "v8"
    
    //计算第一个set与其他set的差集
    127.0.0.1:6379> sdiff set set1
    1) "v2"
    2) "v4"
    3) "v1"
    
    

    5.Sorted Set类型

    //zadd想sorted set中添加元素
    127.0.0.1:6379> zadd ss 0 v0 1 v1 3 v4 4 v3 5 v5
    (integer) 5
    
    //zcard计算sorted set的元素个数
    127.0.0.1:6379> zcard ss
    (integer) 5
    
    //zcount统计指定score范围的元素个数
    127.0.0.1:6379> zcount ss 0 1
    (integer) 2
    
    //zrange获取指定索引范围的元素
    127.0.0.1:6379> zrange ss 0 3
    1) "v0"
    2) "v1"
    3) "v4"
    4) "v3"
    
    

    5.Bitmap类型

    //setbit设置指定bit位v
    127.0.0.1:6379> setbit user 1 0
    (integer) 0
    127.0.0.1:6379> setbit user 2 1
    (integer) 0
    127.0.0.1:6379> setbit user 3 1
    (integer) 0
    127.0.0.1:6379> setbit user 4 0
    (integer) 0
    
    //getbit获取指定bit位的v
    127.0.0.1:6379> getbit user 2
    (integer) 1
    
    //统计指定key的bit位为1的个数
    127.0.0.1:6379> bitcount user
    (integer) 2
    
    

    6.通用键

    //expire设置k的过期时间
    127.0.0.1:6379> expire user 5
    (integer) 1
    127.0.0.1:6379> ttl user
    (integer) 1 
    127.0.0.1:6379> exists user
    (integer) 0
    
    //keys探测redis中存在哪些k
    127.0.0.1:6379> keys *
    1) "sk"
    2) "name"
    3) "ss"
    4) "map"
    5) "set"
    6) "m"
    7) "set1"
    8) "list"
    9) "k"
    
    //del删除指定的k
    127.0.0.1:6379> del name sk map
    (integer) 3
    
    

    以上是以命令的方式学习理解redis的数据结构,但是在日常开发中基本上是使用某种语言的redis客户端与redis交互操作。
    redis支持丰富的各种语言的客户端,单独对java而言就存在很多种选择,jedis是一个非常不错和普遍被使用的java版本redis client。开源地址xetorthio/jedis,对于jedis的使用api,可以参考其开源项目中的丰富测试类jedis/src/test/java/redis/clients/jedis/tests/commands/

    参考

    An introduction to Redis data types and abstractions

  • 相关阅读:
    HTML5 h1多层次样式问题
    spellcheck
    Favicon
    设计模式
    CSS 宽高的计算
    行高计算
    White-space 属性
    简约插件Plug-in for simple
    js类型及其判断
    前端路由
  • 原文地址:https://www.cnblogs.com/lxyit/p/9828810.html
Copyright © 2020-2023  润新知