简介
Redis在2008年由意大利公司Merzia创始人 Salvatore Sandfilippo为实时统计系统LLOOGG创建,使用C语言开发,目的是开发一种有MySql类似功能,但能显著提高的性能的数据库,同年开源,并与另一名代码贡献者Pieter Noordhuis一起为Redis开发,直到今天,最新版本为5.*。
Redis是 REmote DIctionary Server的缩写,即远程字典服务器。Redis默认端口为:6379,支持的数据类型有:
- 字符串
- 散列类型(键值也是一种字典结构,只是字段的值只能是字符串)
- 列表类型(有序,不唯一)
- 集合类型(无序,每个唯一)
- 有序集合类型(有序,每个唯一)
Redis性能
Redis是单线程模型,理论上讲比采用多线程模型的Memcached在性能上要差一些,但一般而言,Redis的性能以及足矣,两者之间的性能不应该成为两者的主要区别,而功能上的差异更应该成为使用时考虑的主要因素,考虑到两者的名气差异、功能差异,一般应优先选择Redis.
常用命令:
- get key
- set key value
- append
- exists key #存在返回1,不存在返回0
启动时指定特定端口方法:
redis-server --port 6380
redis-cli -h 192.168.0.1 -p 6380
Redis管道
在执行命令时,如果命令较多,如果一条一条执行,并在每一条执行后返回,则执行效率有些低,影响性能,在这种情况下,可以使用Redis的管道模式进行操作。通过管道可以一次性发送多条命令并在执行完成后一次性将结果返回,当一组命令中的每条命令都不依赖于之前的命令执行结果时,就可以将这组命令一起通过管道发出,管道通过减少客户端与Redis的通讯数量来实现提高Redis吞吐量的目的。
缓存穿透效应
缓存对于数据库来说,可以说是一道保护墙。一般情况情况下,当我们缓存一个key后,前端有关于这个key的查询时,我们就直接在缓存中查询并返回结果,但是,若我们查询的key永远不在缓存中时,那么相当于我们绕过了缓存这道墙,这道墙不起作用了,那么大量的查询会直达数据库,数据库的查询压力会剧增,这样一来,缓存就失去意义了,这就所谓的缓存穿透效应。
缓存穿透效应不能完全不免,只能尽量控制在一个合理的范围内,采用的技术手段有布隆过滤器。
缓存雪崩
缓存雪崩就是在某一个时刻,大量缓存同时失效而导致大量的请求直达数据库,造成数据库压力剧增甚至挂掉的情况。
缓存雪崩解决思路有:
1.提高缓存高可用,比如使用Redis集群,避免其中一台机器挂掉后,所有缓存丢失的情况发生。
2.缓存的失效时间尽量分散开,避免在同一个时间点,所有缓存失效。
3.对于热门缓存,可以使用定时更新的方式,刷新缓存数据,不使其失效。
4.服务限流和接口限流,避免大量数据查询超过数据库的处理能力。
Redis持久化
Redis持久化方式有两种:
其一:Redis根据配置的规则,定期将内存中的数据存储在硬盘上,这种方式称之为:RDB方式。
其二:Redis在执行完每一条命令后,将这个命令本身记录下来,供以后备用,这种方式称之为:AOF方式。
两种持久化方式既可以单独使用,又可以同时使用,一般而言,两种同时使用的情况较多。
Redis高可用
Redis在实际使用过程中,仅仅一台机器往往是不够的。这就需要部署Redis集群来实现高可用。部署Redis集群时,主库不需要做任何配置,只需要在从库中设置:redis-server --port **** --slaveof IP:port,即可。通过Info replication来查看集群机器之间的联系情况。在Redis集群中,住库是可以读写的,而从库只能读,不能写,主库与从库之间的同步工作通过异步方式实现,并且可以采用硬盘或者无硬盘复制形式,在从库向主库发送SYNC命令,主库接收到命令后,在后台生成内存文件,并异步发送至从库,如果是无硬盘形式,则会把数据发送至从库。
仅仅有Redis集群是不够的,还需要有哨兵这个监控工具,这个工具在Redis2.8中升级到了2.0版本,请使用此版本进行集群监控。哨兵可以监控集群中的每一个库,还可以相互监控。起作用有:
1.监控主库和从库是否正常运行
2.主库发生故障时,将从库转换为主库
目前,推荐使用的方式为:集群模式。该模式思想是去中心化,至少需要6个节点来实现。