redis简介:
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
---------------------------------------------------------------------------------------------------------------
Redis 优势:
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
---------------------------------------------------------------------------------------------------------------
redis数据持久化:
有两种持久化方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。
RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
两种持久化的优缺点:
RDB:单独线程执行,有极高的性能,对主线程没影响。如果进行大规模的数据回复,比AOF高效。
AOF:只能追加不修改。AOF会越来越大,需要重写aof文件。回复速度比较慢。
官方建议同时使用。
---------------------------------------------------------------------------------------------------------------
redis各种数据类型的特点:
1、Stirng类型,value存放的是字符串信息;
2、Hash类型,hash类型比较适合存储对象;
3、List类型,存放的是字符串列表,按照插入顺序排序;
4、Set类型,存放的是字符串类型的无序集合,意味着集合中的数据不能重复;
5、Sorted Set类型,存放的是字符串类型集合,不允许出现重复的数据,不同之处是每个元素都关联一个double类型的分数,redis就是通过这个分数进行从小到大排序,集合的元素唯一,但分数可以重复,分数重复则按字典顺序排序。
redis的作用:
1、缓存;2、消息队列;3、分布式锁;
---------------------------------------------------------------------------------------------------------------
一、关于使用redis实现session共享的几个问题。
1、session使用哪种数据类型?
首先要明白http协议,http是一种无状态的请求协议,当客户端发送一个http请求到服务端时,服务端会创建一个session会话,并且返回一个sessionID给客户端,客户端将sessionID保存到cookie中,之后的每个请求都需要带有这个sessionID去访问服务端,服务端就是根据客户端传过来的sessionID来判断会话是否存在。
如果应用是一个单机系统架构,不需要考虑session共享问题。当系统是分布式架构时,就需要考虑了。
在项目中,我们使用redis字符串类型的数据结构,将sessionID保存到redis中,客户端的每次请求都先访问redis才能进入应用中。其实使用其他数据类型也可以,看项目的复杂程度,在我们项目中string类型已经够用了。也可以使用hash类型,将整一个session保存到redis中。
注意:这里是使用redis存储管理httpsession。
2、session超时怎办?
a、不处理,提醒用户重新登录;
b、每次获取session消息时,重新修改超时时间,这样做对redis的性能消耗比较大,不推荐使用;
c、客户端做判断,session超时后,偷偷发一个登录请求,重新登录;
3、redis实现session共享这一块功能应该放到整个系统架构的那个位置?
网关之前?网关之后?nginx之前?nginx之后?
4、redis实现session应该用单机还是集群?
当系统只有一个·redis服务时,当redis挂掉,会整个系统都不可用。因此最好的办法就是进行redis备份,目前普遍认为备份数应该是3,而且redis只支持主从备份。当主redis挂了,需要将从redis升级为主redis。这就是主动故障转移,redis sentinel带有这个功能。
还有既然做了集群,那个每个redis服务器应该有不同的IP,那么当主redis挂了之后,从redis升级为主redis,那要怎么将之前主redis的的IP转移到现在的主redis上呢?这就是IP漂移技术,redis sentinel可以设置。
大型网站,热点数据往往很大,有几十G上百G的可能,可以搭建分布式redis,多个redis实例协同工作。
5、要注意redis主要是用作缓存使用,不是当数据库使用
6、什么时候需要使用到redis持久化?
redis持久化数据的目的是为了防止redis挂掉后,redis保存的数据丢失,redis重启后可以恢复数据。我觉得还是看业务需要使用,当使用redis队列时,可以考虑使用持久化。
7、除了redis还有什么方式可以实现session共享?
a、将session放到cookie中,保存到客户端(去中心化),缺点是cookie可以被禁用,cookie的大小有限制;
b、将session信息保存到数据库中,每次请求要先访问数据库,对服务器压力大;
c、session复制,将session复制带其他节点上;