zoukankan      html  css  js  c++  java
  • 【11月7日】Redis核心对象和数据类型

    Redis核心对象-redisObject

    在Redis中有一个核心对象叫做redisObject,是用来表示所有的key和value的,用redisObject结构体来表示String、Hash、List、Set、Zset五种数据类型


    redisObject的源代码在redis.sh中,使用C语言编写

    • 数据类型(type)
    • 编码方式(encoding)
    • 数据指针(ptr)
    • 虚拟内存(vm)
    • 其他信息



    Redis数据类型


    String(字符串)类型

    String是Redis最基本的数据类型,它数据结构存储方式有三种int、raw、embstr,它不仅可以存储字符串,还可以存储整数、浮点数、甚至是二进制数据,比如jpg图片或序列化的对象(一个String最大存储512M)

    常用命令:

    mset key1 value1 key2 value2 key3 value3:同时设置多个键值对

    mset k1 name k2 age k3 gender
    

    mget key1 key2 key3:同时获得多个键的值

    mget k1 k2 k3
    

    append key value:追加数据

    append k1 zhangsan
    

    -->"namezhangsan"

    getrange key m n :截取key值的某一段,从第m-1位到n-1位

    getrange k1 2 4
    

    strlen key:获取key值的长度

    incr key:自增(递增,默认自增1,只针对字符串是整数的情况)

    decr key:自减(递减,默认自减1,只针对字符串是整数的情况)

    set k1 2
    incr k1 --> 3
    decr k1 --> 2
    

    incrby key 2:自定义自增多少

    decrby key 2:自定义自减多少


    Hash(哈希)类型

    Hash(哈希)类型是从redis-2.0版本之后才有的数据结构,用于存放字符串和字符串之间的映射。Hash对象的实现方式有两种,分别是 Ziplist 和 hashtable,其中 hashtable 的存储方式 Key 是 String 类型, value 也是以 key-value 的形式进行存储。



    常用命令:

    hmset key field value [field value ...]:批量设置hash key的一批field value

    127.0.0.1:6379> hmset user1 name tan age 18 sex male
    OK
    

    hget key field : 得到一个value值

    127.0.0.1:6379> hget user1 name
    "tan"
    

    hmget key field1 field2 ... fieldN: 批量获取hash key的一批field对应的值

    127.0.0.1:6379> hmget user1 name sex
    1) "li"
    2) "male"
    

    hgetall key : 得到所有键值对

    127.0.0.1:6379> hgetall user1
    1) "name"
    2) "tan"
    3) "age"
    4) "18"
    5) "sex"
    6) "male"
    

    hset key field value: 设置hash key 对应的field的value

    127.0.0.1:6379> hset user1 name li
    (integer) 0
    127.0.0.1:6379> hget user1 name
    "li"
    

    hdel key field: 删除hash key 对应field的value

    127.0.0.1:6379> hdel user1 sex
    (integer) 1
    127.0.0.1:6379> hgetall user1
    1) "name"
    2) "li"
    3) "age"
    4) "19"
    

    hlen key: 获取hash key field的数量

    127.0.0.1:6379> hlen user1
    (integer) 3
    

    hincrby key field increment: hash key 对应的field的value自增

    127.0.0.1:6379> hincrby user1 age 1
    (integer) 19
    127.0.0.1:6379> hincrby user1 age -1
    (integer) 18
    127.0.0.1:6379> hincrby user1 age -2
    (integer) 16
    127.0.0.1:6379> hincrby user1 age 3
    (integer) 19
    

    List(列表)类型

    List 类型是一种链表结构,主要功能是 push (进栈)、pop(出栈);List 类型在 redis-3.2 之前的版本是使用 ziplist 和 linkedlist 进行实现的,之后版本就是引入 quicklist


    常用命令:

    lpush: 在key对应list的头部添加字符串元素

    lpop:从key对应list的头部删除元素

    rpush:在key对应list的尾部添加字符串元素

    lrange:显示key对应list的元素

    lpush key value [value ...]:在key对应list的头部添加字符串元素

    127.0.0.1:6379> lpush mylist 1
    (integer) 1
    127.0.0.1:6379> lpush mylist 2
    (integer) 2
    127.0.0.1:6379> lpush mylist "3"
    (integer) 3
    

    lrange key start stop: 显示key对应list的元素

    127.0.0.1:6379> lrange mylist 0 -1
    1) "3"
    2) "2"
    3) "1"
    

    rpush key value [value ...]: 在key对应list的尾部添加字符串元素

    127.0.0.1:6379> rpush mylist 4
    (integer) 4
    127.0.0.1:6379> lrange mylist 0 -1
    1) "3"
    2) "2"
    3) "1"
    4) "4"
    

    lindex key index:打印key对应list第index位的元素

    127.0.0.1:6379> lindex mylist 0
    "3"
    

    lset key index value:修改key对应list第index位的元素

    127.0.0.1:6379> lset mylist 0 111
    OK
    127.0.0.1:6379> lrange mylist 0 -1
    1) "111"
    2) "2"
    3) "1"
    4) "4"
    

    lpop key: 从key对应list的头部删除元素

    127.0.0.1:6379> lpop mylist
    "111"
    127.0.0.1:6379> lrange mylist 0 -1
    1) "2"
    2) "1"
    3) "4"
    

    rpop key: 从key对应list的尾部删除元素

    127.0.0.1:6379> rpop mylist
    "4"
    127.0.0.1:6379> lrange mylist 0 -1
    1) "2"
    2) "1"
    

    llen key:打印key对应list的长度

    127.0.0.1:6379> llen mylist
    (integer) 2
    

    lrem key count value: 从key对应list删除某个元素 count代表第几个,count等于0代表所有的

    127.0.0.1:6379> lrange mylist 0 -1
    1) "3"
    2) "2"
    3) "1"
    127.0.0.1:6379> lrem mylist 0 3
    (integer) 1
    127.0.0.1:6379> lrange mylist 0 -1
    1) "2"
    2) "1"
    

    linsert key BEFORE|AFTER pivot value: 从key对应list插入某个元素

    127.0.0.1:6379> lrange mylist 0 -1
    1) "10"
    2) "5"
    3) "2"
    4) "1"
    127.0.0.1:6379> linsert mylist before 10 99
    (integer) 5
    127.0.0.1:6379> lrange mylist 0 -1
    1) "99"
    2) "10"
    3) "5"
    4) "2"
    5) "1"
    127.0.0.1:6379> linsert mylist after 2 999
    (integer) 6
    127.0.0.1:6379> lrange mylist 0 -1
    1) "99"
    2) "10"
    3) "5"
    4) "2"
    5) "999"
    6) "1"
    

    Quartz核心概念

    Job

    任务:定义具体执行的任务逻辑(内容)

    JobDetail

    任务详情:定义一个可执行的调度程序,Job是这个可执行调度程序所要执行的内容

    Trigger

    任务触发器:定义执行的方式、间隔

    Scheduler

    任务调度器: 是Quartz中的核心组件,它负责任务的调度、JobDetail、Trigger的管理,它包含了和定时调度相关的所有属性和操作。一般一个程序中就定义一个Scheduler组件。


    Trigger 实现的四种方式

    SimpleTrigger

    指定从某一个时间开始,以一定得时间间隔(单位是毫秒)执行的任务;它适合的任务类似于:9:00 开始,每隔一小时,执行一次。


    属性

    • repeatInterval - 重复间隔
    • repeatCount - 重复次数

    ClendarIntervalTrigger

    类似于 SimpleTrigger, 指定从某一个时间开始,以一定时间间隔执行的任务;ClendarIntervalTrigger支持的间隔单位有秒,分钟,小时,天,月,年,星期。它适合的任务类似于:9:00 开始,每隔一周,执行一次。


    优势

    • 更方便(比如每隔一小时执行,不用计算1小时等于多少毫秒)
    • 支持不是固定长度的间隔 (比如间隔为月和年)

    劣势

    • 精度只能到秒

    DailyTimeIntervalScheduleBuilder

    指定每天的某个时间内,以一定时间间隔执行的任务,并且它可以支持指定星期。它适合的任务类似于:指定每天9:00至18:00,每隔70s执行一次,并且只要周一至周五执行。


    属性

    • statTimeOfDay - 每天开始时间
    • endTimeOfDay - 每天结束时间
    • daysOfWeek - 需要执行的星期
    • interval - 执行间隔
    • intervalUnit - 执行间隔的单位
    • repeatCount - 重复次数

    CronTrigger

    适合于更复杂的任务,它支持类型于Linux Cron的语法(并且更强大),它基本上覆盖了以上三个Trigger的绝大部分能力(但不是全部);当然,它也更难以理解和掌握。它适合的任务类似于:每天0:00, 9:00, 18:00各执行一次。


    Cron表达式=秒+分钟+小时+日期+月份+星期+年份(可选)


    Set (无序集合) 类型

    Set 类型是 String 类型的无序几个,Set 集合是不可重复的,而 List 列表可以存储相同的字符串


    常用命令:

    sadd key member [member ...]:添加

    127.0.0.1:6379> sadd myset 1
    (integer) 1
    127.0.0.1:6379> sadd myset 1 2 3 4
    (integer) 3
    

    smembers key:查询

    127.0.0.1:6379> smembers myset
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    

    srem key member [member ...]:删除

    127.0.0.1:6379> srem myset 2
    (integer) 1
    127.0.0.1:6379> smembers myset
    1) "1"
    2) "3"
    3) "4"
    

    sismember key member:是否存在

    127.0.0.1:6379> sismember myset 1
    (integer) 1
    127.0.0.1:6379> sismember myset 2
    (integer) 0
    

    scard key:元素总数

    127.0.0.1:6379> scard myset
    (integer) 3
    

    srandmember key [count]:随机获取元素

    127.0.0.1:6379> srandmember myset
    "3"
    127.0.0.1:6379> srandmember myset 1
    1) "3"
    127.0.0.1:6379> srandmember myset 2
    1) "4"
    2) "1"
    127.0.0.1:6379> srandmember myset 6
    1) "1"
    2) "3"
    3) "4"
    

    spop key [count]:随机弹出元素

    127.0.0.1:6379> spop myset 
    "1"
    127.0.0.1:6379> spop myset 1
    1) "4"
    127.0.0.1:6379> smembers myset
    1) "3"
    

    sunion key [key ...]:取多个set的并集 (sinter key [key ...]:取多个set的交集)

    127.0.0.1:6379> smembers myset
    1) "1"
    2) "2"
    3) "3"
    127.0.0.1:6379> smembers myset2
    1) "98"
    2) "99"
    3) "100"
    127.0.0.1:6379> sunion myset myset2
    1) "1"
    2) "2"
    3) "3"
    4) "98"
    5) "99"
    6) "100"
    

    Set 类型的底层实现

    Set 类型的底层实现是 ht 和 Intset,其中 Inset 也叫做整数集合,用于保存整数值的数据结构类型,它可以保存 int16_t、int32_t 或者 int64_t 的整数值


    Set 类型的应用场景

    利用 Set 集合的无序且不可重复性,业务应用场景如下:

    • 去重
    • 抽奖
    • 共同好友
    • 二度好友
    • ...

    ZSet(有序集合)类型

    Zset 类型是 String 类型的有序集合,Zset 集合是不可重复的,它的底层实现是 ziplist 和 skiplist(跳跃表)


    常用命令:

    zadd - 为指定key的zset添加元素

    zpop -随机删除指定key中元素

    zrem -删除指定元素


    zadd key [NX|XX] [CH] [INCR] score member [score member ...]:为指定key的zset添加元素

    127.0.0.1:6379> zadd myzset 1 www.baidu.com
    (integer) 1
    127.0.0.1:6379> zadd myzset 3 www.360.com
    (integer) 1
    127.0.0.1:6379> zadd myzset 2 www.google.com
    (integer) 1
    

    zrange key start stop [WITHSCORES]: 显示key对应zset的元素

    127.0.0.1:6379> zrange myzset 0 -1
    1) "www.baidu.com"
    2) "www.google.com"
    3) "www.360.com"
    127.0.0.1:6379> zrange myzset 0 -1 withscores 
    1) "www.baidu.com"
    2) "1"
    3) "www.google.com"
    4) "2"
    5) "www.360.com"
    6) "3"
    

    zrem key member [member ...]: 为指定key的zset删除元素

    127.0.0.1:6379> zrange myzset 0 -1
    1) "www.baidu.com"
    2) "www.google.com"
    3) "www.360.com"
    127.0.0.1:6379> zrem myzset www.baidu.com
    (integer) 1
    127.0.0.1:6379> zrange myzset 0 -1
    1) "www.google.com"
    2) "www.360.com"
    

    Redis 命令参考

    Redis命令参考2

  • 相关阅读:
    浅谈VUE中的深拷贝与浅拷贝Object.assign()方法
    echarts详细
    实现HTML调用打开本地软件文件
    el-select 中放置el-tree
    关于前端平时需要用到的方法(未完成)
    10个Vue开发技巧助力成为更好的工程师
    element ui 弹出组件的遮罩层以及多层遮罩解决办法。。
    vue样式穿透 v-deep与deep的具体使用
    # Ansible安装指南
    Linux笔记—网络管理
  • 原文地址:https://www.cnblogs.com/tantanli/p/13942837.html
Copyright © 2011-2022 走看看