【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

posted @ 2020-11-07 23:07  tantanli  阅读(298)  评论(0编辑  收藏  举报