【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"