呃,啥是redis就不啰嗦了,一句话概括就是高性能key-value内存数据库。本文就对其进行简单的介绍。
大家都知道redis的value有多种类型,那么他的key可以有几种类型呢?其实redis可以使用任何二进制序列作为key值,比如说你可以把一张图片序列化后作为key放进redis(一般没人这么干),在项目里大部分情况下都是使用字符串作为key值,并且该字符串具有一定的标识作用。
接下来具体说一下redis value的数据类型,关于命令的使用,因为命令实在太多(记不住。。。),详细的可以去官网查看。
1.string类型
这个没啥说得了,就是最普通的类型了,其中有个比较重要的是命令是set,高版本的set命令通过指定参数实现了setex和setnx等命令的功能,并且是原子操作,在使用redis实现分布式锁时主要就是依靠该命令。
2.list类型
redis的list为双向链表,lrange命令范围查找,list有阻塞获取的命令并可以指定超时时间(因为redis是单线程的,阻塞获取会影响后续操作,所以一般不会使用)
3.hash类型
和普通的hash表没啥区别。。就不说了
4.set类型
类似于java set,无序集合。他可以获取集合的交集并集等操作。
5.zset类型
和set的区别就是他是有序的。。添加的时候需要添加分值项。比较常见的应用是利用时间作为分值做延时队列。
6.HyperLogLog类型
主要用来做基数统计,他只会计算添加进来元素的基数,而并不保存元素,所以不能通过它来获取元素。基数统计典型应用就是网站PV。
7.Geo类型
用来做地理位置的存储。
Redis的事务:
redis支持事务操作,MULTI命令用于开启一个事务,执行之后, 客户端可以继续向服务器发送任意多条命令, 这些命令不会立即被执行, 而是被放到一个队列中, 当EXEC命令被调用时, 所有队列中的命令才会被执行。需要注意的是,Redis的事务并不支持回滚操作,比如说执行过程中,一条命令操作失败,后续命令会正常执行并且失败的命令并不会回滚。
被WATCH命令操作的键会被监视,监视期间若有其他客户端对该键进行操作,则会返回错误。可以使用WATCH机制实现乐观锁,即直至没有其他客户端修改该键才进行命令的执行。
Redis的发布订阅:
主要通过SUBSCRIBE, UNSUBSCRIBE ,PUBLISH等几个命令实现,就是正常的发布与订阅模式。
Redis Lua脚本:
使用call等命令实现lua脚本的调用,Lua脚本在Redis中是原子执行的,执行过程中间不会插入其他命令,所以适用于将一部分操作聚合成原子操作。比如Redis分布式锁的解锁操作。
Redis的过期策略:
当redis中数据达到设置的内存最大值时,可以自动的根据设置的策略进行回收,有以下的策略,需要注意的是Redis的LRU策略并不是精确的。
1.报错。。当没有足够内存时添加报错(基本不会使用)
2.删除最近最少使用的键。
3.在具有过期时间属性的键中删除最近最少使用的键
4.随机删除
5.在具有过期属性的键中随机删除
6.在具有过期属性的键中删除生存时间最短的
Redis的复制:
利用Redis的复制功能,我们可以简单的实现Redis的主从复制。Redis的复制主要分为3种情况,第一种是当主从连接正常时,主会发送在其上执行的命令到从。第二种情况是当主从断线重连后,中间这段缺失的部分会通过偏移量和复制缓冲区来完成,断线后主会将命令写入复制缓冲区并更新偏移量,重新连接后,主将缓冲区内容发给从,从进行重放。当缓冲区满了的时候,就会进入第三种情况即全量的复制,过程是主开启后台进程生成RDB文件,同时缓冲收到的命令,然后主将RDB发送给从,从将其保存到磁盘再加载到内存中进行重放,主再将缓冲的命令发送给从。
Redis的持久化:
Redis支持俩种持久化方式
1.RDB快照:fork子进程,通过保存某一时间点内存快照实现,使用BGSAVE命令进行RDB的生成
2.AOF方式:fork子进程,将每一个写操作进行记录,并在服务器重启后进行重放。
下面具体说一下二者各自的优势与缺点:
RDB:适合用做备份,服务重启的速度比AOF快,使Redis的性能最大化。缺点是有可能会丢失一部分数据,并且当Redis中数据集很大时,fork()会非常的耗费性能,有可能导致客户端出现短暂的暂停服务。
AOF:有多种fsync策略(不进行sync,每秒sync,每次执行命令时sync,速度由快到慢),fync后台执行,不太影响Redis的性能,相比RDB丢失数据的可能性更小,当AOF日志文件过大时Redis会自动对其进行重写。缺点是他AOF文件比RDB文件更大。
一般推荐使用AOF模式,并将其fsync策略设为每秒。同时定期做RDB的备份。
Redis高可用-哨兵机制:
主要用来做故障切换,同时也具有监控等功能,哨兵默认使用的端口是26379。具体的哨兵模式部署请查阅官网。
Redis Cluster:
Redis集群具有在多个节点之间自动分割数据集并当某个节点发生故障继续提供服务的能力。Redis集群一共可以分为16384个槽,每个节点负责其中的一部分。具体部署请查阅官网。
作者:叫我田露就行
链接:https://www.jianshu.com/p/803a508752d3