Redis是一个开源的key-value存储系统。Redis的应用场景为配合关系型数据库做高速缓存,降低数据库IO。Redis的五种基本类型:String(字符串),list(链表),set(集合),zset(有序集合),hash,stream(Redis5.0后的新数据结构)需要注意的是,Redis是单线程的,如果一次批量处理命令过多,会造成Redis阻塞或网络拥塞(传输数据量大)。

在redis中默认是有16个数据库,可以在redis配置文件中看到。可以通过修改redis的配置文件来修改redis中数据库的数量。redis中数据库都是通过序号进行标识的。

默认是使用0号数据库,可以通过select “编号” 切换redis数据库。

string 是Redis的最基本的数据类型,可以理解为与 Memcached 一模一样的类型,一个key 对应一个 value。string 类型是二进制安全的,意思是 Redis 的 string 可以包含任何数据,比如图片或者序列化的对象,一个 redis 中字符串 value 最多可以是 512M。

Incr:可以给key中的value值加1,如果key不存在则先初始化为0后再加1

Decr:可以给key中的value值减1,如果key不存在则先初始化为0后再减1

Incrby:可以给key中的value值加指定的值,如果key不存在则先初始化为0后再加指定的值

由于Redis单线程的特点,我们不用考虑并发造成计数不准的问题,通过 incrby 命令,我们可以正确的得到我们想要的结果。

比如登录次数校验,错误超过三次5分钟内就不让登录了,使用setex每次登录设置key自增一次,并设置该key的过期时间为5分钟后,每次登录检查一下该key的值来进行限制登录。

list 列表,它是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边),它的底层实际上是个链表。

利用集合的交并集特性,比如在社交领域,我们可以很方便的求出多个用户的共同好友,共同感兴趣的领域等。

zset(sorted set 有序集合),和上面的set 数据类型一样,也是 string 类型元素的集合,但是它是有序的。

和set数据结构一样,zset也可以用于社交领域的相关业务,并且还可以利用zset 的有序特性,还可以做类似排行榜的业务。

redis stream主要用于消息队列(MQ,Message Queue),Redis本身是有一个Redis发布订阅(pub/sub)来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis宕机等,消息就会被丢弃。

Jedis对redis常用数据类型的一些操作(Jedis对于redis中数据类型操作方法同直接在redis中对数据类型操作的方法是一样的)

主从复制是主机(master以写为主),会自动同步备份数据到从机(slaver以读为主)的机制。

如果从机数量过多的化会出现复制延迟,这是由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

主机(端口6379可以写也可以读)而从机(端口6380和6381不可以写,只能读)

如果从机挂掉了,那么再次启动从机,则从机又单独变为了主机。把它作为从机重新加到原来的主机后,它会将主机的数据全部复制过来(包括在它挂掉的时候主机新增的数据)主从同步

当然如果主机挂掉了,从机的主机还是原来的那个,是不会变的。从机也不会自动升级为主机。除非设置了哨兵模式。

以上这种方式叫做一主多仆,一个主机会把写入它的数据备份到多个从机中去。但是如果从机数量太多的话,会给主机备份数据到从机带来很大压力。

一主多仆的方式会给主机带来很大的压力,因此在集群中会采用多主多仆分级备份的方式,即依次会在主机的从机中选部分从机作为其他从机的主机。主机把数据备份到部分升级为“主机”的“从机”,这样那些升级为“主机”的“从机”会继续完成数据备份到其他从机的工作。给主机减轻压力,并起到去中心化降低风险的作用。

哨兵模式会自动监测主机是否故障,如果主机故障,则会根据首先根据优先级,如果优先级相同则根据偏移量或者runid选择相应的从机作为主机。

注意!!!如果在启动过程中出现如下报错,表示端口被占用,需杀掉占用该端口的相应进程。

注:如果此时6379又重新启动了,在哨兵模式下6379还是会作为6380的从机,除非6380挂掉了,6379才有可能竞争成为主机!

当主机挂掉后,哨兵会在其余从机中根据优先级选择新的主机,优先级的配置在redis.conf中。

Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。

Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

这里搭建6个集群,共用一个服务器,但是是不同的端口:6379、6380、6381、6389、6390、6391。

cluster-node-timeout 15000 #设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换

注意:在合成前一定要确保6个启动的redis服务器实例都有生成node.conf配置文件。

redis中集群的分配为尽量保证每个主服务器处于不同的ip上,而每个主服务器所对应的从服务器则和主服务器不在同一个ip上,这样是为了保证如果某台主服务器挂了,那么其从服务器不受其影响,可以接管主服务器的工作。

1、在redis集群中录入一个值(每次录入都会为不同的key分配一个不同的插槽)

2、在redis集群中以组的形式录入(如果是同一组的key-value则共享同一个插槽)

缓存穿透就是指在短时间大量的请求服务器,但所请求的key在redis中不存在查不到,同时redis的命中率降低导致一些在redis中存在的也都查不到了。既然在redis中查不到就会去查数据库了。短时间大量访问数据库使数据库压力过大有可能造成数据库奔溃。

对空值缓存:如果一个查询返回的数据为空(不管数据是真的没有还是说只是没有命中到。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注