Redis的基本数据类型
String, list, set, map, zset(sorted-set)
zset的使用
set与zset都是string类型元素的集合,不允许有重复。zset的每个成员都会关联一个double类型的分数,根据这个分数为集合中的成员进行从小到大的排序。
分数可重复, 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
举例:在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息,适合使用Redis中的zset结构进行存储。
实例
redis 127.0.0.1:6379> ZADD runoobkey 1 redis
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 0
redis 127.0.0.1:6379> ZADD runoobkey 4 mysql
(integer) 0
redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"
Redis有序集合命令
1
|
向有序集合添加一个或多个成员,或者更新已存在成员的分数
|
11
|
移除有序集合中的一个或多个成员
|
2
|
获取有序集合的成员数
|
12
|
移除有序集合中给定的字典区间的所有成员
|
3
|
计算在有序集合中指定区间分数的成员数
|
13
|
移除有序集合中给定的排名区间的所有成员
|
4
|
有序集合中对指定成员的分数加上增量 increment
|
14
|
移除有序集合中给定的分数区间的所有成员
|
5
|
计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
|
15
|
返回有序集中指定区间内的成员,通过索引,分数从高到低
|
6
|
在有序集合中计算指定字典区间内成员数量
|
16
|
返回有序集中指定分数区间内的成员,分数从高到低排序
|
7
|
通过索引区间返回有序集合指定区间内的成员
|
17
|
返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
|
8
|
通过字典区间返回有序集合的成员
|
18
|
返回有序集中,成员的分数值
|
9
|
通过分数返回有序集合指定区间内的成员
|
19
|
计算给定的一个或多个有序集的并集,并存储在新的 key 中
|
10
|
返回有序集合中指定成员的索引
|
20
|
迭代有序集合中的元素(包括元素成员和元素分值
|
Redis的持久化(怎么保证redis挂掉之后再重启数据可以进行恢复)
Redis的一种持久化方式叫快照(snapshotting,RDB),另一种是只追加文件(append-only file,AOF)。
RDB
Redis创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis主从结构,主要用来提高Redis性能),还可以将快照留在原地以便重启服务器的时候使用。
RDB是Redis采用的默认持久化方式
AOF
持久化的实时性更好,因此已成为主流的持久化方案。通过appendonly参数开启。appendonly yes
开启后,每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof
在Redis的配置文件中存在三种不同的AOF持久化方式,它们分别是
appendfsync always #每次有数据修改发生时都会写入AOF文件,严重降低Redis的速度
appendsync everysec #每秒同步一次,显示地将多个写命令同步到硬盘
appendfsync no #让操作系统决定合适进行同步
推荐appendsync everysec方法,性能几乎不影响,最差丢失1秒钟的数据
Redis4.0对于持久化机制的优化
支持AOF RDB混合持久化。默认关闭需手动开启。
AOF重写的时候就直接把RDB的内容写到AOF文件开头。这样做可以快速加载同时避免丢失过多的数据。缺点是AOF里面的RDB部分时压缩格式不再是AOF格式,可读性较差。
补充:AOF重写
重写可以产生一个新的AOF文件,这个新文件和原文件所保存的数据库状态一样,但体积更小。
该功能是通过读取数据库中的键值对来实现的,无需对原文件进行任何读入、分析或写入操作。
重写过程:在执行BGREWRITEAOF命令时,Redis服务器会维护一个AOF重写缓冲区,该缓冲区会在子进程创建新AOF文件期间,记录服务器执行的所有写命令。当子进程创建完成,缓冲区所有内容被追加到新文件末尾,使新旧两文件保存的数据库状态一致。最后,服务器用新文件替换旧文件,以此完成重写。
Redis分布式锁实现原理
每个客户端对某个方法加锁时,在zookeeper上的与该方法对应的指定节点的目录下,生成一个唯一的瞬时有序节点。判断是否获取锁的方式很简单,只需要判断有序节点中序号最小的一个。当释放锁的时候,只需将这个瞬时节点删除即可。同时,其可以避免服务宕机导致的锁无法释放,而产生的死锁问题。完成业务流程后,删除对应的子节点释放锁。
(使用Redission框架)
Rlock lock = redisson.getLock("mylock");
lock.lock();
lock.unlock();
加锁机制:给一台机器加锁,需要一段lua脚本。锁的名字,锁的默认生存时间,和加锁客户端的ID。使用exists判断,如果你要加锁的那个锁不存在,就可以添加。返回一串hash,客户端ID和加锁次数。
锁互斥机制:客户端2尝试加锁,发现锁已存在,得到锁的剩余生存时间,然后进入while循环,不停的尝试加锁。
watch dog自动延期机制:watch dog是一个后台线程,每隔十秒检查一次,如果客户端还持有锁,则不断延长锁的生存时间
可重入锁加锁机制:发现锁已存在,但是ID一致,就会增加锁的个数。
释放锁机制:释放锁一次,锁的次数就会减减一次,直到为0则删除锁
分布式锁的缺点:在redis master实例宕机可能导致多个客户端同时完成加锁